【发布时间】:2016-09-14 12:50:02
【问题描述】:
考虑以下方法:
public void upsert(int customerId, int somethingElse) {
// some code which is prone to race conditions
}
我想保护这个方法免受竞争条件的影响,但这只有在具有相同customerId 的两个线程同时调用它时才会发生。如果我制作整个方法synchronized,它会降低效率,而且它并不是真正需要的。我真正想要的是围绕customerId 同步它。这对Java有可能吗?是否有任何内置工具,或者我需要Map 或Integers 来用作锁?
如果您认为我在这里做错了什么,也可以随时提出建议:)
谢谢!
【问题讨论】:
-
确实感觉错了。也许您应该编辑您的问题,以提供更多关于为什么首先需要同步的详细信息。
-
upsert 听起来像是在执行一些数据库 dml。在这种情况下,您可能正在尝试通过锁定解决事务隔离问题?如果是这样,那将是一个坏主意。
-
@NathanHughes 我正在使用旧版本的 Postgres,其中 upsert 尚不可用 :)
-
也许我没有抓住重点,但你为什么不在 JDBC 事务中做这件事,让 DBMS 为你处理锁定?
标签: java concurrency synchronized