gpt4 book ai didi

java - 从外部同步访问 HashMap

转载 作者:行者123 更新时间:2023-12-04 06:14:52 24 4
gpt4 key购买 nike

我有一个私有(private) HashMap我正在使用 Collections.synchronizedMap()在上面。 API 表示,迭代 map 时它并不是真正的“线程安全”。我一般用Map.entrySet()迭代 map ,所以我认为 map 需要像 API 所示的手动同步块(synchronized block)。但是从外部我无法在 map 引用上同步,因为它是私有(private)的......我想知道我是否应该为实际的 map 引用提供一个 setter/getter (也许这不是好的 OOP 设计),或者返回一个深拷贝 map ? (也许这很慢)。我不知道在这种情况下最好的方法是什么。有人可以给出一些想法或告诉我面对这种情况的最典型方式是什么?

最佳答案

我强烈推荐使用 ConcurrentHashMap如果您确实需要同时访问 HashMap。这是 Java 5+ 的 util.concurrent 包的一部分。它在多线程环境中的性能比同步包装器要好得多。

如果您无法控制 map 的创建方式(也许它在第三方库中),那么您需要在迭代它时同步访问。查看 Collections.synchronizedMap 的 JavaDocs了解更多信息。这是 API 文档中包含的示例代码。

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

关于java - 从外部同步访问 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7381856/

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