定义:ThreadLocal叫做线程变量,该变量对其他线程而言是隔离的,是当前线程独有的变量。ThreadLocal为变量在每一个线程中都创建了一个副本,并且该副本只能当前Thread使用,因此不存在多线程共享的问题。
原理:Thread类有一个类型ThreadLocalMap的实例变量ThreadLocals,每个线程都有一个属于自己的ThreadLocalMap;ThreadLocalMap内部维护着Entry数组代表一个完整对象。key是ThreadLocal对象,value是线程变量的副本。每个线程在往ThreadLocal设置值的时候,都往ThreadLocalMap里存储;读取时以某个ThreadLocal作为引用,在map中找到对应的key,从而实现线程隔离。ThreadLocal本身不存储值,它只是作为一个key来让线程往ThreadLocalMap里存取值。
ThreadLocal和synchronized区别:synchronized用于线程间的数据共享,ThreadLocal用于线程间的数据隔离。synchronized是利用锁机制实现,使变量或者代码块只能被一个线程访问;ThreadLocal为每个线程提供一个变量副本,使得每个线程在某一时间访问到的并不是同一个对象。
ThreadLocal内存泄露问题:由于ThreadLocalMap中使用的key是ThreadLocal的弱引用,弱引用是只要垃圾回收机制一运行,不管内存是否充足,都会被垃圾回收器回收。但是ThreadLocalMap生命周期和Thread一样,因此会造成ThreadLocalMap的key没有了,但是value还存在,就会造成内存泄露问题。解决方案:使用完ThreadLocal后,及时调用remove方法释放内存空间。
标签:副本,Java,变量,ThreadLocalMap,笔记,ThreadLocal,线程,key From: https://blog.csdn.net/m0_73363779/article/details/140357966