当前位置:   article > 正文

volatile关键字和原理及并发编程的三大特性:原子性,可见性,有序性_java/c/c++中volatile关键字可以保证并发编程中的哪些特性

java/c/c++中volatile关键字可以保证并发编程中的哪些特性

http://www.importnew.com/24082.html

首先了解一下并发编程的一些内容:

介绍线程之间读取数据的流程

原子性

 可见性:

 

有序性:

开始介绍volatile关键字的作用:

但是!!

 

 volatile(应用场景)和synchronized关键字的区别:(volatile修饰变量,synchronize修饰方法或者一个代码块)

 

 

为啥使用了synchronized还需要volatile?

synchronized通过排他锁的方式就保证了同一时间内,被synchronized修饰的代码确保是单线程执行的,这就满足了as-if-serial在单线程中一定是含有序性。但是因为只能保证有序性,不能保证指令重排序,需要用volatile来保证

 上面三点的缩写

用双重判空(DCL):第一重判空:因为 synchronize是消耗性能较严重的操作,所以先判空看看到底要不要同步;

中间加锁: 存在有几个线程同时运行到这,为了安全需要上锁,阻塞某些线程

第二重判空: 就是很常见的,如果为空就需要实例化,不为空就返回这个已经实例化对象;

 原理

 2.有序性

 从JVM底层来讲,volatile和9条happen-before原则都有一个叫“内存屏障”的东西保证线程实行的顺序,否则可能会出现重排序情况造成执行顺序错乱;

内存屏障作用:1.确保指令重排序时不会将后面的指令放在屏障之前的位置,也不会将前面的指令放在屏障后面执行;2.将修改的值刷新到主内存而非工作内存中(可见性)

具体插入的内存屏障

在每个volatile写操作的前面插入一个StoreStore屏障。在每个volatile写操作的后面插入一个StoreLoad屏障。

在每个volatile读操作的后面插入一个LoadLoad屏障。在每个volatile读操作的后面插入一个LoadStore屏障。

9条happen-before原则举例:

1.数据依赖原则: A 发生在B之后 ,B发生在C之后,A一定发生在C之后;

2.volatile原则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读..等等

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/article/detail/44936
推荐阅读
相关标签
  

闽ICP备14008679号