编译器生成指令的次序,可以不同于源代码所暗示的“显然”的版本,而且编译器还会把变量存储在
寄存器,而不是内存中;处理器可以乱序或者并行地执行指令;缓存会改变写入提交到主内存的变
量的次序;最后,存储在处理器本地缓存中的值,对于其他处理器并不可见。
重排序
java存储模型的定义是通过动作的形式进行描述的,所谓动作,包括变量的读和写、监视器加锁和
释放锁、线程的启动和拼接。
haddens-before的法则包括:
程序次序法则:线程中的每个动作A都haddens-before于该线程中的每一个动作B。
监视器锁法则:对一个监视器锁的解锁happens-before于每一个后续对同一监视器锁的加锁。
volatile变量法则:对volatile域的写入操作happens-before于每一个后续对同一域的读操作。
线程启动法则:在一个线程里,对Thread.start的调用会happens-before于每一个启动线程中的动作。
线程终结法则:线程中的任何动作都happens-before于其他线程检测到这个线程已经终结、或者从
Thread.join调用中成功返回,或者Thread.isAlive返回false.
中断法则:一个线程调用领一个线程的interrupt happens-before于被中断的线程发现中断。
终结法则:一个对象的构造函数的结束happens-before于这个对象finalizer的开始。
传递性:如果A haddens-before于B ,并且B happens-before于C,则A happens-before于C
寄存器,而不是内存中;处理器可以乱序或者并行地执行指令;缓存会改变写入提交到主内存的变
量的次序;最后,存储在处理器本地缓存中的值,对于其他处理器并不可见。
重排序
java存储模型的定义是通过动作的形式进行描述的,所谓动作,包括变量的读和写、监视器加锁和
释放锁、线程的启动和拼接。
haddens-before的法则包括:
程序次序法则:线程中的每个动作A都haddens-before于该线程中的每一个动作B。
监视器锁法则:对一个监视器锁的解锁happens-before于每一个后续对同一监视器锁的加锁。
volatile变量法则:对volatile域的写入操作happens-before于每一个后续对同一域的读操作。
线程启动法则:在一个线程里,对Thread.start的调用会happens-before于每一个启动线程中的动作。
线程终结法则:线程中的任何动作都happens-before于其他线程检测到这个线程已经终结、或者从
Thread.join调用中成功返回,或者Thread.isAlive返回false.
中断法则:一个线程调用领一个线程的interrupt happens-before于被中断的线程发现中断。
终结法则:一个对象的构造函数的结束happens-before于这个对象finalizer的开始。
传递性:如果A haddens-before于B ,并且B happens-before于C,则A happens-before于C