volatile什么时候使用
2019-02-11 本文已影响422人
大黑跟小白的日常
volatile关键字
我们都知道volatile修饰的变量,保证了数据内存的可见性。
强迫每个线程在读取volatile修饰的变量值时,需要从主内存中读取。保证数据一经改变,其它线程立即感知。
具体什么情况下使用呢?
比如我们设置一个开关,在一个线程完成某件事情时,其他所有线程将不再继续执行新任务。
具体代码如下
不加volatile修饰时是这样的
测试结果
如上可以看出,虽然开关已经在main线程中关闭,但是,多线程任务中判断并没有停止,持续进行着f(),并没有看到 thread over 提示。一直没有等到。
加上volatile修饰测试如下
如上可以看到,在外部开关关闭的时候,多线程任务也随机终止了。如此可见volatile的用处了。
注意
如果在多线程任务中,调用同步方法,或某些native方法(如Thread.sleep),会刷新线程内存数据,多线程任务也会根据开关的新值,断开任务。
如下
volatile只能保证数据更新后的其他线程的时时可见性,并不能保证操作的原子性。
需要搞清除的是,什么时候,线程内存数据跟主内存数据进行交换、更新。