Java ReentrantReadWriteLock - 正确用法?

时间:2014-05-21 14:26:34

标签: java concurrency java.util.concurrent reentrantreadwritelock

我的网络应用程序遇到了一些并发问题,其中有一个写入数据库已完成,并且可能还有同时读取。写入首先删除所有行,然后插入新行,因此有可能在数据库为空时完成读取,从而导致错误。我使用的是ReentrantReadWriteLock,但我想确保我正确使用它。任何修复都将不胜感激。

private static final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

public static Schedule lookupSchedule()
{
    lock.readLock().lock();
    try
    {
        // read data from the database, manipulate it, return it
    }
    finally
    {
       lock.readLock().unlock();
    }
}

public static void setSchedule()
{
    Connection conn = DB.getConnection();
    lock.writeLock.lock();
    try
    {
       conn.openTransaction();
       // delete all the rows from the table
       // insert all the new rows into the table
       conn.committTransaction();
    }
    catch (Exception ex)
    {
       conn.rollbackTransaction();
    }
    finally
    {
        lock.writeLock.unlock();
    }
}

1 个答案:

答案 0 :(得分:1)

就问题而言:您对ReentrantReadWriteLock的使用是正确的。

关于你的问题:我认为你需要查看有效的事务隔离级别(并可能调整它)。

希望这会有所帮助......

另一个SO线程中的隔离级别说明:what is difference between non-repeatable read and phantom read?

关于隔离级别的Java教程章节:http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html#transactions_data_integrity