gpt4 book ai didi

java - Collections.synchronizedMap

转载 作者:搜寻专家 更新时间:2023-11-01 01:36:46 26 4
gpt4 key购买 nike

来自 javadocs

Map m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // Needn't be in synchronized block
...
synchronized(m) { // Synchronizing on m, not s!
Iterator i = s.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}

两个查询:

1) m.keySet() 返回的 Set 也是一个集合包装器还是只是一个未同步的集合?

编辑:

2)是否需要在m上同步

 synchronized(m) {  // Synchronizing on m, not s!

我们不能在 s 而不是 m 上同步吗?

最佳答案

1:是的,它返回一个与 Map 共享互斥量的同步集。

2:是的,您需要在迭代时手动持有锁。如果您不这样做,可以在调用 next() 之间进行更改,您仍然会遇到问题。请记住,这是 HashMap 规范的一部分,例如,如果另一个线程在对 i 的两次调用之间执行 m.put("foo", "bar");。 next(),那么 next() 将抛出 ConcurrentModificationException。为防止这种情况发生,您锁定了整个 map ,这样在您完成迭代器之前没有人可以更改它。仅锁定集合不会阻止任何人向 map 添加内容。

如果您需要在可能发生并发访问时进行迭代,您应该查看 ConcurrentMap 的实现,以使您的生活更轻松。

关于java - Collections.synchronizedMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10662835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com