我正在寻找以下问题的解决方案:
我正在设计一个包含地图的java类,该地图由多个线程操纵。这些线程将包含以下操作:
具有挑战性的部分是,我不能将互斥量放在所有3种方法上,因为iterate将调用get和put,这将导致死锁。
请告知我如何设计课程和互斥锁以使其正常工作。
由于
答案 0 :(得分:1)
有更多方法可以对猫进行换肤,经典的方法是使用来自iterate的不受保护的私有get / put方法,public get / set方法将其包装在互斥锁中
答案 1 :(得分:1)
使用synchronized
关键字时获取的互斥锁是可重入的,因此如果iterate已经拥有互斥锁,那么它在调用get和put时可以重新获取互斥锁。
也就是说,我将您的地图成员字段创建为ConcurrentHashMap
。然后,您的iterate
不会出现ConcurrentModificationException
个问题(有关详细信息,请参阅ConcurrentHashMap
类的javadoc)。同样,get
和put
的锁定将由ConcurrentHashMap
为您处理。