2016-05-21 45 views
0

1.6 Javadoc並不清楚這一點。是什麼使用synchronizedCollection和剛剛同步(集合)有什麼區別?

List l = LinkedList(); 
synchronized (l) { 
    l.add... // do some work 
    l.set... 
    l.remove... 
} 

List l = LinkedList(); 
Collection c = Collections.synchronizedCollection (l); 
synchronized (c) { 
    c.add...; c.set....; c.remove... 
} 

的區別??? 爲什麼需要一個synchronizedCollection類?第一種方法有什麼問題?

回答

2

第一種方法有什麼問題?

沒什麼問題:只要你同步所有訪問,你的程序將按照預期執行。

爲什麼需要一個synchronizedCollection類?

如果你要使用它​​塊內,沒有任何理由確實是:集合內的額外的同步是不會鎖住其他讀者和作家,因爲​​塊已經這樣做了。

首先使用synchronizedCollection的原因是爲了避免​​塊。在沒有同步的情況下撥打addsetremove不會使您的收藏處於無效狀態。

但是,如果在語句外部沒有​​塊,則三個單獨的操作不會作爲原子塊執行。

+0

但是根據javadoc:如果多個線程同時訪問鏈接列表,並且至少有一個線程在結構上修改了列表,則它必須在外部進行同步。 ....這通常是通過同步某些自然地將列表清除的對象來實現的。如果不存在這樣的對象,則應使用Collections.synchronizedList方法「列出」列表。所以這裏是我不明白,爲什麼javadoc說同步通常是在封裝對象上完成的,而不是鏈表對象本身? –

+0

@FaiLau'synchronizedCollection'返回的對象是* not *鏈接列表。它已經鏈接了它內部的列表,但它是一個特殊的類,它在調用實際列表之前添加了自己的同步。 – dasblinkenlight

+0

好的,我現在明白了。 SyncrhonizedCollection返回一個線程安全的façade到包含類。但是返回的對象是線程安全的,不是併發的。所以當使用迭代器時,對象仍然需要同步。 –

相關問題