同步实例和同步块

AAA*_*AAA 1 java multithreading synchronization

假设我们有一个带有两个同步块的类:

class A{

public synchronized void methodA{

// Do Something
}


public synchronized void methodB{

// Do Something
}

}
Run Code Online (Sandbox Code Playgroud)

假设我们有两个线程t1t2共享同一个 class 实例A。Ift1methodA使用其类的实例进行调用A,同时t2将使用所使用的methodB类的同一实例进行调用。根据我的理解,使用synchronized方法会被阻止,即使是只使用。这是因为每个对象都有一个锁,并且该锁是由 获取的。那是对的吗 ?如果是,如果我们有两个同步块,我们是否可以得出相同的结论?At1t2methodBt1methodAt1

rzw*_*oot 5

是的。

这:

synchronized void foo() {
  code();
}
Run Code Online (Sandbox Code Playgroud)

是以下的简单简写:

void foo() {
  synchronized (this) {
    code();
  }
}
Run Code Online (Sandbox Code Playgroud)

出于同样的原因,拥有公共字段通常是一个非常糟糕的主意,拥有公共锁(通常this是“公共”,从包外部的代码可以访问它的意义上来说)也是一个非常糟糕的主意。通常最好这样做:

class Example {
  private final Object lock = new Object[0];

  public void foo() {
    synchronized (lock) {
      code();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您将锁公开(例如,使用synchronized或以其他方式锁定您直接控制范围之外的某些代码可以访问的内容),则必须对此进行记录,并非常详细地说明您承诺对该锁做什么和不做什么未来的更新。