ThreadLocal和volatile关键字的区别

566 阅读2分钟

最近在学习了ThreadLocal后,了解到它是在线程间做数据隔离的。这个时候我就想起了volatile保证变量的可见,一时间就有点混乱了,想着为什么数据又要隔离又要保证可见性,这是什么个鬼。后面重新梳理了下,我才正在理解两个东西的用法和使用场景。

首先ThreadLocal是为了实现数据隔离,避免多个线程对这一变量进行修改,导致当前线程set值后,想要拿用get刚刚的set的值,发现已经被修改了。也就是set的和get的不一致;

volatile第一要务是保证变量的可见性,也就是说,所有线程无论何时都是获取到该共享变量的最新值(如果不加不能保证一定获取变量的最新值)

关键点: ThreadLocal想让线程间对某个变量不相互干扰,隔离开来; volatile是为了保证线程间拿到的共享变量的最新值,也就是所有线程中的该共享变量的值都是一致的

我一开始没弄清在于多线程情况的变量的共享情况不熟悉,不加volatile的变量,它们也是会共享的,只是线程间不能实时同步,用volatile修饰后使的能够实时同步;

初学的时候因为一直看volatile的保证了可见性可见性,导致我以为只有被volatile修饰的变量才是线程共享,如果不加则是隔离(类似于threadlocal的功能),导致我在想为什么都是隔离的了还要使用ThreadLocal。

总结

1.不被volatile修饰的变量在多线程环境下也是共享的;

2.为了避免变量共享,通过threadlocal实现了数据隔离的作用

3.volatile保证的可见性是指所有线程获取到的共享变量都是最新值(可参考jmm模型了解具体过程)