我們什麼時候使用同步ArrayList
?我們已經有Vector
這是同步。當我們已經有向量時,爲什麼我們需要同步ArrayList?
回答
我認爲你有這個錯誤。 ArrayList is unsynchronized, Vector is。
正在同步意味着每個操作都是線程安全的 - 如果您從兩個線程同時使用相同的向量,則它們不會損壞狀態。但是,這會讓它變慢。
如果您正在單線程環境中工作(或者該列表僅限於線程且從不共享),請使用ArrayList。如果您正在使用共享相同集合的多個線程,則可以使用Vector或使用ArrayList,但以其他方式同步(例如,手動或通過包裝器)。
這是什麼意思數組列表在java中同步?
這意味着它是線程安全的。
- 向量被同步。任何觸及Vector內容的方法都是線程安全的。
- 另一方面,ArrayList是不同步的,因此它們不是線程安全的。
儘管'Vector'是線程安全的,但Vector的典型用法不會。 – 2010-01-20 20:39:27
@Tom:我想這取決於應用程序,不是嗎? – jldupont 2010-01-20 20:41:11
對於線程安全而無需進一步鎖定的'Vector',你可以做的事情不多。作爲一個隨機的例子,你不能讀取它的大小,然後通過索引獲取或設置一個值。 – 2010-01-20 21:56:41
同步我讀的ArrayList在 的Java同步..
注意,此實現不 同步
因此,如果您確定不會處理併發性,則使用ArrayList。 使用Vector可能會導致性能問題,並且可能會導致性能問題。
ArrayList is not synchronized out of the box.
大小可變數組執行 List接口的。實現所有 可選列表操作,並允許 所有元素,包括null。除了實現列表 接口外,此類還提供方法 來操縱內部用於存儲列表的 列表的大小。 (這個類是大致 相當於載體,但它 是不同步的。)
這樣就避免了在某些情況下的性能問題,你知道,你將不需要線程安全(例如,完全封裝的私有數據) 。通過任一類型的集合進行迭代時,如果數據被添加或刪除,you will throw a ConcurrentModificationException:
注意,此實現不是同步 既但是ArrayList和Vector使用迭代器時,對他們有問題。如果多個線程 同時訪問ArrayList實例 ,並且至少一個線程在結構上修改列表 ,則它必須在外部同步 。 (結構上的修改 是指添加或刪除 一個或多個元件,或明確 任何操作調整大小背襯陣列;僅僅 設置元素的值不是 結構修改。)這是 通常通過 同步完成自然封裝列表上的某些對象。如果沒有 這樣的對象存在,該列表應該 「包裝」使用 Collections.synchronizedList方法。 這最好在創建時進行,以防止 意外的不同步 訪問列表:
名單列表= Collections.synchronizedList(新 的ArrayList(...));
此類的 iterator和listIterator方法返回的迭代器是 快速失敗的:如果列表結構 在 迭代後的任何時間修改是通過迭代器自身的remove或 創建的,以任何方式,除了 添加方法,迭代器將拋出一個 ConcurrentModificationException。因此, 併發 修改的,迭代器很快就會完全失敗 ,而不是 在 未來不確定的時間冒着任意的,非確定性 行爲。
注意的 迭代器的快速失敗行爲不能得到保證,因爲它 是,一般來說,不可能 做出任何硬性保證在 存在不同步併發 修改。失敗快速迭代器 盡最大努力拋出ConcurrentModificationException 。因此, 將寫錯 依賴於此例外的程序的 正確性: 迭代器的故障快速行爲應僅用於 檢測錯誤。
ArrayList帶有各種有用的風味,但是,而Vector不。我個人最喜歡的是CopyOnWriteArrayList:
的ArrayList,其中所有可變操作(添加,設置,等等)的一個線程安全的變體都是通過對底層數組進行一次新的複製來實現。
這通常代價太高,但在遍歷操作數量大大超過突變時可能會比替代方法更有效,而且在您不能或不想同步遍歷時仍很有用,但需要排除併發線程之間的干擾。「快照」樣式迭代器方法在創建迭代器時使用對數組狀態的引用。這個數組在迭代器的生命週期中永遠不會改變,所以干擾是不可能的,迭代器保證不拋出ConcurrentModificationException。自迭代器創建以來,迭代器不會反映添加,刪除或對列表的更改。迭代器本身的元素更改操作(刪除,設置和添加)不受支持。這些方法拋出UnsupportedOperationException。
CopyOnWriteArrayLists在GUI工作中非常有用,特別是在顯示更新數據集(例如,在屏幕上移動圖標)的情況下。如果您可以容忍讓您顯示的數據列表過期一幀(因爲您的生產者線程稍微落後於圖形更新線程),CopyOnWriteArrayLists是完美的數據結構。
+1打我推薦COWAL。這些天矢量是如此不受歡迎我很驚訝整個班級都沒有被棄用; CopyOnWriteArrayList是一個可愛的小動物,可以讓你避免各種問題。 – BlairHippo 2010-01-20 20:41:36
@BlairHippo,我同意。事實上,您可以忽略某人在閱讀數據時對數據進行寫作的可能性,這使得這個世界變得更加光明正大。 – 2010-01-20 20:48:37
請注意,COWAL有一個非常小的問題;設計用於集合的庫方法並不總是預期可能提供COWAL;例如,'static getLastElement(List list
- 1. 當我們已經有一階邏輯時,爲什麼我們需要PDDL?
- 2. 當我們已經有mapDispatchToProps時,爲什麼我們需要使用redux-thunk
- 3. 爲什麼Haskell需要Data.Sequence當我們已經有了列表?
- 4. 爲什麼我們已經有CSS時需要ASP.NET主題?
- 5. 當我們有點子時,爲什麼我們需要Anaconda?
- 6. 我們已經有了nodejs,爲什麼我們需要nginx或apache?
- 7. 爲什麼我們需要Maven或Ant,如果我們已經有Eclipse?
- 8. 爲什麼當synchronizedList()或Vector已經同步時我們還需要外部同步?
- 9. 如果我們已經有[HttpPost],爲什麼需要使用JsonRequestBehavior?
- 10. 爲什麼我們需要analysis_export當我們有analysis_port
- 11. 封裝 - 當setter已經公開時,爲什麼我們需要它?
- 12. 當HTTP代理已經緩存內容時,爲什麼我們需要CDN?
- 13. 當我們有內核時,爲什麼我們需要驅動程序?
- 14. 當我們有.java文件可用時,爲什麼我們需要JSP文件?
- 15. 爲什麼我們需要設備驅動程序,當我們已經有BIOS服務
- 16. 爲什麼我們需要時代?
- 17. 我們什麼時候需要實際同步?我的線程自然同步
- 18. 爲什麼我需要=(class)...當我已經宣佈課程時?
- 19. 雖然我們有Swing,但爲什麼我們需要JavaFX?
- 20. 當我們可以拋出TypeErrors時,爲什麼我們需要NaN值?
- 21. DavLockDB:我們需要什麼?
- 22. 爲什麼我們需要創建一箇中斷向量表?
- 23. 當我們需要Arraylist中的Collections類方法時,爲什麼不擴展Collections?
- 24. 爲什麼我們需要Apache Harmony項目,而已經有一個OpenJDK項目
- 25. 爲什麼我們在java中需要switch-case語句,如果我們已經有if-else if-else語句
- 26. 什麼是仿函數,爲什麼我們需要它們?
- 27. 什麼是EJB回調,爲什麼我們需要它們?
- 28. 裝配需要什麼?爲什麼我們使用它們?
- 29. 當pread接受偏移值時,爲什麼我們需要lseek?
- 30. 爲什麼我們需要simple_one_for_one?
你從哪裏讀到的? – Tom 2010-01-20 20:39:36
我提名這個問題作進一步編輯:那裏有有用的內容。示例標題:「當我們已經有矢量時,爲什麼我們需要同步ArrayList?」 – 2010-01-20 20:50:19
您可以使用java.util.Collections'同步'ArrayList - 是您在問題中的含義嗎?這可能比Vector更好,因爲它實現了Collection和List接口 – Dan 2010-01-20 21:26:39