如何让多个线程在Java中操作一个数据对象

时间:2013-07-19 05:10:56

标签: java multithreading

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

我有一个类似的for循环:

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

我想让每个制作人在HashMap词中添加一些单词。如果我只是把HashMap&lt; ...&gt;关于for(int ....)语句的话?

不是,我该怎么做才能实现这个目标?

2 个答案:

答案 0 :(得分:1)

我担心你没有准确地指出这个问题,以便得到回答。

  

如果我只是在HashMap<...>语句中添加for (int....)字词,它是否有效?

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

  1. ConcurrentHashMap为您提供了一个简单的多线程就绪地图实现
  2. Collections.synchronizedMap包含您选择的地图,为多线程环境做好准备
  3. 可以在What's the difference between ConcurrentHashMap and Collections.synchronizedMap(Map)?

    找到方法的优缺点(以及更多方法)

答案 1 :(得分: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是为了在确保线程安全的同时提高性能。

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

  • 参数:initialCapacity

  • loadFactor

  • concurrencyLevel