我需要同时锁定一些地图项而不需要任何其他线程拦截。我的意思是我要锁定10个项目,我想我需要使用一个循环,但我不希望在锁定第5个项目后锁定剩余的5个项目。我是否需要使用另一个与地图无关的锁定包装锁定代码块?
答案 0 :(得分:1)
我不认为除了确保以相同的顺序锁定项目之外,还有任何方法可以防止用例中的潜在死锁(我认为这是您想要阻止的)。
在开始锁定之前,请确保对要锁定的键应用了一些排序(例如仅使用List和Comparator进行自然排序)。在这种情况下,将以相同的顺序获取所有锁。仍然可能会遇到这样的情况,即一个操作可能获得1, 2, 3
,另一个操作将获得2, 3, 4
。这表示第一个操作将成功获得1
但可能会在2
被阻止。
问题是,你的用例是什么?你可能更善于使用不同的方法。如果密钥始终属于一起,则应用Data Affinity
并使用EntryProcessor
可能更有用。对于其他用例,可能仍有更好的方法,而不是使用多个锁。在多线程系统中,锁通常是一个坏主意,并且在高度并行的分布式系统中它们不会做得更好。