Java中"this"或私有对象的同步?

NIN*_*OOP 7 java multithreading synchronization

可能重复:
避免在Java中同步(this)?

这两段代码有什么区别?每个的优点和缺点是什么?

1)

public class Example {
    private int value = 0;

    public int getNextValue() {
        synchronized (this) {
            return value++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2)

public class Example {
    private final Object lock = new Object();
    private int value = 0;

    public int getNextValue() {
        synchronized (lock) {
            return value++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Cos*_*atu 6

我选择第二种方法的主要原因是我无法控制客户端对我的类实例的处理方式.

如果由于某种原因,有人决定使用我的类的实例作为锁,它们将干扰我的类中的同步逻辑:

class ClientCode {
    Example exampleInstance;

    void someMethod() {
        synchronized (exampleInstance) {
            //...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果在我的Example班级中,我使用的是其他人无法看到的锁,他们就不会干扰我的逻辑并引入任意互斥,就像上面的场景一样.

总而言之,这只是信息隐藏原则的应用.