Java 内存交互操作

Java 内存将交互操作

java 的内存操作一共定义了八种操作来完成,虚拟机实现时必须保证每一种操作都是原子的、不可再分的(对于 double、long 类型来说,load、store、read、write操作在某些平台是允许的)。

在这里插入图片描述

  • lock:作用于主内存的变量,它把有个变量表示为一个线程独占的状态
  • unlock:作用于主内存的变量,它把一个锁定状态的变量解锁,解锁之后的变量才可以被其他变量锁定
  • read:作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存当中
  • load:作用于工作内存的变量,它把 load 操作从主内存中得到的变量的值放入工作内存的变量副本当中
  • use:作用于工作内存的变量,它把工作内存中的变量传递给执行引擎,每当虚拟机需要使用一个变量的值时就会只执行这个操作
  • assign:作用于工作内存的变量,它把从执行引擎接收到的值赋给工作内存中的变量,每当虚拟机遇到一个给变量赋值的字节码是执行操作
  • store:作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便 write 使用
  • write:作用于主内存的变量,它把 store 操作从工作内存中得到的变量的值放到主内存的变量中

执行以上步骤需满足以下规则

  • 不允许 read 和 load、store 和 write 操作之一单独出现,即:不允许一个变量从主内存中读取但是工作内存不接受,或者从工作内存发起会写了但是主内存不接受的情况出现
  • 不允许一个线程丢失了它的最近的 assign 操作,即:变量在工作内存中改变了之后必须把该变量同步到主内存当中
  • 不允许一个线程无原因(没有发生过任何 assign 操作)把数据从线程的工作内存同步回主内存
  • 一个新的变量只能在主内存中诞生(初始化)不允许在工作内存中直接使用一个未被初始化(load 或 assign)的变量,即:就是对一个变量实施 use、store 操作之前,必须先执行 assign 和 load 操作
  • 一个变量在同一个时刻只允许一个 lock 对其操作,但是 lock 操作可以被一个线程多次执行。执行多次 lock 之后只有执行相同的 unlock 变量才可以被其他线程使用
  • 如果对一个变量执行 lock 操作,那将会清空工作内存中此变量的值,在执行引擎使用这个变量之前,需要重新执行 load 或 assign 操作进行初始化
  • 如果一个变量实现没有被执行 lock 操作,那么无法执行 unlock 操作
  • 对一个变量执行 unlock 操作之前必须先把此变量同步到主内存当中(store、write 操作)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值