围绕参数值的Java同步方法

Ant*_*lev 5 java concurrency synchronized

请考虑以下方法:

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

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

如果您认为我在这里做错了,请随时咨询:)

谢谢!

Mar*_*nik 12

您正在寻找的概念称为分段锁定条带锁定.为每个客户设置一个单独的锁是非常浪费的(锁是非常重量级的).相反,你要划分您的客户ID空间分成分区的合理数量,匹配并行的期望程度.通常8-16就足够了,但这取决于该方法的工作量.

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

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

synchronized (locks[customerId % locks.length]) {
    ...implementation...
}
Run Code Online (Sandbox Code Playgroud)