gpt4 book ai didi

围绕参数值的Java同步方法

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:06 24 4
gpt4 key购买 nike

考虑以下方法:

public void upsert(int customerId, int somethingElse) {
// some code which is prone to race conditions
}

我想保护此方法免受竞争条件的影响,但这只有在具有相同 customerId 的两个线程同时调用它时才会发生。如果我使整个方法 synchronized ,它会降低效率并且它不是真正需要的。我真正想要的是围绕 customerId 同步它。这可能以某种方式使用 Java 吗?是否有任何内置工具,或者我需要 IntegersMap 用作锁?

如果您认为我在这里做错了什么,也可以随时提出建议:)

谢谢!

最佳答案

您正在寻找的概念称为分段锁定 strip 锁定。为每个客户单独配一把锁太浪费了(锁是相当重量级的)。相反,您希望将您的客户 ID 空间分区到合理数量的分区中,以匹配所需的并行度。通常 8-16 就足够了,但这取决于方法所做的工作量。

这概述了一个简单的方法:

private final Object[] locks = new Object[8];

synchronized (locks[customerId % locks.length]) {
...implementation...
}

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

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