gpt4 book ai didi

java - 如何同步围绕方法定义的 Java 方面?

转载 作者:行者123 更新时间:2023-11-29 09:18:10 26 4
gpt4 key购买 nike

我有一个运行多线程的 Hibernate 事务方法“doImportImpl”。而某些记录需要依次导入,所以代码结构大致是这样的:

public RecordResult doImportImpl(String data) {
RecordResult result = new RecordResult();
.. do some data processing ..
String recordIdentifier = getIdentifier(data);
synchronized(recordIdentifier) {
process record;
}
return result;
}

还有一种不同的交易方法,它也有记录标识符,不能与记录导入并行运行。因此,它也在“记录标识符”上同步。

public void autoProcess(String data) {
String recordIdentifier = getIdentifier(data);
synchronized(recordIdentifier) {
List<Record> records = dao.queryDatabase(recordIdentifier);
for (Record r : records) {
autoprocess record;
}
}
}

这就是问题所在:似乎有时 autoProcess() 方法在 doImportImpl() 的同步块(synchronized block)完成之后开始运行,但在交易之前坚定的。因此,由于 tx 隔离级别,对 dao.queryDatabase() 的调用尚未在数据库中看到导入的记录。

如何确保通过“返回语句”一直持有同步锁,包括方法调用的所有方面(处理 Hibernate 事务管理)?将返回语句放入同步块(synchronized block)是否足够?

谢谢西蒙·尼德伯格

最佳答案

您必须使用数据库锁而不是同步 block 。当您通过 recordIdentifier 查询记录时,请使用 select for update 或您的数据库可用的内容。

此外,对我来说,在 Strings 上同步是有味道的。

关于java - 如何同步围绕方法定义的 Java 方面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8133904/

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