synchronized底层编译的jvm指令是
load内存屏障
monitorenter
Acquire屏障
/*
代码块
*/
release屏障
monitorexit
store内存屏障
-------------------------------
monitorenter:
如果monitor的count=0,则该线程进入monitor,然后将count=1,该线程即为monitor的所有者;
如果线程已经占有该monitor,只是重新进入,则count加1; 所有synchronized是可重入锁
如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的count=0,再重新尝试获取monitor的所有权;
monitorexit:
指令执行时,monitor的count减1,如果count = 0,那线程退出monitor,不再是这个monitor的所有者。其他被这个monitor阻塞的线程可以尝试去获取这个 monitor 的所有权
load内存屏障:执行refresh处理器缓存操作,将别的处理器更改过的变量从其他处理器刷到高速缓存或主内存中,保证能拿到最新的数据
store内存屏障:让线程将同步代码块里更改过的变量通过flush处理器缓存操作,刷到高速缓存或主内存中去
Acquire屏障:禁止读操作与之后的读写操作进行指令重排
release屏障:禁止写操作与之后的续写操作进行指令重排

EntrySet:如果线程已经持有了对象锁,此时如果有其他线程也想获得该对象锁的话,它只能进入EntrySet,并且处于线程的BLOCKED状态。
WaitSet:如果线程调用了wait()方法,那么线程会释放该对象的锁,进入到WaitSet,并且处于线程的WAITING状态
线程来竞争synchronized锁的时候,会先进入EntryList,通过CAS尝试修改count,若果成功将count=0修改成count=1,则表示获取锁。当线程获取锁之后,Owner区域会存放获取锁线程的信息。
锁优化:待续