ThreadLocal学习心得

1、ThreadLocal介绍:它是java.lang包下的类,T指的是泛型,类型取决于它成员方法中的占位符,ThreadLocal中有几个比较常用成员的方法

    (1)set(T value) :配合拦截器使用,在请求处理前进行一些操作,例如把前端页面登陆之后的id用ThreadLocal中的特殊的数据结构来存储线程的私有数据,称为 "ThreadLocalMap",每个线程拥有自己的 ThreadLocalMap,因此不同线程对同一个 ThreadLocal 对象的操作是相互独立的,互不干扰。

    (2)T get():用于获取当前线程中与 ThreadLocal 对象关联的值

    (3)remove:删除ThreadLocalMap所有的数据

2会有内存泄漏问题吗?怎么解?
   如果在使用ThreadLocal的过程中不注意释放资源,可能会导致内存泄漏的问题。这是因为 ThreadLocal 使用了一个特殊的数据结构 ThreadLocalMap 来存储每个线程的私有数据,而 ThreadLocalMap 是弱引用类型的键值对。

   当线程结束时,ThreadLocalMap 中与该线程关联的键值对并不会自动被清理,如果 ThreadLocal 对象没有手动删除或调用 remove 方法进行清理,那么对应的键值对就会一直存在于 ThreadLocalMap 中,这样就会导致内存泄漏。

为了避免 ThreadLocal 的内存泄漏问题,可以采取以下两种常用的解决方案:
   (1)及时清理:在使用完 ThreadLocal 后,应该手动调用 remove 方法将其与当前线程关联的键值对从 ThreadLocalMap 中移除。可以使用 ThreadLocal 的 remove 方法或者使用 try-finally 语句块来确保清理操作一定会执行。
   (2)使用 InheritableThreadLocal:InheritableThreadLocal 是 ThreadLocal 的一个子类,允许子线程继承父线程设置的 ThreadLocal 值。使用 InheritableThreadLocal 的好处是,可以避免在子线程中重新设置 ThreadLocal 值,从而减少了内存泄漏的风险。

补充:
   强引用(Strong Reference):强引用是最常见的引用类型,在代码中直接通过变量进行引用。只要存在强引用指向一个对象,垃圾回收器就不会回收该对象。即使内存不足时,系统也不会回收强引用对象。例如:
Object obj = new Object(); // obj为强引用

   软引用(Soft Reference):软引用用于描述一些还有用但非必需的对象。当内存不足时,垃圾回收器可能会回收软引用对象。可以利用软引用来实现内存敏感的高速缓存等场景。例如:
SoftReference softRef = new SoftReference<>(obj); // softRef为软引用

   弱引用(Weak Reference):弱引用的生命周期更短暂,当垃圾回收器运行时,无论内存是否充足,都会对弱引用对象进行回收。弱引用通常用于实现某种形式的缓存,当没有其他强引用指向对象时,弱引用会被自动回收。例如:
WeakReference weakRef = new WeakReference<>(obj); // weakRef为弱引用

   虚引用(Phantom Reference):虚引用是最弱的一种引用类型,几乎没有实际的实际应用场景。虚引用的主要作用是跟踪对象被垃圾回收器回收的过程。虚引用的get方法始终返回null,而且无法通过虚引用获取到对象,只能通过引用队列(ReferenceQueue)来判断对象是否被垃圾回收器回收。
PhantomReference phantomRef = new PhantomReference<>(obj, referenceQueue); // phantomRef为虚引用

你可能感兴趣的:(java)