JVM(PART XXIII)Java内存模型

20 篇文章 0 订阅

内存之间的交互操作

主内存和工作内存之间的具体交互协议,即一共变量如何从主内存拷贝到工作内存,如何从工作内存同步回到主内存的具体实现细节。java的内存模型一共定义了8中操作来完成。
虚拟机的实现必须保证这8种操作每一种都是原子的不可再分的(对于double,long类型的变量来说,load,store,read,write操作在某些平台上允许有例外)
这八种操作分别是:
lock,unlock,read,load,use,assign,store,write
作用于主内存的操作:lock,unlock,read,write
作用于工作内存的操作:load,use,assign,store

操作含义
lock(锁定)作用于主内存的变量,把一个变量标识为一条线程独占的状态
unlock(解锁)作用于主内存的变量,它把一个处在锁定状态的变量释放出来,释放之后才能被其他的线程锁定
read(读取)作用于主内存的变量,它把一个变量的值从主内存传输到线程工作的内存中,以便随后的load动作使用
load(载入)作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存变量副本中
use(使用)作用于工作内存中的变量,它把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量值得字节码指令时将会执行这个操作。
assgin(赋值)作用于工作内存中的变量,它把一个从执行引擎中接收到的值赋给工作内存中的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作
store(存储)作用于工作内存中的变量,它把工作内存中的一个变量传递到主内存中,以便随后的write操作使用
write(写入)作用于主内存中的变量,它把store操作从工作内存中得到的变量值放到主内存的变量中。

相关规则:

  • 不允许read和load,store和write操作之一单独出现,即不允许一个变量从主内存读取但是工作内存不接受,或者从工作内存发起写回但是主内存不接受的情况出现。
  • 不允许一个线程丢弃它最近的assigan操作,即变量在工作内存中改变了之后必须把该变化同步到回主内存。
  • 不允许一个线程无原因(没有发生过任何assign操作)把数据从线程的工作内存同步回到主内存中
  • 一个新的变量只能在主内存中诞生,不允许工作内存直接使用一个未被初始化(load或者assign)的变量,就是对一个变量实施use,store操作之前,必须先执行过了assign和load操作
  • 同一个变量在同一时刻只允许一条线程对其进行lock操作,但是lock操作可以同时被同一个线程重复执行多次,多次执行lock后,只有执行相同次数的unlock操作,变量才会被解锁。
  • 对一个变量执行lock操作,那将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或者assign操作初始化变量的值
  • 如果一个变量事先没有被lock操作锁定,那就不允许对它执行unlock操作,也不允许去unlock一个其他线程锁定住的变量。
  • 对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store,write)

原子性

原子操作是指,一个操作要么全部完成,要么完全不做。
由java内存模型来直接保证原子性的操作包括,read、load、assign、use、store和write,除了double和long有非原子协定之外,其他的基本数据类型的访问和读写都是具备原子性的。

可见性

可见性是指当一个线程修改了共享变量的值,其他的线程可以立即得知这个修改。
在java中有三个关键字可以保证变量的可见性:volatile,synchronized和final.

volatile
保证新的值可以立即同步到主内存:
在多线程中volatile关键字和变量在内存中的工作过程
http://blog.csdn.net/uncle_gy/article/details/78184431
synchronized
同步块的可见性是由“对一个变量执行unlock操作之前,必须先把此变量同步写回到主内存中(执行store,write操作)”,这条规则获得。
final
被final修饰的关键字在构造器中一旦完成初始化,并且构造器没有把“this”引用传递出去,那么在其他的线程中就可以看到final字段的值。

有序性

volatile和synchronized两个关键字来保证线程之间操作的有序性,volatile关键字本身就包含了禁止指令重新排序的语义,而synchronized则是由“一个变量在同一个时刻只允许一个线程对其进行lock操作”这条规则获得的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值