编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Jave中volatile关键字的第二个功能你知道吗?

wxchong 2024-09-02 03:34:30 开源技术 10 ℃ 0 评论

一:可见性

java的内存模型如上图所示

当一个变量被volatile修饰时,保证了这个变量对所有Java线程的可见性。

(1)可见性指什么

指一个线程修改了变量的值后,新的值对其它的Java线程都是可以立即得知的。

(2)如何做的

  • 在各个Java线程中volatile变量可以存在不一致的情况。
  • 但是每次读操作都要先刷新,从主内存中获取最新的值。
  • 每个Java线程写操作后会立即刷新到主内存,非volatile变量不会立即刷新到主内存。

(3)volatile并不能保证线程安全性

二:禁止指令重排序

(1)示例

volatile boolean initialized = false;

A线程:

  1. 初始化操作(和initialized没有关系)
  2. initialized = true;

B线程:

while(!initialized) {

sleep();

}

doSomeThings();

(2)分析

如果initialized没有被volatile修饰,那么由于指令重排序,A线程中的第二步可能在第一步前先执行。

这样B线程认为初始化已经完成,可能会导致一些问题。

三:什么时候使用

(1)多个线程需要同时访问来保持可见性

(2)指令重排序可以优化代码,而volatile避免了指令重排序,会导致效率降低。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表