java主内存与工作内存之间的数据交互

本文详细阐述了Java内存模型如何定义变量访问规则,区分主内存(存储实例对象和共享数据)与工作内存(每个线程私有的副本),以及8种操作的原子性交互过程。强调了线程间数据同步的规则和一致性保障。

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。
此处的变量与java编程中所说的变量有所区别,它包括了实例字段、静态字段和构成数组对象的元素,但不包括局部变量和方法参数,后者是线程私有的,不会被共享。
java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝(只是线程访问到的字段可能存在拷贝,而不是拷贝整个对象),线程对变量的所有操作(读、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

1、主内存与工作内存的区别:
主内存:主要存储java实例对象,所有线程创建的实例对象都存放在主内存中,不管该实例对象是成员变量还是方法中的本地变量,也包括共享的类信息、常量、静态变量。由于是共享数据区域,多条线程对同一个变量进行访问可能会发生安全问题。
工作内存:每个线程只能访问自己的工作内存,即线程中的本地变量对其它线程是不可见,就算是两个线程执行的同一段代码,它们也会在自己的工作内存中创建属于当前线程的本地变量;由于工作内存是每个线程的私有数据,线程之间的工作内存无法相互访问,因此存储在工作内存的数据不存在线程安全问题。

2、内存间交互操作:
java内存模型中定义了8种操作来完成变量从主内存拷贝到工作内存,由虚拟机来实现每一种操作并保证原子性

1、主内存变量到工作内存到线程使用 Lock——>Read——>Load——>use——>线程使用
Lock(锁定): 作用于主内存的变量,它把一个变量标识为一条线程独占的状态
Read(读取): 作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用
Load(载入): 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
use(使用): 作用于工作内存的变量,use指令表示的是线程去加载工作内存的变量,从而进行变量操作

2、线程操作变量完成同步到工作内存到刷新到主内存过程: Assign——>Stroe——>Write——>Unlock
Assign(赋值): 作用于工作内存的变量,私有线程运行结束之后需要把运行完最新的数据重新赋值给工作内存变量
Store(存储): 作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的write操作使用
Write(写入): 作用于工作内存的变量,把store操作从工作内存中的一个变量的值传送到主内存的变量中
Unlock(解锁): 作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值