19 指令重排和happen-before关系

1 java如何保证原子性,可见性

原子性

java中有规范

  • 对基本数据类型的变量的读取和赋值是保证了原子性的,要么都成功,要么都失败,这些操作是不可被中断的
    假设在一个线程中对i赋值10(i=10),首先时会把cache中i变为10,然后会刷会主内存中

eg:

  • a=10 —> 原子性的
  • b=a —> 不是原子性的,分为两步,每一步是原子性,合起来就不是原子性的
    • read a
    • assign b
  • c++ —> 不是原子性的,分了三步
    • read c
    • add
    • assign to c

可见性

使用关键字volatile,会保证这个变量更改之后会立即刷回主存,使这个变量在缓存中失效,每个线程都会去
主存中读取这个变量

有序性(happen-before关系)

java允许编译器,对指令进行重排序,只要保证最终结果一致性即可,在单线程这是没有问题的。

2 happen-before关系

  1. 单线程的下代码的执行顺序:编写在前面的发生在编写在后面的
  2. unlock必须发送在lock之后
  3. 关键字volatile修饰的变量,对一个变量的写操作先于该变量的读操作。
  4. 传递规则:操作A先于操作B,操作B先于操作C,那么A肯定先于C
  5. 线程的启动规则:start方法肯定先于线程执行的操作
  6. 线程的中断规则:线程的interrupt动作,必须发生在捕获该动作之前
  7. 对象的销毁规则:一个对象的初始化必须发生在销毁之前
  8. 线程的终结规则:对线程的所有操作必须发生在线程死亡之前
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值