happens-before

happens-before是用来解决内存可见性的。
hadppens-before产生的背景
JMM中每个线程都有本地内存空间,既然说是模型,当然实际上是没有的,它是cache和寄存器的作用的抽象。线程A修改的共享变量何时才能被线程B看到呢?此外,编译器重排序,处理器重排序都会优化指令的执行顺序,也就是说和程序编写的顺序不同,都会对并发编程中的内存可见性有影响。如何定义规则保证内存可加性
happens-before的内容是什么?

1) An unlock on a monitor happens-before every subsequent lock on that monitor.
2)A write to a volatile field happens-before every subsequent read of that volatile.

如果线程1解锁了monitor a,接着线程2锁定了a,那么,线程1解锁a之前的写操作都对线程2可见(注:线程1和线程2可以是同一个线程,也就是一个线程释放锁,后有获取锁)。
如果线程1写入了volatile变量v,接着线程2读取了v,那么,线程1写入v及之前的写操作都对线程2可见(线程1和线程2可以是同一个线程)。

All actions in a thread happen-before any other thread successfully returns from a join() on that thread.
Each action in a thread happens-before every subsequent action in that thread.

线程t1写入的所有变量,在任意其它线程t2调用t1.join()成功返回后,都对t2可见。
线程中上一个动作及之前的所有写操作在该线程执行下一个动作时对该线程可见(也就是说,大致都是这个样子的解释。

happens-before关系有个很重要的性质,就是传递性,即,如果
a happens-before b
b happens-before c

a hadppens-before c

as-if-serial语义保证单线程内程序的执行结果不被改变,happens-before关系保证正确同步的多线程程序的执行结果不被改变。
as-if-serial语义给编写单线程程序的程序员创造了一个幻境:单线程程序是按程序的顺序来执行的。happens-before关系给编写正确同步的多线程程序的程序员创造了一个幻境:正

确同步的多线程程序是按happens-before指定的顺序来执行的。
as-if-serial语义和happens-before这么做的目的,都是为了在不改变程序执行结果的前提下,尽可能地提高程序执行的并行度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值