Happens-Before 原则

内容纲要

什么是Happens-Before

  • happens-before规则是用来解决可见性问题的:在时间上,动作A发生在动作B之前,B保证能看见A ,这就是happens-before。
  • 两个操作可以用happens-before来确定它们的执行顺序:如果一个操作happens-before于另一个 操作,那么我们说第一个操作对于第二个操作是可见的。

什么不是Happens-Before

  • 两个线程没有相互配合的机制,所以代码X和Y的执行结果并不能保证总被对方看到的,这就不具备happens-before.

Happens-Before规则有哪些?

  1. 单线程规则(发生重排序了之后,后面的语句依然能看到前面的语句)
  2. 锁操作( synchronized和Lock )


    一个线程对方法进行加锁,当解锁后,另外一个方法一定能够看到之前加锁的所有操作
  3. volatile变量
  4. 线程启动
  5. 线程join
  6. 传递性:如果hb(A, B)而且hb(B, C) ,那么可以推出hb(A, C)
  7. 中断:个线程被其他线程interrupt时,那么检测中断( isInterrupted )或者抛出InterruptedException-定能看到。
  8. 构造方法:对象构造方法的最后一行指令happens-before于finalize()方法的第一-行指令
  9. 工具类的Happens- Before原则
    1. 线程安全的容器get-定能看到在此之前的put等存入动作
    2. CountDownLatch
    3. Semaphore
    4. Future
    5. 线程池
    6. CyclicBarrier

近朱者赤:给b加了volatile ,不仅b被影响,也可以实现轻量级同步

b之前的写入(对应代码b = a )对读取b后的代码( print b )都可见,
所以在writerThread里对a的赋值,一定会对readerThread里的读取可见,所以这里的a即使不加volatile,只要b读到是3,就可以由happens- before原则保证了读取到的都是3而不可能读取到1。

THE END
分享
二维码
< <上一篇
下一篇>>