简单了解java volatile关键字实现的原理

 更新时间:2019年08月15日 09:31:37   作者:yongan  
这篇文章主要介绍了简单了解volatile关键字实现的原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、volatile关键字的语义分析

1.保证可见性

对共享变量的修改,其他线程能够马上感知到。但不能保证原子性(i++)

2.保证有序性

3.volatile的原理和实现机制

有volatile修饰的共享变量进行写操作的时候会多出有 “lock”标志的汇编代码,Lock前缀的指令在多核处理器下会引发两件事情:

1)将当前处理器缓存行中的数据写回到系统内存中

2)这个写回内存的操作会使在其他cpu里缓存了该内存地址的数据无效。

二、volatile的使用场景

1.状态标志(开关模式)  

package com.roy.http;
public class ShutDownDemmo extends Thread{
  private volatile boolean state = false;
  @Override
  public void run() {
    while(state){
      System.out.println("我在做工作");
    }
  }
  public void shutDown(){
    state = false;
  }  
}

当调用shutDown方法时,里面只有一个赋值操作,所以它是原子性的,同时state字段是volatile的,所以当值发生变化时其它线程会立即察觉到。

2.双重检查锁定(double-checked-locking)

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

单例模式中使用双重检查锁定。

三、volatile和synchronized的区别

1.使用上的区别

volatile只能修饰变量,而synchronized只能修饰方法和语句块。

2.对原子性的保证

volatile不能保证原子性,synchronized保证了原子性。

3.对可见性的保证

两者都能保证可见性,但实现原理不同

volatile对变量添加了lock,synchronized使用monitorenter和monitorexit。

4.对有序性的保证

volatile能保证有序,synchronized也能保证有序,但是代价大

5.其他

synchronized会引起阻塞,volatile不会引起阻塞。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springboot结合maven配置不同环境的profile方式

    springboot结合maven配置不同环境的profile方式

    这篇文章主要介绍了springboot结合maven配置不同环境的profile方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Springboot事务失效的原因及解决办法详解

    Springboot事务失效的原因及解决办法详解

    这篇文章主要介绍了Springboot事务失效的原因及解决办法详解,spring中的事务是依赖AOP的,AOP是通过动态代理实现的,只有通过代理类访问的方法才能被拦截,而addMultiFile直接内部调用了addFile方法,所以addFile中的事务就不会生效
    2023-10-10
  • springboot切面添加日志功能实例详解

    springboot切面添加日志功能实例详解

    在本篇文章里小编给大家整理的是关于springboot 切面添加日志功能的相关知识点内容,有需要的朋友们可以参考下。
    2019-09-09
  • 使用HttpSessionListener监听器实战

    使用HttpSessionListener监听器实战

    这篇文章主要介绍了使用HttpSessionListener监听器实战,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Spring boot Rabbitmq消息防丢失实践

    Spring boot Rabbitmq消息防丢失实践

    这篇文章主要介绍了Spring boot Rabbitmq消息防丢失实践,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • ThreadLocal的内存泄露问题

    ThreadLocal的内存泄露问题

    这篇文章主要介绍了Java中ThreadLocal的内存泄露问题,以及为什么会出现内存泄漏,感兴趣的小伙伴可以参考阅读
    2023-03-03
  • Springmvc如何实现向前台传递数据

    Springmvc如何实现向前台传递数据

    这篇文章主要介绍了Springmvc如何实现向前台传递数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java的Channel通道之FileChannel类详解

    Java的Channel通道之FileChannel类详解

    这篇文章主要介绍了Java的Channel通道之FileChannel类详解,FileChannel类是Java NIO中的一个重要类,用于在文件中进行读写操作,它提供了一种高效的方式来处理大文件和随机访问文件的需求,需要的朋友可以参考下
    2023-10-10
  • 浅谈Sharding-JDBC强制路由案例实战

    浅谈Sharding-JDBC强制路由案例实战

    本文主要介绍了浅谈Sharding-JDBC强制路由案例实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • SpringMVC如何把后台文件打印到前台

    SpringMVC如何把后台文件打印到前台

    这篇文章主要介绍了SpringMVC如何把后台文件打印到前台,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论