synchronized
是 Java 中实现互斥同步的一种机制。当查看被 synchronized
修饰的代码块编译后的字节码,会发现编译器生成了 monitorenter
和 monitorexit
两个字节码指令。
这两个指令的作用如下:
monitorenter
:当虚拟机执行到 monitorenter
指令时,它会尝试获得对象的锁。如果对象没有被锁定,或者当前线程已经拥有该对象的锁,那么锁的计数器会增加。当执行 monitorexit
指令时,锁的计数器会减少。当计数器为 0 时,锁被释放。
如果获取对象的锁失败,当前线程将会阻塞等待,直到另一个线程释放了该对象的锁。
在 Java 中,synchronized
通过在对象头部设置标记来实现锁的获取和释放。这个标记用于标识对象是否被锁定。
锁的本质实际上是通过monitorenter
和monitorexit
字节码指令来控制的,这些指令的操作对象是一个Reference类型的参数,即要锁定和解锁的对象。使用synchronized
关键字时,我们可以确定相应的对象锁的方式如下:
如果Synchronized
明确指定了锁对