JMM(Java内存模型)通过提供一组规则,称为"happens-before"原则,来定义操作之间的顺序关系1。这些规则确保在并发环境下,对共享变量的读写操作能够按照一定的顺序进行,从而保证程序的正确性。
"happens-before"原则的设计意图是为了解决多线程并发访问共享变量时可能出现的可见性问题。下面是一些"happens-before"原则的规则:
程序顺序规则:一个线程中的每个操作都happens-before于该线程中的任意后续操作。
监视器锁规则:对一个锁的解锁操作happens-before于随后对这个锁的加锁操作。
volatile变量规则:对一个volatile字段的写操作happens-before于随后对这个字段的读操作。
传递性:如果操作A happens-before操作B,操作B happens-before操作C,那么操作A happens-before操作C。
线程启动规则:线程的start()方法happens-before于该线程的任意操作。
线程终止规则:线程的所有操作都happens-before于其他线程检测到该线程已经终止的操作。
中断规则:对线程interrupt()方法的调用happens-before于被中断线程的代码检测到中断事件的发生。
终结器规则:一个对象的构造函数的结束happens-before于该对象的finalize()方法的开始。
传递性规则:如果操作A happens-before操作B,操作B happens-before操作C,那么操作A happens-before操作C。
这些规则确保了在满足特定条件下,对共享变量的读写操作能够按照一定的顺序进行,从而保证了多线程程序的正确性和可见性。