您现在的位置是:群英 > 开发技术 > 编程语言
Java中volatile的作用是什么,怎样使用?
Admin发表于 2022-01-21 17:36:091026 次浏览

    这篇文章我们来了解Java中volatile关键字的作用,volatile关键字的作用有三点,分别是保证可见性、保证有序性和提供double check。下文有很详细的介绍,有需要的朋友可以参考,接下来就跟随小编来一起学习一下吧!

        本教程操作环境:windows7系统、java10版,DELL G3电脑,该方法适用于所有品牌电脑。

        java中volatile的作用:

        1、可见性:Java提供了volatile关键字来保证可见性。

  当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。

  而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。

  另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。

        先看一段代码,假如线程1先执行,线程2后执行:

//线程1
boolean stop = false;
while(!stop){
doSomething();
}
//线程2
stop = true;

  这段代码是很典型的一段代码,很多人在中断线程时可能都会采用这种标记办法。但是事实上,这段代码会完全运行正确么?即一定会将线程中断么?不一定,也许在大多数时候,这个代码能够把线程中断,但是也有可能会导致无法中断线程(虽然这个可能性很小,但是只要一旦发生这种情况就会造成死循环了)。

  下面解释一下这段代码为何有可能导致无法中断线程。在前面已经解释过,每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。

  那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。

  但是用volatile修饰之后就变得不一样了:

  第一:使用volatile关键字会强制将修改的值立即写入主存;

  第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);

  第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。

  那么在线程2修改stop值时(当然这里包括2个操作,修改线程2工作内存中的值,然后将修改后的值写入内存),会使得线程1的工作内存中缓存变量stop的缓存行无效,然后线程1读取时,发现自己的缓存行无效,它会等待缓存行对应的主存地址被更新之后,然后去对应的主存读取最新的值。

  那么线程1读取到的就是最新的正确的值。

        2、保证有序性

volatile boolean inited = false;
//线程1:
context = loadContext(); 
inited = true; 
//线程2:
while(!inited ){
sleep()
}
doSomethingwithconfig(context);

        确保context已经初始化完成。

        3、double check

class Singleton{
private volatile static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if(instance==null) {
synchronized (Singleton.class) {
if(instance==null)
instance = new Singleton();
}
}
return instance;
}
}

    关于Java中volatile关键字的作用就介绍到这,上述示例具有一定的借鉴价值,感兴趣的朋友可以参考,希望能对大家有帮助,想要了解更多volatile关键字的内容,大家可以关注群英网络其它的相关文章。

文本转载自PHP中文网

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-07-14 17:09:20 
摘要:PHP支持MySQL;MySQL是与PHP搭配使用最多的数据库,它们常被称为“黄金组合”。PHP中提供了完整的操作MySQL数据库的函数,这些函数包括了从连接数据库、执行SQL语句、处理数据结果集到关闭数据库的方方面面;通过这些函数,使基于MySQL数据库的Web开发高效而简单。
2022-02-07 18:19:20 
摘要:这篇文章给大家分享的是Junit框架及其使用的内容。对大家学习和理解Junit框架有帮助,因此分享给大家做个参考,文中的介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
2022-01-04 18:54:15 
摘要:C语言中怎样判断两个字符串是不是回文序列?如果如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。这篇就给大家来分享怎样判断输入的两个字符串是不是回文序列,这里使用的方法是用顺序栈实现,输入可能比较浪费空间但是代码会简单一点,对新手了解回文序列有一定的参考价值,那么接下来就跟随小编一起来看看吧。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部