我要寻找以下问题的解决方案:寻找解决方案来开发互斥
我设计包含一个地图,它是由多个线程操作的Java类。这些线程将有操作包括:
- 迭代:会有一个线程迭代的地图,而迭代,它会读取和更新某些项的值
- 放:该线程将条目添加到之一地图
- 得到:一个或多个线程会读地图定期
具有挑战性的部分是,我不能把互斥体上的所有3种方法,因为迭代将调用get和put,这将导致死锁。
请告诉我如何设计类和互斥体使其工作。
感谢
我要寻找以下问题的解决方案:寻找解决方案来开发互斥
我设计包含一个地图,它是由多个线程操作的Java类。这些线程将有操作包括:
具有挑战性的部分是,我不能把互斥体上的所有3种方法,因为迭代将调用get和put,这将导致死锁。
请告诉我如何设计类和互斥体使其工作。
感谢
的当您使用关键字时获得的互斥体是可重入的,因此如果迭代已经拥有该互斥体,则在调用get和put时它可以重新获得相同的值。
这就是说,我会创建您的地图成员字段为ConcurrentHashMap
。然后,您的iterate
将不会有ConcurrentModificationException
问题(有关更多详细信息,请参阅ConcurrentHashMap
类的javadocs)。同样锁定get
和put
将由ConcurrentHashMap
为您处理。
有更多的方式来皮肤猫,经典的一个是使用未受保护的专用的get/put方法从迭代,公共get/set方法包装在一个互斥锁
如果您不必使用互斥锁(用于作业),则最好使用java.util.concurrent中的类,例如ConcurrentHashMap,它可以正确处理迭代器。 – toto2 2011-12-28 18:14:27