gpt4 book ai didi

Java同步取决于方法参数

转载 作者:行者123 更新时间:2023-12-02 15:22:49 24 4
gpt4 key购买 nike

如何提供方法参数值的同步?

所有使用“相同”参数值 A 的方法调用都应该同步。使用不同参数值的方法调用,例如即使与 A 的调用已在等待,B 也可以访问。下一次对 B 的并发调用也必须等待第一个 B 被释放。

我的用例:我想在 ID 级别同步对 JPA 实体的访问,但希望避免悲观锁定,因为我需要某种队列。用于锁定的“ key ”旨在作为实体 ID - 实际上是 Java Long 类型。

protected void entityLockedAccess(SomeEntity myEntity) {
//getId() returns different Long objects so the lock does not work
synchronized (myEntity.getId()) {
//the critical section ...
}
}

我读到了有关锁定对象的信息,但我不确定它们如何适合我的情况。在顶层,我想管理对执行关键代码的应用程序的特定 REST 调用。

谢谢,克里斯

最佳答案

据我了解,您基本上希望为每个 SomeEntity 提供不同的、唯一的锁。 ID。

您可以通过 Map<Integer, Object> 来实现这一点.

您只需将每个 ID 映射到一个对象即可。如果已经存在一个对象,则可以重用它。这可能看起来像这样:

static Map<Integer, Object> locks = new ConcurrentHashMap<>();

public static void main(String[] args)
{
int i1 = 1;
int i2 = 2;

foo(i1);
foo(i1);
foo(i2);
}

public static void foo(int o)
{
synchronized (locks.computeIfAbsent(o, k -> new Object()))
{
// computation
}
}

这将在映射中创建 2 个锁对象作为 i1 的对象在第二个 foo(i1) 中重用打电话。

关于Java同步取决于方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51241448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com