标签:对象 活动 方法 structure str 检查 代码块 获取 释放
synchronized是基于Monitor来实现同步的。
Monitor 的工作机理:
同步方法使用ACC_SYNCHRONIZED标记符隐式的实现。
同步代码块采用monitorenter、monitorexit指令显式的实现。
方法级别的同步是隐式的,它实现在方法调用和返回操作之中。虚拟机可以从方法常量池中的方法表结构(method_info structure)中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否是同步方法。当调用方法时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否设置,如果设置了,执行线程先持有同步锁,然后执行方法,最后在方法完成时释放锁。
每一个对象都有一个monitor,一个monitor只能被一个线程拥有。当一个线程执行到monitorenter指令时会尝试获取相应对象的monitor,获取规则如下:
只有拥有相应对象的monitor的线程才能执行monitorexit指令。每执行一次该指令monitor进入数减1,当进入数为0时当前线程释放monitor,此时其他阻塞的线程将可以尝试获取该monitor。
标签:对象 活动 方法 structure str 检查 代码块 获取 释放
原文地址:https://www.cnblogs.com/amunote/p/10328096.html