Java语言在设计之初就引入了线程的概念,以充分利用现代处理器的计算能力,这即带来了强大、灵活的多线程机制,也带来了线程安全等令人混淆的问题,而java内存模型(Java Memory Model,JMM)为我们提供了一个在纷乱之中达成一致的指导性准则。
Happen-before关系,是java内存模型中保证多线程操作可见性的机制,也是堆早期语言规范中含糊的可见性概念的一个精确定义。
它的具体表现形式,包括但远不止是我们直觉中的synchronized、volatile、lock操作顺序等方面,例如:
线程内执行的每个操作,都保证happen-before后面的操作,这就保证了基本的程序顺序规则,这是开发者在书写程序时的基本约定。
对于volatile变量,对它的写操作,保证happen-before在随后对该变量的读取操作;
对于一个锁的解锁操作,保证happen-before加锁操作;
对象构建完成,保证happen-before于finalizer的开始动作;
甚至是类似线程内部操作的完成,保证happen-before其他Thread.join()的线程等。
这些happen-before关系时存在着传递性的,如果满足 a happen-before b 和 b happen-before c,那么a happen-before c 也成立。
网友评论