如何使用JUnit测试读写锁?

How to test read-write lock using JUnit?

我有两种方法,一种是阅读,一种是写作。它们都访问同一个集合并跨多个线程使用。例如,三个线程用于写入,八个线程用于读取。我需要测试我的集合的线程安全性。 write方法优先。

public static void insertEntity(Entity entity) {
        try {
            readWriteLock.writeLock().lock();

            Session session = sf.openSession();
            session.beginTransaction();

            GenericDAO.insertEntity(session, entity);

            session.getTransaction().commit();
            session.close();
        } finally {
            readWriteLock.writeLock().unlock();
        }
    }


public static Entity getByID(Integer id) {
        try {
            readWriteLock.readLock().lock();

            Session session = sf.openSession();
            Entity entity = GenericDAO.selectByID(session, Entity.class, id);

            session.close();
            return entity;
        } finally {
            readWriteLock.readLock().unlock();
        }

    }

如果您想测试您的锁处理,您应该将该逻辑提取到它自己的 class 中。 持有锁时必须做的事情应该封装到一个接口中。 您的生产代码实现将完成实体的工作。您的测试代码实现将强调锁处理(例如断言互斥)

顺便说一句:您的锁定密码不正确。仅当相应的 lock() 成功时,您才应该 unlock() 锁定。模式是这样的:

lock.lock();
try {
    // do stuff
} finally {
    lock.unlock();
}