2013-02-18 50 views
3

如果多個線程訪問vector,vector將確保只有一個線程可以同時訪問vector。 SynchronizedList是相同的。 那有什麼區別? 如何在某些同步情況下選擇?在java中,Vector和Collections.synchronizedList都是同步的,有什麼區別?

+0

考慮使用['CopyOnWriteArrayList'](http://docs.oracle.com創建一個同步代理改爲使用/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)。 – 2013-02-18 08:32:53

+0

它通常太昂貴。 – 2013-02-18 08:36:51

+0

這個問題已被標記爲重複 - 但它應該重複的問題沒有得到回答(更確切地說,它有一個「答案」,但它實際上並沒有回答這個問題)。 – 2016-07-19 09:14:36

回答

9

這種冗餘的主要原因是使用Java代碼向後兼容舊版本的Java開發。

如果我在Java 1.2之前正確記得集合是一個獨立的庫,並且不是標準JDK/JRE的一部分。

此時,像SDK提供的數據結構這樣的唯一列表就是Vector。在Collections中,開發人員通過多種方式改進了Vector結構。特別是,他們刪除了同步,因爲在大多數情況下證明是不必要的。

他們還想讓一個簡單的方法來創建一個像收集一樣的列表的同步版本。因此他們引入了SynchronizedList。

現在Vector和SynchronizedList之間的主要差異是你使用它的方式。通過調用Collections.synchronizedList,您可以爲當前的List實現創建一個包裝,這意味着您不會將數據複製到另一個數據結構,並且保持底層結構不變。例如,如果你想要LinkedList結構,而不是ArrayList。

在Vector的情況下,您實際上將數據複製到像結構Vector這樣的新列表中。所以如果你之前有一個列表,效率會比較低,但是如果你以前沒有任何數據結構,那麼你可能想使用Vector,因爲它不會爲每個方法調用添加方法包裝成本。向量的另一個缺點是你不能保留其他的底層結構(比如LinkedList),你總是使用Vector中已經實現的東西。

+0

閱讀Vector的javadoc,我沒有看到它添加到矢量的對象被複制到像結構這樣的新列表的任何地方,你可以展開還是在最後一段中仔細檢查你的點? – AfterWorkGuinness 2014-05-17 22:11:08

+0

這不完全是我說的。列表的元素不會被複制。我的觀點是,如果您要從現有的未同步列表中創建同步向量或列表,則必須將數據從一個複製到另一個(如list2.addAll(list1))。如果你這樣做,底層的數據結構就會被複制(不是這些元素)。我建議你打開Vector.java,AbstractList.java和其他相關的類,以查看數據如何從一個集合添加到另一個集合。那對你來說會更清晰。 – ATrubka 2014-06-02 09:14:31

1

Java矢量默認同步。你不必明確地同步。即使你這樣做也沒有額外的好處

使用Java向量是非常不鼓勵的,而是建議使用Syncronized「ArrayList」。同樣有明顯的好處。

請同時參閱Are Vectors Obsolete ?

0

Vector是同步的列表執行和Collections.synchronziedList是類別實用程序類的方法是,對於任何List實現

相關問題