java 多线程之ThreadLocal
ThreadLocal类 为每个线程提供一个独立的变量副本
如上,问:线程里的变量本来就是线程私有的。还需要有变量副本吗?
答:我们知道线程私有的变量一般都是局部变量。是每个线程私有的。
而局部变量是有局限性的,只能在方法内部使用,如果另一个方法想要直接获得这个局部变量是不可能的。
所以有了ThreadLocal 类的set()存储这个局部值。然后另一个方法通过ThreadLocal 类get()方法获得这个值。
下图是通过拦截器实现对方法执行时间的监控。

原理:
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?
其实实现的思路很简单:在ThreadLocal类中定义了一个ThreadLocalMap,每一个Thread中都有一个该类型的变量——threadLocals——用于存储每一个线程的变量副本,
Map中元素的键为线程对象,而值对应线程的变量副本。
场景说明
另一种使用场景:在Java的多线程编程中,为保证多个线程对共享变量的安全访问,通常会使用synchronized来保证同一时刻只有一个线程对共享变量进行操作。
这种情况下可以将类变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。
结论:
ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。

浙公网安备 33010602011771号