前言
在程序执行时,为了提高性能,编译器和处理器会对指令进行重排序。
为了明确定义多线程场景下重排序的问题(可见性、有序性、原子性),Java引入了JMM(Java Memory Model),也就是Java内存模型。JMM为JAVA程序员提供了8条规则,即happen-before原则。根据happen-before原则,就可以在不理解复杂的重排序规则情况下,解决因重排序而导致的多线程间可见性、有序性等问题。
happen-before原则
两个操作具有happen-before关系,并不意味着前一个操作比后一个操作先执行!happen-before仅要求前一个操作的执行结果对后一个操作可见。
可以将happen-before原则分两部分理解,单线程与多线程环境下的happen-before。单线程下通过语义分析数据依赖关系,编译器和处理器可以合理的优化我们的代码。但是多线程情况下不同线程间的数据依赖关系有我们定义,处理器与编译器都无法通过分析感知。
happen-before原则定义了某些特定场景下多线程间的数据依赖关系。即happen-before原则是对单线程环境下的指令重排序以及多线程环境下的线程间数据的一致性进行的约束。
对八条原则的理解来自:牛有肉:happen-