参见英文答案 > 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通过从同步块执行中删除一些操作来进行优化.