2011-12-28 47 views
0

我要寻找以下问题的解决方案:寻找解决方案来开发互斥

我设计包含一个地图,它是由多个线程操作的Java类。这些线程将有操作包括:

  1. 迭代:会有一个线程迭代的地图,而迭代,它会读取和更新某些项的值
  2. 放:该线程将条目添加到之一地图
  3. 得到:一个或多个线程会读地图定期

具有挑战性的部分是,我不能把互斥体上的所有3种方法,因为迭代将调用get和put,这将导致死锁。

请告诉我如何设计类和互斥体使其工作。

感谢

+0

如果您不必使用互斥锁(用于作业),则最好使用java.util.concurrent中的类,例如ConcurrentHashMap,它可以正确处理迭代器。 – toto2 2011-12-28 18:14:27

回答

1

的当您使用​​关键字时获得的互斥体是可重入的,因此如果迭代已经拥有该互斥体,则在调用get和put时它可以重新获得相同的值。

这就是说,我会创建您的地图成员字段为ConcurrentHashMap。然后,您的iterate将不会有ConcurrentModificationException问题(有关更多详细信息,请参阅ConcurrentHashMap类的javadocs)。同样锁定getput将由ConcurrentHashMap为您处理。

1

有更多的方式来皮肤猫,经典的一个是使用未受保护的专用的get/put方法从迭代,公共get/set方法包装在一个互斥锁