外包公司做网站,dedecms导入网站模板下载,网站 类库,用自己照片做衣服_杯子的是哪个网站ThreadLocal允许为每个线程创建独立的变量副本#xff0c;使得同一个ThreadLocal对象在不同的线程中拥有不同的值。它的主要作用是在并发环境下提供线程隔离#xff0c;避免多个线程共享同一个变量#xff0c;从而减少线程间的相互干扰。 ThreadLocal的核心在于为每个线程维… ThreadLocal允许为每个线程创建独立的变量副本使得同一个ThreadLocal对象在不同的线程中拥有不同的值。它的主要作用是在并发环境下提供线程隔离避免多个线程共享同一个变量从而减少线程间的相互干扰。 ThreadLocal的核心在于为每个线程维护一个独立的数据副本它的实现主要依赖于每个线程维护一个ThreadLocalMap这是ThreadLocal专用的Map用来存储线程自己的变量。
1.1. ThreadLocalMap底层数据结构 ThreadLocalMap是一个定制化的Map其结构类似于HashMap都是以Key-Value的键值对形式进行存储其中Key存储的是ThreadLocal实例Value存储的是对应的对象默认为Object。相比于HashMap有一些不同之处
弱引用的键ThreadLocalMap的键即ThreadLocal对象使用了弱引用强引用软引用弱应用虚引用因此当没有其他地方引用该ThreadLocal对象时GC就会回收它。线性探测解决哈希冲突区别于HashMap中的链地址法解决哈希冲突ThreadLocalMap使用线性探测法来解决哈希冲突并且负载因子为2/3。潜在内存泄漏由于ThreadLocalMap中的键是弱引用但其存储的Value是强应用如果ThreadLocal对象被GC回收而没有调用remove方法清理值那么ThreadLocalMap中的值就有可能会一直存在导致内存泄漏。因此在不适用ThreadLocal后要及时的调用remove方法手动清除线程的副本变量。或者使用 try-finally 模式来保证在完成工作后调用 remove()。
1.2. 能否使用ThreadLocal往线程中存储多个副本变量 默认情况下ThreadLocal每个线程只能存储一个值因为它的设计初衷就是让每个线程独立的维护一组与ThreadLocal对象相关的值也就是说每个ThreadLocal实例只能存储一个值。 虽然 ThreadLocal 本身每个实例只能存储一个值但多个 ThreadLocal 实例在同一个线程中是存储在 ThreadLocalMap 里的。因此当一个线程中存在多个 ThreadLocal 实例时这些实例及其对应的值就会存储在该线程的 ThreadLocalMap 中。 那如果我们就是想让一个线程拥有多个副本变量该怎么办
法一使用ThreadLocal存储一个容器如Map或自定义对象 虽然每个ThreadLocal实例只能存储一个值但是其存储的是什么值是由我们决定的因此可以将想要存储的多个变量放入Map中以此实现存储多个独立的副本变量。
法二使用多个ThreadLocal对象
private static ThreadLocalString threadLocal1 new ThreadLocal();
private static ThreadLocalInteger threadLocal2 new ThreadLocal();
threadLocal1.set(Thread1);
threadLocal2.set(Thread2); 通过以上代码在每个线程的ThreadLocalMap中创建了两个ThreadLocal对象分别存储Thread1和Thread2因此可以通过不同的ThreadLocal实例对象来获取不同的值。