ReadWriteLock
ढाल (उदाहरण से tryLock()
नीचे हमेशा true
रिटर्न) ReentrantReadWriteLock
कार्यान्वयन द्वारा अनुमति दी है: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;
}
}
एक समान तरीके से एक ताला उन्नयन की अनुमति नहीं दे के पीछे विचार यह क्या था? एक लिखें ताला के लिए tryLock()
विधि नीचे सुरक्षित रूप से अन्य धागे के अभाव में true
w/oa जोखिम लौट सकते हैं एक गतिरोध के लिए एक पढ़ें ताला पकड़े:
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();
}
}
नाकाम रहे हैं आप जावा 8 का उपयोग करते हैं बनाने के लिए प्रयास करता है, आप 'StampedLock' पर एक नजर है कर सकते हैं। अधिक आम तौर पर, आप एंजेलिका लैंगर से [इस वीडियो] (https://www.youtube.com/watch?v=Q_0_1mKTlnY) पर एक नज़र डालना चाहते हैं। एक घंटी बजती है, है ना? ;) – fge