Java synchronized(obj)中obj的理解
2026/6/26 5:33:09 网站建设 项目流程
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是一个身份识别标志,线程之间通过“商量好”观察同一个对象来决定谁先执行。只要大家盯的是同一个对象,协作机制就能生效!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询