在我们的系统中,我们有一个方法,当使用某个ID进行调用时,该方法可以完成一些工作:
public void doWork(long id) { /* ... */ }
现在,可以同时为不同的ID进行这项工作,但是如果由2个线程使用相同的ID调用该方法,则应阻塞一个线程直到完成。
最简单的解决方案是拥有一个从Long ID映射到我们可以锁定的任意对象的Map。我预见到的一个问题是,系统中可以有大量的ID,并且此映射每天都会增长。
理想情况下,我认为我们需要一个系统,在该系统中,每个线程都将获取一个锁定对象,在可能的情况下锁定,进行工作,然后发出信号,表明已完成锁定。如果很明显没有其他人在使用此特定锁,则可以安全地将其从锁映射中删除,以防止内存泄漏。
我想这肯定是一个很常见的情况,所以我希望那里有一个现有的解决方案。有人知道吗?
我前段时间为自己发明了类似的东西。我称它为等价类锁,意思是,它锁上所有与给定事物相等的事物。您可以从我的github上获取它,如果愿意的话,可以使用Apache 2许可的证书,也可以直接阅读并忘记它!