无论是轻量级的Atomic、volatile,还是synchronized,其实都是采用同步的方式解决了线程安全问题。还有另外一种解决线程安全问题的思路,线程封闭。
如果你有一个全局共享的变量,那么多线程并发的时候,对这个共享变量的访问是不安全的。方法内的局部变量是线程安全的,由于每个线程都会有自己的副本。也就是说局部变量被封闭在线程内部,其它线程无法访问(引用型有所区别)。那么有没有作用域介于两者之间,既能保证线程安全,又不至于只局限于方法内部的方式呢?
答案是肯定的,我们使用ThreadLocal就可以做到这一点。ThreadLocal变量的作用域是为线程,也就是说线程内跨方法共享。例如某个对象的方法A对threadLocal变量赋值,在同一个线程中的另外一个对象的方法B能够读取到该值。因为作用域为同一个线程,那么自然就是线程安全的。但是需要注意的是,如果threadLocal存储的是共享变量的引用,那么同样会有线程安全问题。
原文链接: https://alexhuihui.github.io/article/20220120.html
版权声明: 转载请注明出处.