一、synchronized 锁的对象
- 对于普通方法,锁的是当前实例对象
- 对象静态方法,锁的是当前类的Class对象
- 对于同步方法块,锁的是Synchonided括号里面的对象
代码示例
public class SynchroniezedDemo {
private final Object SAY_GOOD_MORNING_MONITOR = new Object();
public synchronized void sayHello() {
}
public static synchronized void sayHi() {
}
public void sayGoodMorning() {
synchronized (SAY_GOOD_MORNING_MONITOR) {
}
}
}
对于sayHello()方法,锁对象为SynchroniezedDemo当前实例对象,对于sayHi()方法,对象为SynchroniezedDemo.class对象,对于sayGoodMorning()方法,锁对象为SAY_GOOD_MORNING_MONITOR 对象。
二、 虚拟机相关指令
synchronized是一种块结构的同步语法。synchronized经过javac编译后,会在同步代码块生成monitorenter和monitorexit这两个字节码指令。这两个指令都需要指明锁定的对象和解锁的对象,如果指明了锁对象参事例如上面的 synchronized (SAY_GOOD_MORNING_MONITOR)会将这个对象传入;如果没有指明,则会判断是当前‘this’对象还是class对象。将上面SynchroniezedDemo javac之后文件的如下(部分内容):