可能重复:
Avoid synchronized(this) in Java?
这两段代码有什么不同?每种方法的优缺点是什么?
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++;
}
}
}
发布于 2012-06-23 17:51:04
我选择第二种方法的主要原因是我不能控制客户端如何处理我的类的实例。
如果,出于某种原因,有人决定使用我的类的实例作为锁,他们将干扰我的类中的同步逻辑:
class ClientCode {
Example exampleInstance;
void someMethod() {
synchronized (exampleInstance) {
//...
}
}
}
如果在我的Example
类中,我使用了一个其他人看不到的锁,他们就不能干扰我的逻辑并引入一个任意的互斥锁,就像上面的场景一样。
总而言之,这只是信息隐藏原理的一个应用。
发布于 2012-06-23 17:36:47
如果我需要同时执行两个彼此独立的不同任务,我会倾向于第二种选择。
例如:
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++;
}
}
}
发布于 2012-06-23 15:12:36
我会说第二种方法更好。考虑以下情况:
public class Abc{
private int someVariable;
public class Xyz {
//some method,synchronize on this
}
//some method, and again synchronize on this
}
在这种情况下,两种方法中的this
是不同的。一个是内部类的方法。因此,最好使用公共对象进行同步。例如,synchronized (someVariable)
。
https://stackoverflow.com/questions/11167566
复制相似问题