什么是happens-before
- Java5引入了明确定义的Java内存模型。其中最重要的一个概念就是happens-before关系。happens-before关系是用来描述两个操作的内存可见性的。如果操作X happens-before操作Y,那么X的操作结果对于Y是可见。
同一个线程中,字节码的先后顺序也暗含了happens-before关系
- 在程序控制流中靠前的字节码happens-before靠后的字节码。然而,这并不意味着前者一定在后者之前执行。实际上,如果后者没有观测前者的云心结果,即后者没有依赖于前者,那么他们可能会被重排序。
除了线程内的happens-before关系之外,Java内存模型还定义了下述线程间的happens-before关系
- 1、解锁操作happens-before之后(时钟顺序先后)对同一把的加锁操作。
- 2、volatile字段的写操作happens-before之后(时钟顺序先后)对同一个字段的读操作。
- 3、线程的启动操作(即thread.start())happens-before该线程的第一个操作。
- 4、线程的最后一个操作happens-before他的终止事件(即其他线程通过Thread.isAlive()或者Thread.join()判断该线程是否终止)
happens-before具有传递性
- 如果X happens-before Y,而操作Yhappens-before Z,那么Xhappens-before Z