gpt4 book ai didi

java - Java 中是否有基于生成键的线程之间互斥的通用解决方案?

转载 作者:行者123 更新时间:2023-12-02 03:44:52 25 4
gpt4 key购买 nike

假设我有一个 FooClass,它有一个 long 类型的 id:

public class FooClass {
long id;
}

任何类中都有一个具有相似签名的方法:

public void shouldBeSynchronizedForAFooClassId(long fooClassId) {
//does something
}

我能做什么:

  • 我可以使方法同步,但这是一个不必要的瓶颈,因为 FooClassid 1 和 FooClassid 2 可以毫无问题地并行运行。
  • 我可以生成一个带有 id 的字符串并为其创建一个 intern(),然后我可以在该字符串上进行同步(我不喜欢这个想法)
  • 在 Long 上同步也不是一个好主意。
  • 我可以创建一个 Map,其中 id 作为键,受监控的 Object 作为值。在这种情况下,我必须忍受使用同一受监控对象注册线程数量的痛苦,以便能够在任何线程不再使用受监控对象时立即清理它们。

我想,一定有一个现成的解决方案,例如:

  • 可能有一个 LockManager 或其他任何东西,它是用类型泛化的(在我的秋季与上面的 Long 中)。它可以提供一个 runSafely(Runnable run) 方法,该方法将进行封装的互斥,包括如果需要则生成监视器对象,并在之后将其删除。当然,我也必须在这个 runSafely 中获取 id。

某些库中有类似的开箱即用的东西吗?

最佳答案

据我所知,对于您在 JDK 中遇到的问题,还没有任何现成的解决方案。

但是 Guava 有Striped ,这几乎可以满足您的要求。它并不为每个 ID 关联一个锁,而是为每个 ID“ strip ”关联一个锁。这应该足以避免争用。

关于java - Java 中是否有基于生成键的线程之间互斥的通用解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36406889/

25 4 0