Java使用volatile关键字的注意事项

 更新时间:2017年02月13日 16:17:30   投稿:mrr  
volatile关键字是Java中的一种稍弱的同步机制,为什么称之为弱机制。这篇文章主要介绍了Java使用volatile关键字的注意事项,需要的朋友可以参考下

 Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式。

volatile关键字是Java中的一种稍弱的同步机制,为什么称之为弱机制。

 在理解这个之前,我们先来看看java在进行同步时必须遵守的两个机制:

 1、可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。

 2、原子性:指不可分割,此处指程序执行过程中,某操作不能中断,则为原子操作。

 volatile关键字不能保证原子性,只能保证可见性,故在一般情况下不能使用该关键字进行同步操作。但是当满足以下两个特定条件时,可以使用其进行同步:

 1、运算结果并不依赖变量的当前值,或者能够保证只有单一的线程修改变量的值。

 2、变量不需要与其他的状态变量共同参与不变约束

例:

volatile boolrean flag;
public void close(){
    flag = true;
}
public void open(){
   while(!flag){
    ...
   }
}

 此时open()方法的执行依赖flag的值,必须使用同步,但是使用synchronized关键字或者其他方法同步比较繁琐,此时该情景符合以上两个条件,故可以使用volatile关键字进行同步。

volatile关键字原理:

  被volatile修饰的变量,不会被缓存在寄存器或者其他地方,每次写直接写去主内存,读也是从主内存读取。所以可以保证可见性。

以上所述是小编给大家介绍的Java使用volatile关键字的注意事项,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • java三层架构原理与作用小结

    java三层架构原理与作用小结

    这篇文章主要对Java三层架构的概念、作用等进行了介绍,需要的朋友可以参考下
    2017-04-04
  • Springboot允许logger.debug输出日志方式

    Springboot允许logger.debug输出日志方式

    这篇文章主要介绍了Springboot允许logger.debug输出日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 深入了解JAVA数据类型与运算符

    深入了解JAVA数据类型与运算符

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2021-07-07
  • java替换url的域名和端口方法

    java替换url的域名和端口方法

    下面小编就为大家带来一篇java替换url的域名和端口方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能

    springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能

    这篇文章主要介绍了springboot +mybatis 使用PageHelper实现分页并带条件模糊查询功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 每日六道java新手入门面试题,通往自由的道路第二天

    每日六道java新手入门面试题,通往自由的道路第二天

    这篇文章主要为大家分享了最有价值的6道java面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,对hashCode方法的设计、垃圾收集的堆和代进行剖析,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • java打印指定年月的日历

    java打印指定年月的日历

    这篇文章主要为大家详细介绍了Java如何打印指定年月的日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • java网络通信技术之简单聊天小程序

    java网络通信技术之简单聊天小程序

    这篇文章主要为大家详细介绍了java网络通信技术之简单聊天小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • httpclient重定向之后获取网址信息示例

    httpclient重定向之后获取网址信息示例

    使用HttpClient进行127.0.0.1:8080地址的问题,然后该地址自动重定向127.0.0.1:8080/mobserver,如何获取该地址呢?使用HttpContext,下面是示例
    2014-02-02
  • Java String类常用方法梳理总结

    Java String类常用方法梳理总结

    这篇文章主要介绍了Java String类常用方法梳理总结,类 String 中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,更多相关内容需要的朋友可以参考一下
    2022-06-06

最新评论