Java教程说:"同一个对象上的两个同步方法的调用不可能交错."
这对静态方法意味着什么?由于静态方法没有关联对象,所以synchronized关键字会锁定类,而不是对象吗?
只是为了给Oscar添加一些细节(令人愉悦的简洁!)答案,Java语言规范的相关部分是8.4.3.6,'synchronized Methods':
同步方法在执行之前获取监视器(第17.1节).对于类(静态)方法,使用与方法类的Class对象关联的监视器.对于实例方法,使用与此关联的监视器(调用该方法的对象).
由于静态方法没有关联对象, 所以synchronized关键字会锁定类,而不是对象吗?
是.:)
您需要注意的一点(几个程序员通常属于该陷阱)是同步静态方法和同步非静态方法之间没有链接,即:
class A { static synchronized f() {...} synchronized g() {...} }
主要:
A a = new A();
线程1:
A.f();
线程2:
a.g();
f()和g()不相互同步,因此可以完全同时执行.
除非你按如下方式实现g():
g() { synchronized(getClass()) { ... } }
当我想在对象的不同实例之间实现互斥时(例如,在访问外部资源时需要),我发现这种模式也很有用.