那天我問了a similar question,但對回覆不滿意,主要是因爲我提供的代碼有一些人們關注的問題。對象鎖定私有類成員 - 最佳實踐? (Java)
基本上,在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);
}
}
}
同樣,有人可以對類進行修改,使兩個對象被鎖定在一起使用,而不會注意到鎖。修改要求從這一點開始使用一個鎖,但是某人不會注意到它。我說我不認爲這是一個很好的藉口。你所說的風險最小化是非常重要的,但是如果你並沒有意識到併發性方面的問題,併發代碼或多或少地保證會遇到麻煩。 –