前几天我问了一个类似的问题,但对回答不满意,主要是因为我提供的代码有一些人们关注的问题。
基本上,在 Java 中锁定私有成员的最佳实践是什么?假设每个私有字段只能单独操作而不能一起操作(如下面的测试类示例),您应该直接锁定每个私有字段(示例 1),还是应该对每个您希望锁定的私有字段使用通用锁定对象(示例 2)?
示例 1:直接锁定私有字段
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);
}
}
}