Java 中的同步方法和同步块有什么区别?
我一直在网上寻找答案,人们似乎对此很不确定:-(
我的看法是,两者之间没有区别,除了同步块的范围可能更本地化,因此锁定的时间会更短?
如果对静态方法加锁,那么加锁的对象是什么?类锁定是什么意思?
同步方法使用方法接收者作为锁(即this
对于非静态方法,以及静态方法的封闭类)。Synchronized
块使用表达式作为锁。
所以从锁定的角度来看,以下两种方法是等效的:
synchronized void mymethod() { ... }
void mymethod() {
synchronized (this) { ... }
}
对于静态方法,类将被锁定:
class MyClass {
synchronized static mystatic() { ... }
static mystaticeq() {
syncrhonized (MyClass.class) { ... }
}
}
对于同步块,您可以使用任何非null
对象作为锁:
synchronized (mymap) {
mymap.put(..., ...);
}
锁定范围
对于同步方法,锁将在整个方法范围内保持,而在synchronized
块,仅在该块范围(也称为临界区)期间持有锁。在实践中,JVM 可以通过从 JVM 中删除一些操作来进行优化。synchronized
如果能够证明可以安全地完成,则阻止执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)