即使我們使用同步方法並因此獲得對Helper對象的鎖,爲什麼此代碼不是線程安全的?即使使用同步方法,爲什麼此代碼不是線程安全的?
class ListHelper <E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>());
public synchronized boolean putIfAbsent(E x) {
boolean absent = !list.contains(x);
if (absent)
list.add(x);
return absent;
}
}
也許是......誰說它不是線程安全的?你是否遇到競爭條件或僵局? –
這是Java併發實踐中的一個例子,無法理解爲什麼這個例子被認爲是不安全的。 – Ullas
我有點驚訝,他們沒有解釋爲什麼... –