码迷,mamicode.com
首页 > 其他好文 > 详细

Volatile关键字实现原理

时间:2020-01-29 21:42:42      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:shu   monitor   check   ati   编译   作用   turn   调整   while   

1、认识volatile关键字

       volatile是java提供的一种同步手段,只不过它是轻量级的同步,为什么这么说,因为volatile只能保证多线程的内存可见性,不能保证多线程的执行有序性。而最彻底的同步要保证有序性和可见性,例如synchronized。任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存。因此对于volatile修饰的变量的修改,所有线程马上就能看到,但是volatile不能保证对变量的修改是有序的。

程序的局部执行原理

技术图片

 

 

Java内存模型

jvm将内存组织为主内存和工作内存两个部分。
       主内存主要包括本地方法区和堆。每个线程都有一个工作内存,工作内存中主要包括两部分,一个是属于该线程私有的栈,另一个是对主存部分变量拷贝的寄存器(包括程序计数器PC和cpu工作的高速缓存区)

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

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

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

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

 

技术图片

 

 技术图片

 

 

Volatile关键字的语义分析

   

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

(1)保证可见性

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

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

(2)保证有序性

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

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

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

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

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)

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

  

(3)需要利用顺序性

volatilesynchronized的区别

(1)使用上的区别

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

(2)对原子性的保证

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

(3)对可见性的保证

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

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

(4)对有序性的保证

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

(5)其他

synchronized引起阻塞

Volatile不会引起阻塞

 

Volatile关键字实现原理

标签:shu   monitor   check   ati   编译   作用   turn   调整   while   

原文地址:https://www.cnblogs.com/grow001/p/12241355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!