Java内存模型和Volatile(2)

程序执行的顺序按照代码的先后顺序执行,在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性

有序性保障

volatile:先行发生(happens-before)原则

synchronized:同一个时间只能有一个线程获得锁

先行发生(happens-before)原则

JMM中两项操作之间的偏序关系,如果操作A发生于操作B之前,操作A发生的影响可以被操作B观察到

单线程和正确同步的多线程的执行结果不会被改变

规则

如果两个操作不在下列规则中,虚拟机可以对其重排序

程序次序规则:在一个线程内按控制流顺序

管程锁定规则:锁的unlock操作先发生于后面同一个锁的lock操作

volatile变量规则:一个volatile变量的写操作先行于后面发生的这个变量的读操作

线程启动规则:start()先发生于此线程的每一个操作

线程终止规则:线程的所有操作都先发生于线程终止操作

线程中断规则:对线程interrupt()方法先行于被中断线程的代码检查到中断事件的发生

对象终结规则:一个对象初始化完成先发生于它的finalize()方法的开始

传递性:操作A在操作B前,操作B在操作C前,操作A一定在操作C前

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0949d8bd62668107e6daa4327bd42a69.html