我前几天问了类似的问题,但是对回答并不满意,主要是因为我提供的代码存在一些问题,人们关注这些问题。基本上,Java中锁定私有成员的最佳实践是什么?假设每个私有字段只能独立操作,而不能同时操作(就像下面我的Test类示例),你应该直接锁定每个私有字段(示例1),还是应该针对每个需要锁定的私有字段使用一个通用锁对象(示例2)?
示例1:直接锁定私有字段
例子2:为每个私有字段使用锁对象
class Test {
private final List<Object> xList = new ArrayList<Object>();
private final List<Object> yList = new ArrayList<Object>();
/* xList methods */
public void addToX(Object o) {
synchronized(xList) {
xList.add(o);
}
}
public void removeFromX(Object o) {
synchronized(xList) {
xList.remove(o);
}
}
/* yList methods */
public void addToY(Object o) {
synchronized(yList) {
yList.add(o);
}
}
public void removeFromY(Object o) {
synchronized(yList) {
yList.remove(o);
}
}
}
例子2:为每个私有字段使用锁对象
class Test {
private final Object xLock = new Object();
private final Object yLock = new Object();
private List<Object> xList = new ArrayList<Object>();
private List<Object> yList = new ArrayList<Object>();
/* xList methods */
public void addToX(Object o) {
synchronized(xLock) {
xList.add(o);
}
}
public void removeFromX(Object o) {
synchronized(xLock) {
xList.remove(o);
}
}
/* yList methods */
public void addToY(Object o) {
synchronized(yLock) {
yList.add(o);
}
}
public void removeFromY(Object o) {
synchronized(yLock) {
yList.remove(o);
}
}
}