面试题——ThreadLocal

1.ThreadLocal是什么?

每个线程内部都有一个由ThreadLocal维护的ThreadLocalMap,它类似于HashMap。在ThreadLocalMap中,会初始化一个大小为16的Entry数组,用来保存每一个key-value键值对,其中key是一个弱引用,也是ThreadLocal对象本身,而 value 存的是线程变量的值。当创建一个ThreadLocal变量时,每个访问它的线程都会复制这个变量到自己的本地内存,当多个线程操作这个变量时,实际操作的是自己本地内存里的变量,从而避免了线程安全问题。由于ThreadLocalMap的key是弱引用,而Value是强引用,这就导致在发生GC时弱引用Key被回收,而Value不会被回收,此时如果创建ThreadLocal的线程一直持续运行,那么value就可能一直得不到回收,从而发生内存泄露。避免这个问题的方法是调用remove方法删除Entry对象。

2.ThreadLocal的应用场景

ThreadLocal适用于独立变量副本的情况,如果变量为全局共享的,则不适用了。一个典型的应用场景是数据库连接管理,每个线程访问数据库都应当是一个独立的Session会话,如果多个线程共享同一个Session会话,有可能出现其他线程关闭连接了,而当前线程再执行提交时出现会话已关闭的异常。如果采取ThreadLocal的方式能避免线程争抢Session,提高并发下的安全性。

你可能感兴趣的:(并发多线程入门)