title: java-threadlocal tags:
- work
- java-basic categories:
- java date: 2019-04-22 15:09:02
threadlocal的生命周期和ThreadLocalMap的生命周期
- ThreadLocal在线程中都创建了有且仅有一个副本ThreadLocal.ThreadLocalMap,每个线程只可以访问自己的ThreadLocalMap实例。
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);//return t.threadLocals;
if (map != null)//采用懒汉模式
map.set(this, value);
else
createMap(t, value);//t.threadLocals = new ThreadLocalMap(this, firstValue);
}
- ThreadLocal实例的作用是ThreadLocalMap的key,一个thread可以有多个threadlocal实例。
Thread.currentThread().threadLocals.size //可以查看当前的线程的threadlocal实例数量
- ThreadLocalMap实例的生命周期随着线程的结束而结束,因为ThreadLocalMap实例的唯一引用只存在当前线程中。ThreadLocal的生命周期,需要gc来决定,因为他的引用可能存在于多个线程中,此引用为弱引用。
- 弱引用的存在,导致可能内存泄露。当threadlocal=null,没有任何强引用实例指向threadLocals中的key本来指向的threadlocal实例,gc回收threadlocal,导致val永远不会被释放。采用以下代码来取代=null的操作。
ThreadLocal local1 = new ThreadLocal();
local.remove();
ThreadLocal的作用
- 对于那些需要数据隔离,可以用ThreadLocal。
- 对于一个线程中的一个ThreadLocal只能存一个T类型的数据。(T为泛型)
- ThreadLocal是线程安全的,所以可以用来封装线程不安全的实例,不同线程之间新创建实例,保证线程安全。(另一种模式就是单例模式。)