synchronized 里面的 minitor 模式实现的原理?
Java 中每一个对象都可以作为锁,这是 synchronized 实现同步的基础:普通同步方法,锁是当前实例对象。静态同步方法,锁是当前类的class对象。同步方法块,锁是括号里面的对象。每个对象有一个监视器锁。对于同步代码块,monitorenter 指令插入到同步代码块的开始位置,monitorexit 指令插入到同步代码块的结束位置。对于 monitorenter,如果 monitor 的进入数为 0,则该线程进入 monitor,然后将进入数设置为 1,该线程即为 monitor 的所有者。如果线程已经占有该 monitor,只是重新进入,则进入 monitor 的进入数加 1。如果其他线程已经占用了 monitor,则该线程进入阻塞状态,直到 monitor 的进入数为 0,再重新尝试获取 monitor 的所有权。对于 monitorexit,指令执行时,monitor 的进入数减 1,如果减 1 后进入数为 0,那线程退出 monitor,不再是这个 monitor 的所有者。对于 synchronized 方法,会被翻译成普通的方法,JVM 根据 ACC_SYNCHRONIZED 标示符来实现方法的同步。当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取 monitor,获取成功之后才能执行方法体,方法执行完后再释放 monitor。在方法执行期间,其他任何线程都无法再获得同一个 monitor 对象。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。