1.如何保证可见性
2.volatile保证有序性
happens-before规则
happens-before规定了对共享变量的写操作对其他线程的读操作可见的问题。
1.线程解锁m之前对变量的写,对于接下来对m加锁的其他线程对该变量的读可见。
2.线程对volatile变量的写,对接下来其他的线程对该变量的读可见。
3.线程start前对变量的写,对该线程开始后对该变量的读可见。
4.线程结束前对变量的写,对其他线程得知它结束后的读可见
5.线程t1打断t2(interrupt)前对变量的写,对于其他线程得知t2被打断后对变量的读可见(通过t2.interrupted()或t2.isinterrupted() )
t2被t1打断后,t1打断前对共享变量的写对于主线程和t2线程来说是可见的。
注意:在isInterrupted()之后。
6.对变量默认值(0,false,null)的写,对其他线程对该变量的读可见。
7.volatitle读屏障与写屏障可见性,有序性
synchronized指令重排仍然发生
因为INSTANCE这个变量没有完全被synchronized保护起来,所以synchronized代码块里面仍然可能会发生指令重排的现象。