具有相同对象引用的不同线程中的两个同步块仍在同时执行

two synchronised blocks at different threads with same object reference still executing simultaneously

public class SynchronizedTest
{
  public static void main(String argv[])
  { 
     Thread t1 = new Thread(new Runnable(){public void run()
     {
        synchronized (this)    //line 7
        {
            for(int i=0; i<100; i++)
                System.out.println("thread A "+i);
        }

    }});
    t1.start();
    synchronized(t1)       // line 15
    {
        for(int i=0; i<100; i++)
            System.out.println("thread B "+i);
    }
  }     
} 

如果我理解正确,那么在第 7 行同步块引用对象 t1 并且在第 15 行同步块也引用同一个对象,这样一次只有一个线程可以获得锁此对象和其他对象必须等待。

那他们为什么要争锋相对呢?输出像

一样混合
   thread B 62
   thread B 63 
   thread B 64
   thread A 0
   thread A 1
   thread A 2
   thread B 65
   thread A 3

您没有为锁使用同一个实例。

thisRunnable 实例,t1Thread 实例

我更喜欢声明private static Object LOCK = new Object();,这是内存中最小的实例,这很容易知道它的用途。

根据评论编辑(Steffen Frank)

这与 synchronized(MyClass.class) 有一些相似之处,但是由于任何人都可以访问 MyClass.class 的这个实例,任何人都可以使用这个锁,所以任何人都可以创建死锁,使用特定的实例给你帮助在上面,如果你愿意,让你分享。