Java里只有volatile变量是能实现禁止指令重排的
synchronized虽然不能禁止指令重排,但也能保证有序性?
这个有序性是相对语义来看的,线程与线程间,每一个synchronized块可以看成是一个原子 操作,它保证每个时刻只有一个线程执行同步代码,它可以解决上面引述的工作内存和主内存 同步延迟现象引发的无序
所以,synchronized和volatile的有序性与可见性是两个角度来看的:
1、 synchronized是因为块与块之间看起来是原子操作,块与块之间有序可见
2、 volatile是在底层通过内存屏障防止指令重排的,变量前后之间的指令与指令之间有序 可见
同时,synchronized和volatile有序性不同也是因为其实现原理不同:
1,synchronized靠操作系统内核互斥锁实现的,相当于JMM中的lock和unlock。退出 代码块时一定会刷新变量回主内存
2,volatile靠插入内存屏障指令防止其后面的指令跑到它前面去了
总而言之就是,synchronized块里的非原子操作依旧可能发生指令重排

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.