繁体   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