java-threadlocal的理解

211 阅读1分钟

title: java-threadlocal tags:

  • work
  • java-basic categories:
  • java date: 2019-04-22 15:09:02

threadlocal的生命周期和ThreadLocalMap的生命周期

  1. 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);
}
  1. ThreadLocal实例的作用是ThreadLocalMap的key,一个thread可以有多个threadlocal实例。
Thread.currentThread().threadLocals.size //可以查看当前的线程的threadlocal实例数量
  1. ThreadLocalMap实例的生命周期随着线程的结束而结束,因为ThreadLocalMap实例的唯一引用只存在当前线程中。ThreadLocal的生命周期,需要gc来决定,因为他的引用可能存在于多个线程中,此引用为弱引用。
  2. 弱引用的存在,导致可能内存泄露。当threadlocal=null,没有任何强引用实例指向threadLocals中的key本来指向的threadlocal实例,gc回收threadlocal,导致val永远不会被释放。采用以下代码来取代=null的操作。
ThreadLocal local1 = new ThreadLocal();
local.remove();

ThreadLocal的作用

  1. 对于那些需要数据隔离,可以用ThreadLocal。
  2. 对于一个线程中的一个ThreadLocal只能存一个T类型的数据。(T为泛型)
  3. ThreadLocal是线程安全的,所以可以用来封装线程不安全的实例,不同线程之间新创建实例,保证线程安全。(另一种模式就是单例模式。)