Java两阶段锁定IllegalMonitorException

时间:2018-12-12 13:30:34

标签: java concurrency locking

我正在尝试用Java实现数据库的两阶段锁定。它不是一个真正的数据库,只是为此问题实现的简单SQL数据库。

我需要获取数据库以执行如下查询:

SELECT * FROM account WHERE aid=%0 OR aid=%1 FOR UPDATE;

该问题表明我们必须获取表级和行级锁才能执行此查询。这是我目前所在的位置:

  1. 使用ReentrantLock()锁定表
  2. 访问所有满足查询条件的行
  3. 临时存储这些行,然后对其进行排序,然后向其添加锁(对它们进行排序以防止死锁)
  4. 我也向每行添加ReentrantLocks。

这有效,但是并发性很小,所以我试图用ReentrantReadWriteLocks替换我的ReentrantLocks。

table.lock.lock()更改为table.rlock.readLock().lock()后,我得到

IllegalMonitorStateException: attempt to unlock read lock, not locked by current thread

基本上,我不知道如何解决此问题。我认为readLock会起作用,因为SQL语句不会修改表。

我也尝试在表上使用writeLock,我的想法是ReentrantLock和WriteLock都是互斥的,但是我又得到了IlegalMonitorStateException

当尝试将行锁从ReentrantLocks更改为ReadLocks时,我也得到IllegalMonitorStateException

有人知道我在做什么错吗?

谢谢!

0 个答案:

没有答案