如何使用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();
}
我有两种方法,一种是阅读,一种是写作。它们都访问同一个集合并跨多个线程使用。例如,三个线程用于写入,八个线程用于读取。我需要测试我的集合的线程安全性。 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();
}