【发布时间】:2016-06-03 07:50:08
【问题描述】:
我需要同时锁定一些地图项,而没有任何其他线程拦截。我的意思是我想锁定 10 个项目,我认为我需要使用循环,但我不想在锁定第 5 个项目后被阻止锁定剩余的 5 个项目。我是否需要使用另一个独立于地图的锁来包装锁定代码块?
【问题讨论】:
我需要同时锁定一些地图项,而没有任何其他线程拦截。我的意思是我想锁定 10 个项目,我认为我需要使用循环,但我不想在锁定第 5 个项目后被阻止锁定剩余的 5 个项目。我是否需要使用另一个独立于地图的锁来包装锁定代码块?
【问题讨论】:
除了确保以相同的顺序锁定项目之外,我认为没有任何方法可以防止您的用例中出现潜在的死锁(我认为这是您想要防止的)。
在您开始锁定之前,请确保您对要锁定的键应用了一些排序(例如仅使用列表和比较器的自然排序)。在这种情况下,所有锁都将以相同的顺序获取。您仍然可能会遇到这样一种情况,其中一个操作可能会获取1, 2, 3,而另一个操作将获取2, 3, 4。也就是说,第一个操作将成功获取1,但可能会在2 处被阻止。
问题是,您的用例是什么?您可能最好使用不同的方法。如果键 ALWAYS 属于一起,则应用Data Affinity 并使用EntryProcessor 可能更有用。对于其他用例,可能仍然有更好的方法来代替使用多个锁。锁在多线程系统中通常是个坏主意,而且在高度并行的分布式系统中也不会做得更好。
【讨论】: