閱讀本DZone article關於Java併發我在想,如果下面的代碼:Java中的volatile變量問題
private volatile List list;
private final Lock lock = new ReentrantLock();
public void update(List newList) {
ImmutableList l = new ImmutableList().addAll(newList);
lock.lock();
list = l;
lock.unlock();
}
public List get() {
return list;
}
等同於:
private volatile List list;
public void update(List newList) {
ImmutableList l = new ImmutableList().addAll(newList);
list = l;
}
public List get() {
return list;
}
在try {}最後{}塊被省略簡潔。我假設ImmutableList類是一個真正不可變的數據結構,它擁有自己的數據,例如google-collections庫中提供的數據。由於list變量是不穩定的,基本上發生的是一個即時拷貝,跳過使用鎖定不是安全的嗎?
我認爲兩者都應該表現得完全一樣,但它取決於'ImmutableList'的實施。 我期望在'ImmutableList'上調用'addAll()'會拋出一個Exception,所以鎖永遠不會被使用。 – 2010-02-03 21:43:07