synchronized实现原理
synchronized 代码块实现原理
java 字节码中,用来实现同步代码块的是 monitorenter 和 monitorexit 指令。
monitorenter 指令执行时,当前线程试图获取 objectref 所存储的对象锁(ObjectMonitor 对象)
如果取到的 monitor 对象 _count 字段为 0,则将该线程引用存储在 monitor 对象的 _owner 字段中,并且将 _count 字段加1,线程继续执行,直到线程执行 monitorexit 指令。
如果取到的 monitor 对象 _count 字段不为 0,那么首先会判断该线程是否与 monitor 对象的 _owner 字段存储的引用相同,如果相同,_count 值加 1,仍然可以继续运行,这保证了 synchronized 的可重入性,如果不同,则将该线程放入 _WaitSet,线程进入 wait 状态等待唤醒。
synchronized 方法实现原理
与 synchronized 代码块不同,JVM可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法。
当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先持有 monitor 对象,然后再执行方法,最后再方法完成(无论是正常完成还是非正常完成)时释放 monitor。
如果一个同步方法执行期间抛 出了异常,并且在方法内部无法处理此异常,那这个同步方法所持有的monitor将在异常抛到同步方法之外时自动释放。

每天坚持,终会抵达!

浙公网安备 33010602011771号