当我们使用synchronized
java中的关键字,究竟使用哪个同步原语?Lock, Semaphore, Monitor, Mutex
?
EDIT :JVM如何在本机级别实现锁?
在字节码级别,java有monitorenter
and monitorexit
操作,记录在Java 虚拟机规范的本页,下面粘贴了片段(对象引用是操作的操作数,取自堆栈):
监控输入器 snippet
每个对象都有一个与其关联的监视器。执行的线程监控输入器获得与关联的监视器的所有权对象引用。如果另一个线程已经拥有与之关联的监视器对象引用,当前线程等待,直到该对象被
解锁,然后再次尝试获得所有权。如果当前线程
已经拥有关联的监视器对象引用,它增加一个
监视器中的计数器指示该线程的次数
进入监视器。如果监视器关联对象引用不是
被任何线程拥有,当前线程成为该线程的所有者
监视器,将此监视器的条目计数设置为 1。
监控退出 snippet
当前线程应该是与其关联的监视器的所有者
引用的实例对象引用。线程递减
计数器指示其进入此监视器的次数。如果
结果计数器的值变为零,当前线程
释放监视器。如果监视器关联对象引用变为空闲,其他正在等待获取该监视器的线程
被允许尝试这样做。
因此,“监视器”就是答案,无论是这个还是 NPE 答案中引用的 JLS 都没有指定在本机代码级别发生的情况。如果您有特定的平台(CPU 和操作系统)和特定的 JVM 实现(包括版本),您当然可以查看 JVM 源代码(如果它是开源 JVM),或者在这里询问。
我也遇到过这个博客是1997年的,其中有更多详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)