2015-01-08 34 views
1

我有一個簡單的類用鏈表:如何在Java中線程安全地操作列表?

private final LinkedList<Object> list; 

如果我有兩種方法操縱這個名單:

public void m1(){ ... list.poll()...} 

public void m2(){...list.clear)....} 

如何確保ThreadSafety的?這兩種方法是否足以接收「同步」關鍵字,或者我是否需要在方法代碼周圍放置一個「方法代碼」?

常識告訴我它是第二個,但我想確認,或者更簡單的方法來確保我的列表不會被搞砸。

PS:或者這會更好地放在CodeReview?不知何故,這裏感覺更爲合適。

+1

我會建議使用'同步'只在'輪詢'和'清除'而不是在整個方法的關鍵部分。 – TheLostMind

+0

另外,像add()'和remove()'?這樣的方法呢?你將不得不同步*在它們上面? – TheLostMind

+0

好的,首先:謝謝,所有的答案都有幫助:)。由於「有一個現有的系統」的情況下,我最終同步塊重要。對於幾乎所有其他情況,我會指出atish shimpi http://stackoverflow.com/a/27838890/2286132。 @TheLostMind:你是完全正確的,它恰好是這樣,我正在處理的情況下偷看,輪詢和清除,所以他們最終在這個例子中! – Layna

回答

2

這是更好地使同步具體的地標,而不是使用關鍵字的整體方法。您的同步越精確,您的代碼就會執行得越好。應該建議您在線程中處理列表時顯示並在同一個鎖上同步的後者代碼。

如,如果你因爲你已經表明,它應該沒問題做如下的情況:

synchronized(list){ 
    // do something with your list 
    // synchronizing on the same lock makes sure other threads have to wait for this lock 
    // to be released. In your case you are using the list object as the lock. 
} 
5

將您的列表傳遞給java.util.Collections類中的public static <T> List<T> synchronizedList(List<T> list)方法以創建線程安全列表。

+0

需要看看沒有peek/poll的列表是否可以在我的環境中工作,但這個小片段肯定是有用的,從來沒有見過它:) – Layna

1

java.util.Vector是線程安全的,在這個類中的所有方法都是​​

1

提示:如果你要實現某種生產者/消費者模式,利用現有的工具 - 類實施"Blocking Queue"應該適合您的需求