哪个线程获取哪个对象的锁?

Which thread acquires lock on which object?

我是java的新手,我对线程获取的锁真的很困惑。真没搞明白,到底是调用对象被锁了还是被调用对象被锁了??

例如:

public class ThreadA {
    public static void main(String[] args) {
        ThreadB b = new ThreadB();
        b.start();
    }
}

class ThreadB extends Thread {
    int total;
    Demo demo = new Demo();
    public void run() {
        demo.setX();
    }
} 

class Demo {

   private synchronized void setX(){
      System.out.println("hello"); 
   }
}

那么,引用 'demo' 引用的对象是否被锁定?

class'ThreadB'的实例被锁定了??

名为 demo 的 class Demo 实例被锁定。
同步方法令人困惑。我认为在大多数情况下最好使用显式锁定对象,例如

private void setX(){
   System.out.println("hello");
   synchronized (this) {
      this.x = 42;
      this.y = 37;
   }
   System.out.println("bye");
}