Synchronized:
使用monitorenter和monitorexit指令实现的:
- monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处
- 每个monitorenter必须有对应的monitorexit与之配对
- 任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态
并在 monitorenter 指令后的临界区最前存放一个获取屏障,并在 monitorexit 后面插入一个 释放屏障,在这两个屏障的保护下,还有锁的排他性下,使得在 synchronized 的临界区当中具有原子性。也因为这两个屏障的使用实现了有序性,获取屏障使得读线程只有在获得锁的情况下,才能够执行临界区的操作。释放屏障使得临界区的读写操作必须前于 monitorexit。
final:
在 final 之后曹汝一个 storestore 屏障,使得后面的无法与前面的写操作相互替换位置。
|