Java中的synchronized方法和synchronized块之间有什么区别?

参见英文答案 > Is there an advantage to use a Synchronized Method instead of a Synchronized Block?                                    23个
Java中的synchronized方法和synchronized块之间有什么区别?

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

我的看法是两者之间没有区别,除了同步块可能在范围内更加局部化,因此锁定的时间会更短?

如果是静态方法上的Lock,那么Lock是什么?锁定类的含义是什么?

解决方法:

同步方法使用方法接收器作为锁(即,这用于非静态方法,以及用于静态方法的封闭类).同步块使用表达式作为锁.

因此,以下两种方法与锁定前瞻性相当:

synchronized void mymethod() { ... }

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

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

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

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

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

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

锁定范围

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

上一篇:java – 字段读取同步和volatile之间的可见性差异


下一篇:c – ReleaseSemaphore不释放信号量