内存区域
happends-before
网上有很多写的不太准确的博客,说happends-before是“先于什么什么执行”,真正的理解应该是“xx对xx可见”的意思,即使有happends-before的关系,仍然无法保证执行的顺序,所以并发情况下,还需要一些锁或者Auto变量来保证执行顺序。
程序次序法则:线程中的每个动作A都happends-before于该线程中的每一个动作B,其中,在程序中,所有的动作B都出现在动作A之后。
监视器锁法则:对一个监视器锁的解锁happens-before于每一个后续对同一个监视器锁的加锁。
volatile变量法则:对volatile域的写入操作happends-before于每一个后续对同一域的读操作。
线程启动法则:在一个线程里,对Thread.start的调用会happends-before于每一个启动线程中的动作。
线程终结法则:线程中的任何动作都happends-before于其他线程检测到这个线程已经终结,或者从Thread.join 调用中成功返回,或者Thread.isAlive返回false.
中断法则:一个线程调用另一个线程的interrupt.happens-before于被中断的线程发现中断。(通过跑出interruptedException,或者调用isInterrupted和interrupted).
终结法则:一个对象的构造函数的结束happends-before于这个对象finalizer的开始。
传递性:如果A happens-before于B, 且B happends-before 于C, 则A happens-before 于C。
网友评论