ThreadLocal是多线程中对于解决线程安全的一个操作类,它会为每个线程都分配一个独立的线程副本从而解决了变量并发访问冲突的问题。ThreadLocal 同时实现了线程内的资源共享
ThreadLocal基本使用
三个主要方法:
- set(value) 设置值
- get() 获取值
- remove() 清除值
关于ThreadLocal-内存泄露问题
Java对象中的四种引用类型:强引用、软引用、弱引用、虚引用
强引用:最为普通的引用方式,表示一个对象处于有用且必须的状态,如果一个对象具有强引用,则GC并不会回收它。即便堆中内存不足了,宁可出现OOM,也不会对其进行回收
弱引用:表示一个对象处于可能有用且非必须的状态。在GC线程扫描内存区域时,一旦发现弱引用,就会回收到弱引用相关联的对象。对于弱引用的回收,无关内存区域是否足够,一旦发现则会被回收
每一个Thread维护一个ThreadLocalMap,在ThreadLocalMap中的Entry对象继承了WeakReference。其中key为使用弱引用的ThreadLocal实例,value为线程变量的副本
在使用ThreadLocal的时候,强烈建议:务必手动remove
Ps:
在Java中,引用(Reference)是用来在程序中访问对象的一种方式。Java中的引用可以分为四种类型:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。
强引用(Strong Reference):是最常见的引用类型,通过关键字"new"创建的对象默认就是强引用。只要强引用存在,垃圾回收器就不会回收被引用的对象。例如:
Object obj = new Object();
软引用(Soft Reference):软引用是一种相对强引用更加弱化的引用关系。当系统内存不足时,垃圾回收器会尝试回收软引用对象。在Java中,可以使用SoftReference类来创建软引用。例如:
SoftReference<Object> softRef = new SoftReference<>(new Object());
弱引用(Weak Reference):弱引用比软引用更弱,只有当对象被弱引用关联到时,垃圾回收器在下一次回收时就会回收该对象。在Java中,可以使用WeakReference类来创建弱引用。例如:
WeakReference<Object> weakRef = new WeakReference<>(new Object());
虚引用(Phantom Reference):虚引用是最弱的一种引用,无法通过虚引用访问对象。它的主要作用是在对象被垃圾回收时收到一个系统通知。在Java中,可以使用PhantomReference类来创建虚引用。例如:
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);
这些不同类型的引用有助于在特定场景下更灵活地管理对象的生命周期。软引用和弱引用通常用于缓存和内存敏感的应用,虚引用则可以用于跟踪对象被垃圾回收的状态。