考虑以下方法:
public void upsert(int customerId, int somethingElse) {
// some code which is prone to race conditions
}
我想保护此方法免受竞争条件的影响,但这只有在两个线程具有相同的条件时才会发生customerId
正在同时调用它。如果我制作整个方法synchronized
它会降低效率,而且并不是真正需要的。我真正想要的是使其同步customerId
。这对于 Java 来说是可能的吗?有没有内置的工具,或者我需要一个Map
of Integers
用作锁?
如果您认为我在这里做错了什么,也请随时提出建议:)
Thanks!
您正在寻找的概念称为分段锁定 or 条纹锁定。为每个客户配备一个单独的锁太浪费了(锁是相当重量级的)。相反,你想要分割将您的客户 ID 空间划分为合理数量的分区,以匹配所需的并行度。通常 8-16 就足够了,但这取决于方法所做的工作量。
这概述了一个简单的方法:
private final Object[] locks = new Object[8];
synchronized (locks[customerId % locks.length]) {
...implementation...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)