一尘不染

Java中的同步方法和同步块有什么区别?

java

Java中的同步方法和同步块有什么区别?

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

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

如果在静态方法上使用Lock,则采用什么Lock?班级锁是什么意思?


阅读 300

收藏
2020-09-08

共1个答案

一尘不染

同步方法将方法接收器用作锁(即,this用于非静态方法,而用于静态方法的封闭类)。 Synchronizedblocks将表达式用作锁。

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

synchronized void mymethod() { ... }

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

对于静态方法,该类将被锁定:

class MyClass {
  synchronized static mystatic() { ... }

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

对于同步块,可以将任何非null对象用作锁:

synchronized (mymap) {
  mymap.put(..., ...);
}

锁定范围

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

2020-09-08