java内存模型(netty权威指南),Java并发编程之三:volatile关键字解析 转载

1、Java内存模型

  Java虚拟机规范中试图定义一种java内存模型(java Memory Model,jmm)来屏蔽掉各种操作系统、虚拟机实现厂商和硬件的内存访问差异,以确保Java程序在所有操作系统和平台上能够实现一次编写、到处运行的效果。

1.1、工作内存和主内存

  Java内存模型规定了所有的变量都存储在主内存中。每个线程还有自己的工作内存,它保存了被该线程使用到的变量的主内存副本拷贝。线程对这些变量的操作都在自己的工作内存中进行,不能直接操作主内存和其他工作内存中存储的变量或者变量副本。线程间的变量访问需通过主内存来完成,三者关系如下:

《java内存模型(netty权威指南),Java并发编程之三:volatile关键字解析 转载》

 

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。

1.2、java内存交互协议

关于主内存与工作内存之间具体的交互协议,java内存模型中定义了以下8种操作来完成,虚拟机实现时必须保证下面提及的每一种操作都是原子的、不可再分的。

1、Lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。

2、unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其它线程锁定

3、read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存变量副本中

4、load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中

5、use(使用):作用于工作内存的变量,它把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作

6、assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作

7、store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中以便随后的write操作使用

8、write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中

如果要把一个变量从主内存复制到工作内存,那就要顺序地执行read和load操作,如果把变量从工作内存同步回主内存,就要顺序地执行store和write操作。Java内存模型只要求上述两个操作必须按顺序执行,而没有保证连续执行。

2、对于volatile型变量的特殊规则

当一个变量定义为volatile之后,它将具备两种特性,第一是保证此变量对所有线程的可见性,这里的可见性是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内存来完成。

由于volatile变量只能保证可见性,在不符合以下两条规则的运算场景中,我们仍然要通过加锁来保证原子性。

1、运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值

2、变量不需要与其他的状态变量共同参与不变约束

使用volatile变量的第二个语义是禁止指令重排序优化,普通的变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获得正确的结果,而不能保证变量的赋值操作的顺序与程序代码中的执行顺序一致。

 见《
Java并发编程之三:volatile关键字解析 转载

    原文作者:java内存模型
    原文地址: http://www.cnblogs.com/duanxz/p/3724117.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞