java - Collections.synchonizedMap 和同步

标签 java collections

来自javadoc

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());
  }

这里为什么迭代器被包含在同步块(synchronized block)中?

这是否意味着每次我们需要迭代synchronizedMap时,我们都必须将迭代器包含在synchronized block 中?

最佳答案

synchronizedMap 的作用是保证在 map m 上执行的(原子)操作将被同步,例如

m.put('somekey', object);

因此,例如,如果您运行需要更多步骤才能完成的操作

  1. 读取一个值
  2. 如果!= null 删除

应该在同步块(synchronized block)中。

对于上面的例子,函数foo可能会向Map m删除或者添加新元素,这会被同步,是的,但是其他线程同时进行可以从 map 上读取。

想象一下没有同步:

  1. 线程 1 调用 i.hasNext() 返回 true
  2. 线程 2 调用 foo,它从映射中删除了最后一个元素
  3. 线程 1 调用 i.next() <- 异常, map 为空

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

相关文章:

collections - 渲染一个 Backbone.js 集合

java - 使用 Guava 将多个 Collections<A> 合并到一个 Collection<B> 中的单个 Collection<A>

java - 使用 Comparable 按 2 个字段比较两个对象 ASC 和 DESC

java - Thymeleaf 使用路径变量到 :href

java - Hashtable 和 Collections.synchronizedMap(HashMap) 的区别

矩阵列表上的 R 冒号运算符

Java - Collections.sort() 性能

Java方法返回多个值

Java 8 流、lambda

java - Android - 动态大型 TextView