当前位置: 首页 > 面试题库 >

Java:在基元上同步吗?

陆斌
2023-03-14
问题内容

在我们的系统中,我们有一个方法,当使用某个ID进行调用时,该方法可以完成一些工作:

public void doWork(long id) { /* ... */ }

现在,可以同时为不同的ID进行这项工作,但是如果由2个线程使用相同的ID调用该方法,则应阻塞一个线程直到完成。

最简单的解决方案是拥有一个从Long ID映射到我们可以锁定的任意对象的Map。我预见到的一个问题是,系统中可以有大量的ID,并且此映射每天都会增长。

理想情况下,我认为我们需要一个系统,在该系统中,每个线程都将获取一个锁定对象,在可能的情况下锁定,进行工作,然后发出信号,表明已完成锁定。如果很明显没有其他人在使用此特定锁,则可以安全地将其从锁映射中删除,以防止内存泄漏。

我想这肯定是一个很常见的情况,所以我希望那里有一个现有的解决方案。有人知道吗?


问题答案:

我前段时间为自己发明了类似的东西。我称它为等价类锁,意思是,它锁上所有与给定事物相等的事物。您可以从我的github上获取它,如果愿意的话,可以使用Apache
2许可的证书,也可以直接阅读并忘记它!



 类似资料:
  • 问题内容: 代码段-1 代码段-2 我在第一个代码段中遇到了竞争。我知道这是因为我正在获得对不可变对象(类型为Integer)的锁定。 我已经写了第二个代码片段,这再次使“布尔”不变。但这有效(输出运行中不显示竞争条件)。如果我正确理解了上一个问题的解决方案,则以下是出现问题的一种可能方法 线程1锁定由指向的对象(例如A) 线程2现在试图获取由指向的对象的锁,并进入A的等待队列。 线程1进入同步块

  • 我想基于输入参数同步一个方法或一个块。 因此,我有一个API,它在post有效负载中有两个长类型的输入(比如id1和id2),可以是原始的,也可以是包装的),可以是JSON。这个API将被多个线程同时或随机地在不同时间调用。 现在如果第一个API调用有ID1=1和ID2=1,同时另一个API调用有ID1=1和ID2=1,它应该等待第一个API调用处理完毕后再执行第二个调用。如果第二个API调用具有

  • 请看下面给我带来麻烦的方法: 然后是run方法:

  • 跟进这个问题(Java线程安全-多原子操作?),我不想再增加更多的问题,但现在我有一个疑问: 应该是这样的: 为了保证线程安全。对吗? 所以操作是原子的,但将它们组合起来需要同步,对吗?在这一点上,只使用简单的 HashMap 而不是并发 HashMap 是否有意义,因为我们手动处理同步? CHM中是否有任何方法可以原子地使其工作?

  • 我试图理解java中同步块的概念。根据我读过的文档,我明白如果我们获取一个锁(使用实例变量的同步块),那么我们就不能在该类中的同一对象上获取同步锁。但是当我尝试实际使用以下片段时,我发现我的理解出了问题。 即我能够同时以两种不同的方法获取锁(同一实例变量上的同步块)。当线程启动时,它将转到run方法并无限期地等待,并且不会从同步块中出来。同时,如果我使用相同的线程调用stop方法,它会进入同步块并

  • 问题内容: 我想知道如果在同一个对象上同步两次,在Java中是否会出现任何奇怪的行为? 场景如下 两种方法都使用该对象并对其进行同步。当第一个方法调用第二个方法时,它会被锁定而停止吗? 我不这么认为,因为它是同一个线程,但是我不确定是否可能会出现其他任何奇怪的结果。 问题答案: 同步块使用 可重入 锁,这意味着如果线程已经持有该锁,则它可以重新获取它而不会出现问题。因此,您的代码将按预期工作。 请