2013-08-26 54 views
4

我有關於SynchronizedList的非常基本的問題。synchronizedList多線程訪問

可以說我有synchronizedList爲 -

List syncList = Collections.synchronizedList(new ArrayList<>()) 

現在我的情況是線程A正試圖訪問add() API和線程B試圖訪問remove() API synchronizedList的。這兩個線程是否能夠同時訪問Both(添加和刪除)api。

我相信線程不應該訪問api(add()和remove())同一時間。如果我錯了,請糾正我。

+2

你說得對。有一個鎖,你調用哪種方法並不重要,它是被鎖定的對象,而不是方法。 –

回答

1

你能澄清你的意思是「在同一時間」嗎?

一個同步的數據結構將強制兩個線程中的一個等待,直到另一個線程完成其操作。 「等待鎖定」可以在不同級別的粒度上執行,並且可以在同步寫入(包括刪除)時允許讀取,但是原理保持不變。

+0

特別是,'synchronizedList'將防止'List'數據結構的損壞,但不會阻止讀取更新寫入競爭條件。 – chrylis

0

我會解決這樣問題的方法:

首先,我創建一個列表包裝類是這樣的:

public class MySyncList{ 
    private List<String> myList; 
    public MySyncList(){ 
     this.myList = new ArrayList<String>(); 
    } 
    public synchronized void add(String elem){ 
     this.myList.add(elem); 
    } 
    public synchronized void remove(String elem){ 
     this.myList.remove(remove); 
    } 
    public synchronized List<String> getList(){ 
     return this.myList; 
    } 
} 

不是從線程訪問:

final MySyncList list = new MySyncList(); // final so other threads can access it 

ExecutorService service = Executors.newFixedThreadPool(10); 
for(int i=0;i<20;i++){ 
    service.execute(new Runnable(){ 
     public void run(){ 
     list.add("something"); 
     list.remove("something"); 
     } 
    }); 
} 
service.shutDown(); 
while(!service.isTerminated()); 
List<String> finalList = list.getList(); 
+3

呵呵......重寫'Collections.synchronizedList'有什麼意義? – assylias

6

威爾Both線程能夠在 的同時訪問Both(添加和刪除)api。

答案是否定的。

如果你有機會來看看Collections.synchronizedList(List)源代碼,你看到的是,該方法是創建取決於List發送作爲參數類型命名 SynchronizedListSynchronizedRandomAccessList,靜態內部類的實例。

現在這兩個靜態內部類擴展稱爲SynchronizedCollection共同的類,它保持一個mutex對象,在其上所有的方法中的操作上

同步這mutex對象被分配有this,其基本上意味着,在mutex對象是同樣返回的實例

由於add()remove()方法是本

synchronized(mutex) { 

} 

塊下進行,一螺紋其執行add(和mutex aquires鎖),將不允許另一個線程執行remove(由因爲前者已經鎖定mutex。該後者線程等待直到前緒mutex獲得得到發佈

所以,是add()remove()互斥

-1

這是正確的,同步的名單是完全線程安全的。因此,就原子性而言,線程將無法同時訪問列表。來自不同線程的訪問將以串行方式發生。

+1

它不是完全線程安全的,因爲該列表的迭代器不是線程安全的。 –

+0

問題是,列表線程安全嗎?確實是的!迭代器不是列表的一部分。同步列表本身及其內部結構完全是線程安全的。 –