Java并发编程之关键字volatile知识总结

 更新时间:2021年06月08日 14:31:55   作者:菜鸟日常  
今天带大家学习java的相关知识,文章围绕着Java关键字volatile展开,文中有非常详细的知识总结,需要的朋友可以参考下

一、作用

被 volatile 修饰的变量

1.保证了不同线程对该变量操作的内存可见性

2.禁止指令重排序

二、可见性

在这里插入图片描述

Java 内存模型(Java Memory Model) 是 Java 虚拟机定义的一种规范,即每个线程都有自己的工作空间,线程对变量的操作都在线程的工作内存中完成,再同步到主存中,这样可能会导致不同的线程对共享变量的操作,在各自线程工作空间内不一样的问题。

而用 volatile 修饰的变量,线程对该变量的修改,会立刻刷新到主存,其它线程读取该变量时,会重新去主存读取新值。

三、有序性

CPU 为了提供程序的运行效率,会对代码的执行顺序进行重排,因此代码中各个语句的先后执行顺序有可能会变化,但是它会保证程序最终执行结果与代码顺序执行结果一致。

指令重排序会考虑数据之间的依赖性,不会影响单个线程内程序的执行结果

c = 2 可能在 a = 1之前执行

int a = 1;
int c = 2;

volatile 修饰的变量具有有序性,即被 volatile 修饰的变量,在其前面的操作与在其后面的操作的执行顺序不能打乱。

int a= 1;
volatile b = 2;
int c = 2;

a = 1 一定在 c = 2 前面执行,volatile 的作用好像在两者之间插入了一个内存屏障

对于 volatile 的有序性应用,一般常用 double-check 的单例模式来说明

public class Singleton {
	private Singleton(){}

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

singleton = new Singleton(); 分为 3 步

1.new Singleton() 开辟堆内存空间

2.初始化 singleton 对象

3.将 singleton 对象指向堆内存地址

第 3 步可能在第 2 步之前执行,那么其它线程可能得到为初始化完成的 singleton 对象,造成异常。

四、happens-before

  • 程序顺序规则: 一个线程中的每个操作,happens-before于该线程中的任意后续操作
  • 监视器锁规则:对一个线程的解锁,happens-before 于随后对这个线程的加锁
  • volatile 变量规则: 对一个 volatile 域的写,happens-before 于后续对这个 volatile 域的读
  • 传递性:如果 A happens-before B ,且 B happens-before C, 那么 A happens-before C
  • start()规则: 如果线程A执行操作ThreadB_start()(启动线程B) , 那么A线程的ThreadB_start()happens-before 于B中的任意操作
  • join()原则: 如果A执行ThreadB.join()并且成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。
  • interrupt()原则: 对线程interrupt()方法的调用先行发生于被中断线程代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测是否有中断发生
  • finalize()原则:一个对象的初始化完成先行发生于它的finalize()方法的开始

五、与 Synchronized 对比

1.volatile 只能作用于变量,synchronized 可以作用于变量,方法,代码块

2.volatile 不保证原子性,synchronized 可以保证

3.访问 volatile 修饰的变量不会阻塞,synchronized 可能会

到此这篇关于Java并发编程之关键字volatile知识总结的文章就介绍到这了,更多相关Java关键字volatile内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springmvc无法访问/WEB-INF/views下的jsp的解决方法

    springmvc无法访问/WEB-INF/views下的jsp的解决方法

    本篇文章主要介绍了springmvc无法访问/WEB-INF/views下的jsp的解决方法,非常具有实用价值,需要的朋友可以参考下
    2017-10-10
  • Java C++题解leetcode886可能的二分法并查集染色法

    Java C++题解leetcode886可能的二分法并查集染色法

    这篇文章主要为大家介绍了Java C++题解leetcode886可能的二分法并查集染色法实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • java文件下载代码实例(单文件下载和多文件打包下载)

    java文件下载代码实例(单文件下载和多文件打包下载)

    这篇文章主要介绍了java文件下载代码实例(单文件下载和多文件打包下载),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java如何实现上传文件到服务器指定目录

    Java如何实现上传文件到服务器指定目录

    这篇文章主要介绍了Java如何实现上传文件到服务器指定目录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java8如何根据某一属性条件快速筛选list中的集合

    java8如何根据某一属性条件快速筛选list中的集合

    这篇文章主要介绍了java8如何根据某一属性条件快速筛选list中的集合,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • idea在plugins中搜不到插件的解决方法

    idea在plugins中搜不到插件的解决方法

    本文主要介绍了idea在plugins中搜不到插件的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • jar包加密方案分享

    jar包加密方案分享

    如何对jar包进行加密呢?其实没有想象中的那么困难,有一款开源工具已经提供了较为完善的加密方案,这款开源工具的名字叫做xjar。接下来我们就看一下使用xjar工具给jar包加密有多么的容易。
    2021-06-06
  • JavaWeb评论功能实现步骤以及代码实例

    JavaWeb评论功能实现步骤以及代码实例

    项目初始版本上线,有时间写点东西记录一下项目中的心得体会,通过这个项目学习了很多,要写下来的有很多,先从评论功能开始吧,下面这篇文章主要给大家介绍了关于JavaWeb评论功能实现步骤以及代码的相关资料,需要的朋友可以参考下
    2023-01-01
  • java中staticclass静态类详解

    java中staticclass静态类详解

    这篇文章主要介绍了java中staticclass静态类详解,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • java分形绘制科赫雪花曲线(科赫曲线)代码分享

    java分形绘制科赫雪花曲线(科赫曲线)代码分享

    部分与整体以某种形式相似的形,称为分形,科赫曲线是一种外形像雪花的几何曲线,所以又称为雪花曲线,它是分形曲线中的一种,画法如下
    2013-12-12

最新评论