如何在方法周围定义的Java方面进行同步?

时间:2011-11-15 09:11:28

标签: java synchronization aspectj

我有一个运行多线程的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()的同步块完成之后开始运行,但是在事务提交之前。因此,由于tx隔离级别,对dao.queryDatabase()的调用尚未在数据库中看到导入的记录。

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

由于 Simon Niederberger

1 个答案:

答案 0 :(得分:0)

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

另外,对我来说,在String s上同步也很有气味。