锁”的本质其实是 monitorenter 和 monitorexit 字节码指令的一个 Reference 类型的参数,即要锁定和解锁的对象。我们知道,使用 Synchronized 可以修饰不同的对象,因此,对应的对象锁可以这么确定。
1. 如果 Synchronized 明确指定了锁对象,比如 Synchronized(变量名)、Synchronized(this) 等,说明加解锁对象为该对象。
2. 如果没有明确指定: 若 Synchronized 修饰的方法为非静态方法,表示此方法对应的对象为锁对象; 若 Synchronized 修饰的方法为静态方法,则表示此方法对应的类对象为锁对象。 注意,当一个对象被锁住时,对象里面所有用 Synchronized 修饰的方法都将产生堵塞,而对象里非 Synchronized 修饰的方法可正常被调用,不受锁影响。