在Java中的“this”或私人对象上同步?
可能重复:
避免在Java中同步(this)?
这两段代码有什么区别? 每个的优缺点是什么?
1)
public class Example {
private int value = 0;
public int getNextValue() {
synchronized (this) {
return value++;
}
}
}
2)
public class Example {
private int value = 0;
private final Object lock = new Object();
public int getNextValue() {
synchronized (lock) {
return value++;
}
}
}
我选择第二种方法的主要原因是我不能控制客户对我班的实例做什么。
如果由于某种原因某人决定使用我的类的实例作为锁,它们将会干扰我的类中的同步逻辑:
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)
。