【发布时间】:2014-06-08 22:08:51
【问题描述】:
如果我有一个ReentrantReadWriteLock,并且我将它用作同步块中的锁,其他线程还能释放它们的锁吗?
例如:
ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
public void doSomething() {
synchronized(lock) {
lock.readLock().lock();
// do stuff
lock.readLock().unlock();
}
}
如果我调用doSomething() 并且另一个线程已经持有读锁,那个线程可以释放读锁吗?
当我调用doSomething() 时,我将在ReentrantReadWriteLock 上进行同步,然后尝试获取读锁。由于某些东西已经持有读锁,我将阻塞直到该锁被释放。我很想知道读锁是否可以被释放,因为我已经在锁本身上进行了同步。
【问题讨论】:
-
呃,既然你一开始就使用锁,为什么还要同步呢?此外,您应该锁定在
try块前面并在finally块中解锁 -
这是现有代码。我试图找出死锁的根源。我最初认为这是一个哲学家进餐问题,但涉及三个线程。如果由我决定,我什至不会首先包含读/写锁。
-
我不确定您的确切问题是什么。但是
lock.readLock()可以被多个线程获取。关于这段代码......我认为是“过度同步”(如果这个词甚至存在:))并且在我看来使用错误。当你删除同步的块代码时,会发生同样的事情 -
还有写锁。但我认为在示例中只有一种锁类型会更简单。
标签: java multithreading synchronization locking