内存间交互操作 与 针对long和double型变量的特殊规则 与 原子性 可见性 有序性

14 篇文章 0 订阅

内存间交互操作

java内存中定义了以下八种操作实现一个变量从主内存拷贝到工作内存 从工作内存同步回主内存

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

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

read (读取):作用于主内存的变量,它把一个变 量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。

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

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

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

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

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

针对long和double型变量的特殊规则

java内存模型要求上面八种操作都具有原子性 但是对于long和double(64位的数据类型) 允许虚拟机将其读写操作划分为两次32位的 操作来进行

原子性 可见性 有序性

原子性
把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性
由java内存模型来直接保证的原子性变量操作包括read load assign use store write这六个 基本数据类型的访问 读写都是具备原子性的

可见性当一个线程修改了共享变量的值时 其他线程能够立即得知这个修改
volatile synchronized final都可以实现可见性
同步块的可见性是由“对一个变量执行unlock操作之前 必须先把此变量同步回主内存中(执行store write)”这个规则获得的
final关键字的可见性是指被final修饰的字段在构造器中一旦被初始化完成 并且构造器没有把“this”的引用传递出去 那么其他线程中就可以看见final字段的值

有序性
如果在线程内观察 所有的操作都是有序的 如果在一个线程中观察另一个线程 所有的操作都是无序的
java语言提供了 volatile 和 synchronized两个关键字来保证线程之间操作的有序性 volatile关键字本身就包含了禁止指令重排序的语义 而synchronized关键字由“一个变量在同一时刻只允许一条线程对其进行lock操作”这条规则获得 决定了持有同一个锁的两个同步块只能串行进入

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值