Happens-Before 原则
内容纲要
什么是Happens-Before
- happens-before规则是用来解决可见性问题的:在时间上,动作A发生在动作B之前,B保证能看见A ,这就是happens-before。
- 两个操作可以用happens-before来确定它们的执行顺序:如果一个操作happens-before于另一个 操作,那么我们说第一个操作对于第二个操作是可见的。
什么不是Happens-Before
- 两个线程没有相互配合的机制,所以代码X和Y的执行结果并不能保证总被对方看到的,这就不具备happens-before.
Happens-Before规则有哪些?
- 单线程规则(发生重排序了之后,后面的语句依然能看到前面的语句)
- 锁操作( synchronized和Lock )
一个线程对方法进行加锁,当解锁后,另外一个方法一定能够看到之前加锁的所有操作 - volatile变量
- 线程启动
- 线程join
- 传递性:如果hb(A, B)而且hb(B, C) ,那么可以推出hb(A, C)
- 中断:个线程被其他线程interrupt时,那么检测中断( isInterrupted )或者抛出InterruptedException-定能看到。
- 构造方法:对象构造方法的最后一行指令happens-before于finalize()方法的第一-行指令
- 工具类的Happens- Before原则
- 线程安全的容器get-定能看到在此之前的put等存入动作
- CountDownLatch
- Semaphore
- Future
- 线程池
- CyclicBarrier
近朱者赤:给b加了volatile ,不仅b被影响,也可以实现轻量级同步
b之前的写入(对应代码b = a )对读取b后的代码( print b )都可见,
所以在writerThread里对a的赋值,一定会对readerThread里的读取可见,所以这里的a即使不加volatile,只要b读到是3,就可以由happens- before原则保证了读取到的都是3而不可能读取到1。
共有 0 条评论