2016-12-15 77 views
-1
public 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; 
    } 
} 

我不明白爲什麼這不起作用。爲什麼鎖定錯誤?

如果我將列表更改爲專用字段,那麼這段代碼是否正確?

+0

我不知道你想在那裏做什麼,爲什麼不起作用,但它看起來像你模仿一個'集合',並可能想要通過'列表'使用它。 – SomeJavaGuy

回答

1

代碼不起作用(即不能可靠地同步訪問),因爲其他代碼可以直接訪問list,繞過您的​​鎖。

使它private會阻止。

你正在使用synchronizedList這一事實並沒有幫助(如果涉及到的同步鎖與你的方法正在使用的鎖相同,但它不是)。

如果要公開list,您可以更新您的方法以在同一個鎖上進行同步(即list本身)。

這種方法是detailed in the JavaDoc for synchronizedList