JAVA多线程Android开发积累

volatile什么时候使用

2019-02-11  本文已影响422人  大黑跟小白的日常

volatile关键字

我们都知道volatile修饰的变量,保证了数据内存的可见性。

强迫每个线程在读取volatile修饰的变量值时,需要从主内存中读取。保证数据一经改变,其它线程立即感知。

具体什么情况下使用呢?

比如我们设置一个开关,在一个线程完成某件事情时,其他所有线程将不再继续执行新任务。

具体代码如下

不加volatile修饰时是这样的

测试结果

如上可以看出,虽然开关已经在main线程中关闭,但是,多线程任务中判断并没有停止,持续进行着f(),并没有看到 thread over 提示。一直没有等到。

加上volatile修饰测试如下

如上可以看到,在外部开关关闭的时候,多线程任务也随机终止了。如此可见volatile的用处了。


注意

如果在多线程任务中,调用同步方法,或某些native方法(如Thread.sleep),会刷新线程内存数据,多线程任务也会根据开关的新值,断开任务。

如下

volatile只能保证数据更新后的其他线程的时时可见性,并不能保证操作的原子性。

需要搞清除的是,什么时候,线程内存数据跟主内存数据进行交换、更新。

上一篇下一篇

猜你喜欢

热点阅读