寻找开发互斥锁的解决方案

时间:2011-12-28 17:47:34

标签: java multithreading map synchronization mutex

我正在寻找以下问题的解决方案:

我正在设计一个包含地图的java类,该地图由多个线程操纵。这些线程将包含以下操作:

  1. iterate:会有一个迭代地图的线程,迭代时会读取并更新某些条目的值
  2. put:其中一个线程会将条目添加到地图
  3. get:一个或多个线程会定期读取地图
  4. 具有挑战性的部分是,我不能将互斥量放在所有3种方法上,因为iterate将调用get和put,这将导致死锁。

    请告知我如何设计课程和互斥锁以使其正常工作。

    由于

2 个答案:

答案 0 :(得分:1)

有更多方法可以对猫进行换肤,经典的方法是使用来自iterate的不受保护的私有get / put方法,public get / set方法将其包装在互斥锁中

答案 1 :(得分:1)

使用synchronized关键字时获取的互斥锁是可重入的,因此如果iterate已经拥有互斥锁,那么它在调用get和put时可以重新获取互斥锁。

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