2

我需要同时锁定一些地图项,而没有任何其他线程拦截。我的意思是我想锁定 10 个项目,我认为我需要使用一个循环,但我不想在锁定第 5 个项目后被阻止锁定剩余的 5 个项目。我是否需要使用另一个独立于地图的锁来包装锁定代码块?

4

1 回答 1

1

除了确保以相同的顺序锁定项目之外,我认为没有任何方法可以防止您的用例中出现潜在的死锁(我认为这是您想要防止的)。

在开始锁定之前,请确保您对要锁定的键应用了一些排序(例如仅使用列表和比较器进行自然排序)。在这种情况下,所有锁都将以相同的顺序获取。您仍然可能会遇到这样一种情况,即一个操作将获取1, 2, 3,而另一个操作将获取2, 3, 4。也就是说,第一个操作将成功获取1,但可能会在2.

问题是,你的用例是什么?您可能最好使用不同的方法。如果键始终属于一起,则应用Data Affinity和使用EntryProcessor. 对于其他用例,可能仍然有更好的方法来代替使用多个锁。锁在多线程系统中通常是个坏主意,而且在高度并行的分布式系统中也没有更好的表现。

于 2016-06-03T09:39:01.087 回答