簡體   English   中英

Normal Map和collections.synchronizedmap之間的區別

[英]Difference between Normal Map and collections.synchronizedmap

在我發現的一些android開源代碼中

 private Map<ImageView, String> imageViews=Collections.synchronizedMap(new
 WeakHashMap<ImageView, String>());

任何人都可以解釋我在Normal Mapcollections.synchronizedmap之間的區別

java.util包中的常規Map實現不是線程安全的。 這意味着如果多個線程在同一個Map上執行get()put()操作,則可能導致Map中的競爭條件或不一致的數據。

要在多線程環境中使用現有Map,可以通過調用Collections.synchronizedMap()獲取相同的同步實例。 在這種情況下, get()putkeyset()等大多數方法都是同步的,可以安全地同時使用。
有關此內容的更多信息,請參閱http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#synchronizedMap(java.util.Map

沒有正常的地圖。 你不能只創建一個Map(新的Map()不會編譯)。 Map是訪問不同類型映射(hashMap,synchronizedMap,WeakHashMap ...)中數據的通用接口。 閱讀任何Java書籍,集合章節。

使用Map作為通用接口,您可以編寫數據操作算法,這些算法適用於所有類型的Map實現。 所以你可以切換實現(也許你意識到你需要在這里同步地圖而不僅僅是HashMap),你的代碼才能運行。

synchronizedMap只是一個包裝器。 它包裝了底層Map的所有數據訪問功能,並使它們對線程安全。

在你的情況下,你有WeakHashMap這是“真正的”地圖。 WeakHashMap定義了map如何存儲數據(它使用鍵的哈希值和值的weakRefences)。 然后將它包裝在synchronizedMap中,這使您的地圖線程安全。

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedCollection(java.util.Collection)

同步映射是線程安全映射,這意味着讀/寫操作是線程安全的。

我們使用“Synchronized”來確保兩個並發執行的線程或進程不會同時執行程序的特定部分。

Collections.synchronizedMap幾乎包裝了您的Map對象,因此每次調用map方法都是同步的,這意味着一次只有一個線程可以更新或查詢地圖。

Collections.synchronizedMap()是一種實現線程安全的非常糟糕的方法。 它需要鎖定每個方法,因此最多一個線程可以訪問您的地圖。 它不像比較和設置那樣支持原子操作。 此外,你必須記住在迭代鍵/值時自己同步對象,否則它會失去所有它的魔力。

如果需要線程安全的Map ,請查看ConcurrentHashMap

Collections實用程序類提供靜態方法來創建線程安全集合(List,Set,Queue,Map)。 所以將任何線程不安全的集合轉換為線程安全的集合; 您在集合上調用synchronized方法,然后將您的集合作為參數傳遞。

線程安全集合一次只能由一個線程訪問。

網址: http//docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM