0

现在我有一个名为 words 的 HashMap 和一个扩展 Thread 类的 Producer 类。

我有一个这样的for循环:

for (int i = 0; i < 10; i++) {
  Producer producer = new Producer(i);
  producer.run();
}

我想让每个生产者在 HashMap 单词中添加一些单词。如果我只是将 HashMap<...> 单词放在 for (int....) 语句中,它会起作用吗?

不是,我应该怎么做才能做到这一点?

4

2 回答 2

1

恐怕您没有准确地指定问题以使其得到回答。

如果我只HashMap<...>写关于for (int....)声明的内容,它会起作用吗?

几乎可以;也就是说,它确实会创建一个新的哈希图(前提是“单词”是对的)。它不会做的是它不会确保地图是同步的。正如@Thilo 在上面的评论中所说,有两种简单的方法可以做到这一点:

  1. ConcurrentHashMap为您提供了一个简单的多线程就绪映射实现
  2. Collections.synchronizedMap包装您选择的地图,使其为多线程环境做好准备

可以在 ConcurrentHashMap 和 Collections.synchronizedMap(Map) 之间有什么区别?

于 2013-07-19T05:20:49.893 回答
0

ConcurrentHashMap 与 HashMap 类非常相似,只是 ConcurrentHashMap 提供内部维护的并发性。这意味着在多线程应用程序中访问 ConcurrentHashMap 时不需要同步块。

//Initialize ConcurrentHashMap instance
ConcurrentHashMap<String, Integer> m = new ConcurrentHashMap<String, Integer>();

//Print all values stored in ConcurrentHashMap instance
for each (Entry<String, Integer> e : m.entrySet())
{
system.out.println(e.getKey()+"="+e.getValue());
}

上面的代码在您的应用程序的多线程环境中是合理有效的。我说“合理有效”的原因是,上面的代码虽然提供了线程安全,但它仍然会降低应用程序的性能。并引入了 ConcurrentHashMap 以提高性能,同时确保线程安全。

为了提高它的性能,您可以根据需要调整以下参数:

  • 初始容量

  • 负载因子

  • 并发级别
于 2013-07-19T05:26:00.137 回答