This question already has answers here:
Is there an advantage to use a Synchronized Method instead of a Synchronized Block?

(23个答案)


3年前关闭。




Java中的同步方法和同步块(synchronized block)有什么区别?

我一直在网上搜索答案,人们似乎对此不太确定:-(

我的看法是,两者之间没有什么区别,只是synch块的作用域可能更多,因此锁定的时间更少了?

如果在静态方法上使用Lock,则采用哪种Lock?类(class)锁是什么意思?

最佳答案

同步方法将方法接收者用作锁(对于非静态方法,即this;对于静态方法,其封闭类)。 Synchronized块将表达式用作锁。

因此,锁定预期对象后,以下两种方法是等效的:

synchronized void mymethod() { ... }

void mymethod() {
  synchronized (this) { ... }
}

对于静态方法,该类将被锁定:
class MyClass {
  synchronized static mystatic() { ... }

  static mystaticeq() {
    syncrhonized (MyClass.class) { ... }
  }
}

对于同步块(synchronized block),可以将任何非null对象用作锁:
synchronized (mymap) {
  mymap.put(..., ...);
}

锁定范围

对于同步方法,该锁将在整个方法范围内保持,而在synchronized块中,仅在该块范围内保持该锁(否则称为临界区)。实际上,如果JVM可以证明可以安全地进行操作,则可以通过从synchronized块执行中删除一些操作来进行优化。

10-08 03:06