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

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

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

1)

public class Example { private int value = 0; public int getNextValue() { synchronized (this) { return value++; } } } 

2)

 public class Example { private final Object lock = new Object(); private int value = 0; public int getNextValue() { synchronized (lock) { return value++; } } } 

我选择第二种方法的主要原因是我不控制客户对我class级实例的处理方式。

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

 class ClientCode { Example exampleInstance; void someMethod() { synchronized (exampleInstance) { //... } } } 

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

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

如果我需要同时执行两个彼此独立的不同任务,我宁愿选择第二个选项

例如:

 public class Example { private int value = 0; private int new_value = 0; private final Object lock1 = new Object(); private final Object lock2 = new Object(); public int getNextValue() { synchronized (lock1) { return value++; } } public int getNextNewValue() { synchronized (lock2) { return new_value++; } } } 

我会说第二种方法更好。 考虑以下情况:

 public class Abc{ private int someVariable; public class Xyz { //some method,synchronize on this } //some method, and again synchronize on this } 

在这种情况下, this两种方法并不相同。 一个是内部类的方法。 因此,最好使用公共对象进行同步。 例如, synchronized (someVariable)

我认为这取决于具体情况。 让我们说你的类是一个子类,超类有一个同步的方法。 并且假设您正在使用相同的数据集,并且希望在您的方法中保持完整性。 那么肯定接近1是你应该使用的。

否则,第二种方法可以更好地根据Costi提到的内容