好吧,我将尝试清楚地表达这一点。对象是在对象本身上还是在对对象的引用上同步?
也就是说,如果有的话
Object lock1 = new Object();
Object lock2 = lock1;
将synchronized (lock1)
作为块代码synchronized (lock2)
吗?
两者都引用相同的实际对象,只是引用不同...
我认为重要的是对象,而不是引用,但我不确定。
谢谢。
Object lock1 = new Object();
Object lock2 = lock1;
两者都引用相同的实际对象,只是引用不同...
这是不正确的,Java中的非原始值是对该实例的引用。因此,两者都用相同的引用引用相同的对象。
您可以将该对象分配给您喜欢的任何变量,并且使用同步块将在该对象实例上进行同步。锁定监视器位于对象实例本身上。
当您查看与锁定相关的Object类的方法时,您会看到一些证据。这里是notify方法,用于通知正在等待释放锁的线程,以便它们可以执行同步块:
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#notify()