我有一个带有同步方法的类:
class A {
synchronized void method1() {};
synchronized void method2() {};
}
如果某些客户端类想要调用
method1()
,然后method2()
知道这些调用是原子的,第一种情况:
class B {
A a;
public void foo() {
synchronized(a) {
a.method1();
a.method2();
}
}
}
第二种情况:
class B {
A a;
final Object lock = new Object();
public void foo() {
synchronized(lock) {
a.method1();
a.method2();
}
}
}
我为什么要使用一种情况而不使用另一种情况?
最佳答案
在a上进行同步可能最有意义。这至少保持了“最少惊喜”的原则。对于其他客户端来说,a也是最自然的对象。添加一些文档以使其更加清晰。另外,可以确保您获得A中同步方法的锁定,如果您在A和B中使用不同的锁定,则此方法可能比潜在竞争的锁定更有效。