Normal Map和collections.synchronizedmap之间的区别

时间:2013-01-22 06:31:34

标签: java collections

在一些Android开源代码中我找到了

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

任何人都可以解释一下普通Mapcollections.synchronizedmap

之间的区别

7 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

没有正常的地图。你不能只创建一个Map(新的Map()不会编译)。 Map是访问不同类型映射(hashMap,synchronizedMap,WeakHashMap ...)中数据的通用接口。阅读任何Java书籍,集合章节。

使用Map作为通用接口,您可以编写数据操作算法,这些算法适用于所有类型的Map实现。所以你可以切换实现(也许你意识到你需要同步地图而不仅仅是HashMap),你的代码也可以工作。

synchronizedMap只是一个包装器。它包装了底层Map的所有数据访问功能,并使它们对线程安全。

在你的情况下你有WeakHashMap这是“真正的”地图。 WeakHashMap定义了map如何存储数据(它使用键的哈希值和值的weakRefences)。然后将它包装在synchronizedMap中,这使您的地图线程安全。

答案 2 :(得分:1)

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

同步映射是一个线程安全的映射,这意味着读/写操作是线程安全的。

答案 3 :(得分:1)

我们使用“Synchronized”来确保两个同时执行的线程或进程不会同时执行程序的特定部分。

答案 4 :(得分:1)

Collections.synchronizedMap几乎包装你的Map对象,以便每次调用map方法都是同步的,这意味着一次只有一个线程可以更新或查询地图。

答案 5 :(得分:1)

Collections.synchronizedMap()是一种实现线程安全的非常糟糕的方法。它需要锁定每个方法,因此最多一个线程可以访问您的地图。它不像比较和设置那样支持原子操作。此外,你必须记住在迭代键/值时自己同步对象,否则它会失去所有它的魔力。

如果您需要线程安全的ConcurrentHashMap,请查看Map

答案 6 :(得分:1)

集合实用程序类提供了创建线程安全集合(List,Set,Queue,Map)的静态方法。 所以将任何线程不安全的集合转换为线程安全的集合;您在集合上调用synchronized方法,然后将您的集合作为参数传递。

线程安全集合一次只能由一个线程访问。

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