我有一个带有同步方法的类:

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中使用不同的锁定,则此方法可能比潜在竞争的锁定更有效。

07-28 03:28
查看更多