ReadWriteLock
hạ cấp được cho phép bởi ReentrantReadWriteLock
thực hiện (tryLock()
từ ví dụ dưới đây luôn luôn trả true
):Tại sao không được phép nâng cấp ReadWriteLock?
void downgrade(final ReadWriteLock readWriteLock) {
boolean downgraded = false;
readWriteLock.writeLock().lock();
try {
// Always true, as we already hold a W lock.
final boolean readLockAcquired = readWriteLock.readLock().tryLock();
if (readLockAcquired) {
// Now holding both a R and a W lock.
assert ((ReentrantReadWriteLock) readWriteLock).getReadHoldCount() == 1;
assert ((ReentrantReadWriteLock) readWriteLock).getWriteHoldCount() == 1;
readWriteLock.writeLock().unlock();
downgraded = true;
try {
// Now do some work with only a R lock held
} finally {
readWriteLock.readLock().unlock();
assert ((ReentrantReadWriteLock) readWriteLock).getReadHoldCount() == 0;
assert ((ReentrantReadWriteLock) readWriteLock).getWriteHoldCount() == 0;
}
}
} finally {
if (!downgraded) {
// Never (we were holding a W lock while trying a R lock).
readWriteLock.writeLock().unlock();
}
assert ((ReentrantReadWriteLock) readWriteLock).getReadHoldCount() == 0;
assert ((ReentrantReadWriteLock) readWriteLock).getWriteHoldCount() == 0;
}
}
ý tưởng đằng sau không cho phép nâng cấp khóa một cách tương tự là gì? Phương pháp tryLock()
cho một Viết khóa dưới đây một cách an toàn có thể trở lại true
w/rủi ro oa cho một bế tắc trong sự vắng mặt của chủ đề khác cầm một đọc khóa:
void upgrade(final ReadWriteLock readWriteLock) {
readWriteLock.readLock().lock();
try {
// Always false: lock upgrade is not allowed
final boolean writeLockAcquired = readWriteLock.writeLock().tryLock();
// ...
} finally {
readWriteLock.readLock().unlock();
}
}
Nếu bạn sử dụng Java 8, bạn có thể muốn có một cái nhìn tại 'StampedLock'. Nói chung, bạn có thể muốn xem [video này] (https://www.youtube.com/watch?v=Q_0_1mKTlnY) từ Angelika Langer. Đổ chuông, phải không? ;) – fge