Volatile关键字实现原理

1、认识volatile关键字

程序举例

用一个线程读数据,一个线程改数据

存在数据的不一致性

2、机器硬件CPU与JMM

(1)CPU Cache模

(2)CPU缓存的一致性问题

解决方案:

1)总线加锁(粒度太大)

2)MESI()

  1. 读操作:不做任何事情,把Cache中的数据读到寄存器
  2. 写操作:发出信号通知其他的CPU讲改变量的Cache line置为无效,其他的CPU要访问这个变量的时候,只能从内存中获取。

Cache line  CPU的cache中会增加很多的Cache line

(3)Java内存模型

1)         主存中的数据所有线程都可以访问(共享数据)

2)         每个线程都有自己的工作空间,(本地内存)(私有数据)

3)         工作空间数据:局部变量、内存的副本

4)         线程不能直接修改内存中的数据,只能读到工作空间来修改,修改完成后刷新到内存

3、Volatile关键字的语义分析

volatile作用:让其他线程能够马上感知到某一线程多某个变量的修改

(1)保证可见性

对共享变量的修改,其他的线程马上能感知到

不能保证原子性  读、写、(i++)

(2)保证有序性

重排序(编译阶段、指令优化阶段)

输入程序的代码顺序并不是实际执行的顺序

重排序后对单线程没有影响,对多线程有影响

Volatile

Happens-before

volatile规则:

对于volatile修饰的变量:

(1)volatile之前的代码不能调整到他的后面

(2)volatile之后的代码不能调整到他的前面(as if seria)

(3)霸道(位置不变化)

Int i=0;

Int a=3;

Int b=5;

Volatile Int j=3;

Int i=0;

Int a=3;

Int b=5;

Int m=i+j;

I++;

J++;

(3)volatile的原理和实现机制(锁、轻量级)

HSDIS   --反编译---汇编

Java --class---JVM---》ASM文件

Volatile  int  a ;

Lock :a

4、Volatile的使用场景

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

public class ShutDowsnDemmo extends Thread{
private volatile boolean started=false; @Override
public void run() {
while(started){
dowork();
}
}
public void shutdown(){
started=false;
}
}

  

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

DCL(7)

public class Singleton {

    private volatile static Singleton instance;

    public static Singleton getInstance(){

        if(instance==null){

            synchronized (Singleton.class){

                instance=new Singleton();

            }

        }

        return instance;

    }

}

  

(3)需要利用顺序性

5、volatile与synchronized的区别

(1)使用上的区别

Volatile只能修饰变量,synchronized只能修饰方法和语句块

(2)对原子性的保证

synchronized可以保证原子性,Volatile不能保证原子性

(3)对可见性的保证

都可以保证可见性,但实现原理不同

Volatile对变量加了lock,synchronized使用monitorEnter和monitorexit  monitor  JVM

(4)对有序性的保证

Volatile能保证有序,synchronized可以保证有序性,但是代价(重量级)并发退化到串行

(5)其他

synchronized引起阻塞

Volatile不会引起阻塞

小程序:

并发3-Volatile的更多相关文章

  1. Java 并发 关键字volatile

    Java 并发 关键字volatile @author ixenos volatile只是保证了共享变量的可见性,不保证同步操作的原子性 同步块 和 volatile 关键字机制 synchroniz ...

  2. 6.并发编程--volatile

    并发编程--volatile volatile-说明 volatile关键字的作用是变量在多个线程可见: volatile 关键字是非原子性的 要是实现原子性操作,建议使用atomic类的系列对象:支 ...

  3. Java并发关键字Volatile 详解

    Java并发关键字Volatile 详解 问题引出: 1.Volatile是什么? 2.Volatile有哪些特性? 3.Volatile每个特性的底层实现原理是什么? 相关内容补充: 缓存一致性协议 ...

  4. Java高并发同步Volatile的使用

    引言: 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”. 可见性的意思 ...

  5. Java并发编程 Volatile关键字解析

    volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...

  6. java并发:volatile关键字

    java并发需要保证原子性,可见性,有序性. http://www.cnblogs.com/expiator/p/9226775.html 一.volatile关键字作用如下: 1.volatile关 ...

  7. Java 并发编程——volatile与synchronized

    一.Java并发基础 多线程的优点 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 这一点可能对于做客户端开发的更加清楚,一般的UI操作都需要开启一个子线程去完成某个任务,否者会容易导致客户 ...

  8. 【Java】高并发同步Volatile的使用

    引言: 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的Synchronized,它在多处理器开发中保证了共享变量的“可见性”. 可见性的意思 ...

  9. Java 并发:volatile 关键字解析

    摘要: 在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保 ...

  10. Java并发基础--volatile关键字

    一.java内存模型 1.java内存模型 程序运行过程中的临时数据是存放在主存(物理内存)中,但是现代计算机CPU的运算能力和速度非常的高效,从内存中读取和写入数据的速度跟不上CPU的处理速度,在这 ...

随机推荐

  1. Coursera Algorithms Programming Assignment 3: Pattern Recognition (100分)

    题目原文详见http://coursera.cs.princeton.edu/algs4/assignments/collinear.html 程序的主要目的是寻找n个points中的line seg ...

  2. Codeforces Round #355 (Div. 2) B. Vanya and Food Processor

    菜菜菜!!!这么撒比的模拟题,听厂长在一边比比比了半天,自己想一想,然后纯模拟一下,中间过程检测一下,妥妥的就可以过. 题意:有N个东西要去搞碎,每个东西有一个高度,然后有一台机器支持里面可以达到的最 ...

  3. 第十六篇 .NET高级技术之序列化

    .net framework的类库中提供了三个可以用于序列化和反序列化的类,分别为BinaryFormatter.SoapFormatter和XmlSerializer. BinaryFormatte ...

  4. pip查看安装包的可安装版本

    不需要下载或者安装任何其他软件包,你可以指定一个高得离谱的版本号( 不可能有实际安装候选),并且可用的版本将被打印: pip install scrapy==122222 得到信息后指定版本就好了 p ...

  5. jmeter远程运行GUI多用户负载

    1.在Jmeter控制机的bin目录下找到jmeter.properties文件并修改”remote_hosts”,增加负载机IP,多个IP使用英文逗号隔开,修改后要重启Jmeter.如下图: 2.添 ...

  6. excel导入phpmyadmin

    1.将excel文件另存为txt文件,再将txt文件保存为.csv文件同时修改编码为UTF8 2.登录phpmyadmin,在phpmyadmin中创建好表格,按excel中的顺序创建每列 3.因为p ...

  7. [JLOI2008]将军

    Description 刘先生最近在学习国际象棋,使用一个叫"jloi-08"的游戏软件.在这个游戏里,不但可以和电脑普通地对弈,还可以学习著名的棋局,还有针对初学者的规则指导等丰 ...

  8. 转 python 将一个文件中内容添加到另一个文件指定位置

    http://blog.csdn.net/huguangshanse00/article/details/14624601

  9. windows clone 迁移数据库

    windows clone 迁移数据库可行.(c 盘底成复制)

  10. Linux下cpu过高问题排查

    原文地址:https://blog.csdn.net/chenjunan888/article/details/80447800 在服务器报cpu过高时,可使用以下命令,快速导出堆栈信息,以方便查看具 ...