Java synchronized(obj)中obj的理解
synchronized(obj){ …此处编写操作共享资源的代码 }obj是一个对象作为锁使用只有持有该锁的线程才可以执行同步代码块中的代码。obj可以为任意一个对象也可以是类的字面常量。在synchronized(obj)中obj被形象地称为“锁对象”Monitor Object。可以把它理解为一把“钥匙”或者“入场券”。为了更好地理解我们可以把这个过程比作一个“公共卫生间”1. 把obj看作一把锁公共卫生间是“共享资源”代码块中的操作就是你在卫生间里做的事情。obj是“门锁”当线程执行到synchronized(obj)时它会尝试去拿obj对外展示的这把锁。“持有锁”如果这把锁没被别人拿走当前线程就会把它拿走进入同步代码块其他人想用卫生间就必须在门口排队等待直到第一个人出来离开同步代码块锁被释放。2. 为什么obj可以是任意对象Java 中每一个对象在内存中都隐式关联着一把“监视器锁Monitor”。只要是Object的派生类它都有资格作为同步的锁。这使得你可以灵活选择使用普通对象如new Object()仅用于保护特定的一些操作多个线程可以通过共享这同一个对象实例来同步。使用类字面常量如MyClass.class这是全局锁。因为类的字节码Class 对象在内存中是唯一的所以无论你创建了该类的多少个实例只要是用MyClass.class作为锁所有实例在执行该代码块时都会受到影响。3. 使用时的核心要点非常重要要实现预期的同步效果最关键的是所有需要同步的线程看到的必须是同一个obj对象。正例如果你定义了一个private static final Object lock new Object();所有线程都用这个lock它们就能实现同步。反向错误如果你在代码块里写synchronized(new Object())由于每次进入时都new了一个全新的对象相当于每一扇门都有自己的锁线程之间根本互相看不到对方的锁代码就失去了同步效果。总结obj是一个身份识别标志线程之间通过“商量好”观察同一个对象来决定谁先执行。只要大家盯的是同一个对象协作机制就能生效