在一些Android开源代码中我找到了
private Map<ImageView, String> imageViews=Collections.synchronizedMap(new
WeakHashMap<ImageView, String>());
任何人都可以解释一下普通Map
和collections.synchronizedmap
答案 0 :(得分:2)
java.util包中的常规Map实现不是线程安全的。这意味着如果多个线程在同一个Map上执行get()
或put()
操作,则可能会导致Map中的竞争条件或不一致的数据。
要在多线程环境中使用现有Map,可以通过调用Collections.synchronizedMap()
来获取相同的实例。在这种情况下,get()
,put
和keyset()
等大多数方法都是同步的,可以安全地同时使用。
有关此内容的更多信息,请参阅
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)
同步映射是一个线程安全的映射,这意味着读/写操作是线程安全的。
答案 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