多线程JUC 第2季 ThreadLocal的详解

一 ThreadLock的作用

1.1 threadlocal的作用

1.threadlock 是线程局部变量(线程各自一份),每一个线程访问threadlock修饰的变量,都会自己复制一份变量副本,然后进行操作,线程之间的操作会不干扰。

threadlocal并不是解决线程间共享数据的问题。threadlocal使用变量在线程间隔离且在方法间共享的场景。

threadlocal通过隐式的在不同线程内创建独立的实例副本,避免了实例线程安全的问题。

每个线程持有一个只属于自己的Map,并维护了ThreadLocal对象与具体实例的映射,该map由于只被持有它的线程访问,故不存在线程安全以及锁的问题。

概述:逐鹿群雄起分争,人手一份天下安。

使用原则: 1.初始化时设置默认值: threadlocal.withInitial(()-> return  xxx);

                   2.建议把threadlocal修饰成static

                  3.使用结束后,进行remove方法调用,清理回收

注意:在使用线程池场景下,自定义的threadlocal变量使用完后,在finally中调用remove方法进行清理回收。

1.2 threadlocal和thread和threadlocalmap之间的关系

1.thread可以看做是一个自然人;

2.threadlocal 可以看做是身份证卡片

3.threadlocalmap是由threadlocal组成的key,任意entry作为值封装的map集合。

1.3 threadlocal的内存泄漏

1.ThreadLocalMap的Entry对ThreadLocal的引用为弱引用,避免了ThreadLocal对象无法被回收的问题。

2.ThreadLocal都会通过expungeStaleEntry,cleanSomeSlots,replaceStaleEntry这3个方法回收键为null的entry对象的值,以及entry对象本身。从而防止内存泄漏。

1.4 threadlocal的强、弱、软、虚引用

二 ThreadLock的案例实操

你可能感兴趣的:(高并发多线程,java,jvm,开发语言)