Java中的同步方法和同步块有什么区别?
2022-09-01 04:29:28
Java中的同步方法和同步块有什么区别?
我一直在网上寻找答案,人们似乎对这个答案很不确定:-(
我的看法是两者之间没有区别,除了同步块可能在范围上更加本地化,因此锁定的时间会更短?
在静态方法上锁定的情况下,锁定是什么?类锁定的含义是什么?
Java中的同步方法和同步块有什么区别?
我一直在网上寻找答案,人们似乎对这个答案很不确定:-(
我的看法是两者之间没有区别,除了同步块可能在范围上更加本地化,因此锁定的时间会更短?
在静态方法上锁定的情况下,锁定是什么?类锁定的含义是什么?
同步方法使用方法接收器作为锁定(即 对于非静态方法,对于静态方法,封闭类)。 blocks 使用表达式作为锁。this
Synchronized
因此,以下两种方法与锁定预期等效:
synchronized void mymethod() { ... }
void mymethod() {
synchronized (this) { ... }
}
对于静态方法,类将被锁定:
class MyClass {
synchronized static mystatic() { ... }
static mystaticeq() {
syncrhonized (MyClass.class) { ... }
}
}
对于同步块,您可以使用任何非对象作为锁定:null
synchronized (mymap) {
mymap.put(..., ...);
}
锁定范围
对于同步方法,锁定将在整个方法作用域中保持,而在块中,锁定仅在该块作用域(也称为关键部分)期间保持。在实践中,如果JVM可以证明它可以安全地完成,那么允许JVM通过从块执行中删除一些操作来进行优化。synchronized
synchronized
同步方法是速记。这:
class Something {
public synchronized void doSomething() {
...
}
public static synchronized void doSomethingStatic() {
...
}
}
就所有意图和目的而言,等同于:
class Something {
public void doSomething() {
synchronized(this) {
...
}
}
public static void doSomethingStatic() {
synchronized(Something.class) {
...
}
}
}
(其中 是类的类对象。Something.class
Something
因此,确实,使用同步块,您可以更具体地了解您的锁,并且更细粒度地了解何时要使用它,但除此之外,没有区别。