【发布时间】:2016-03-05 07:12:10
【问题描述】:
我正在单个服务器上实现乐观交易 (BOCC)。在提交时,根据当前数据库状态验证读取和写入集(如果自读取后状态已更改,则事务将中止)。如果验证成功,则将所有对象写入数据库。
不同对象集的验证(加上数据库更新)可以是并发的,但必须使用读写锁来保护重叠的对象集。
我使用ReentrantReadWriteLock 来保护验证,效果很好。现在我正在编写一个恢复机制,如果由于某些错误(在验证之后)不是所有对象都写入数据库,它会重复更新过程。
所以恢复会重复数据库写入,然后尝试释放锁(在恢复成功之后)。问题是我尝试从另一个线程释放锁(因为恢复是由另一个后台服务执行的),这会引发IllegalMonitorStateException。 unlock 方法的注释验证了这种行为。
/**
* Attempts to release this lock.
*
* <p>If the current thread is the holder of this lock then
* the hold count is decremented. If the hold count is now
* zero then the lock is released. If the current thread is
* not the holder of this lock then {@link
* IllegalMonitorStateException} is thrown.
*
* @throws IllegalMonitorStateException if the current thread does not
* hold this lock
*/
public void unlock() {
现在我的问题是:如果需要,我可以使用 Java 中的锁吗:
- 独立于获取锁的线程释放锁。
- 拥有读写锁(并可能从读写升级)
- 不等待(阻塞)锁(我只使用
tryLock)?
【问题讨论】:
-
这些页面包含了很多关于java并发编程的基本信息。还包括关于 Reader/Writer Locks 的部分,但它太通用了,对我的用例没有帮助。
-
非线程锁定锁和重入本身就是矛盾的(您需要一些其他标记来确定它是否仍然是同一个执行线程)。但是,如果您只需要一个不关心它创建的富线程的普通锁,那基本上就是一个信号量,如果您需要单独的读写锁,您将不得不自己实现它——这不是微不足道的,但有很多现有的实现看看。
标签: java multithreading concurrency transactions locking