JMM对于同步规则的定义:
- 对volatile变量v的写入,与所有其他线程后续对v的读同步
- 对监视器m的解锁,与所有后续操作对于m的加锁同步
理解:后续的加锁操作内容,能够看到解锁前的线程对于共享变量的修改。 - 对每个属性写入默认值(0,false,null),与每个线程对其进行的操作同步
理解:一个线程创建了有默认值的对象,后面其他线程可能读不到这个对象设置的默认值,但一定会读到初始值,而不会读到乱码。 - 启动线程的操作与线程中的第一个操作同步
理解:类似于说明第一个操作与创建在堆的线程的state状态的值同步 - 线程T2的最后操作与T1发现T2已经结束同步
- 如果线程T1中断了T2,那么T1的中断操作与其他所有线程发现T2被中断了同步
理解:如T2.interrupt(),则其他线程的Sleep方法会感知到
happens-before原则:
描述两个有冲突的动作之间的顺序(如线程间操作),JVM需要实现happens-before规则
该原则的内容可以百度
线程间操作:
- read
- write
- lock
- unlock
- 外部文件操作(如JVM进程外的文件读写操作)
JMM对于Final的处理:
- 在构造函数中设置final变量的值,线程一定看到该字段正确的构造版本,而不是字段的初始值(null等)
- 在构造函数中设置final变量的值后,发生读取,则会看到final字段分配的值,否则看到初始值