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?是否有任何内置工具或者我需要Map的Integers是锁使用?
如果您认为我在这里做错了,请随时咨询:)
谢谢!
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)
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |