/** * Tests {@link LockResource} with {@link ReentrantReadWriteLock}. */ @Test public void reentrantReadWriteLock() { ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); try (LockResource r1 = new LockResource(lock.readLock())) { try (LockResource r2 = new LockResource(lock.readLock())) { assertEquals(lock.getReadHoldCount(), 2); assertTrue(lock.readLock().tryLock()); lock.readLock().unlock(); } } assertEquals(lock.getReadHoldCount(), 0); try (LockResource r1 = new LockResource(lock.writeLock())) { try (LockResource r2 = new LockResource(lock.readLock())) { assertTrue(lock.isWriteLockedByCurrentThread()); assertEquals(lock.getReadHoldCount(), 1); } } assertFalse(lock.isWriteLockedByCurrentThread()); assertEquals(lock.getReadHoldCount(), 0); try (LockResource r = new LockResource(lock.readLock())) { assertFalse(lock.writeLock().tryLock()); } } }
Channel channelToClose = null; Map<Integer, Callback<List<ByteBuffer>>> requestsToCancel = null; boolean stateReadLockHeld = stateLock.getReadHoldCount() != 0; stateLock.readLock().unlock(); stateLock.writeLock().lock(); try { if (channel != null) { stateLock.readLock().lock(); stateLock.writeLock().unlock();
public void writeLockInterruptibly() throws InterruptedException { coarseLock.writeLock().lockInterruptibly(); if (coarseLock.getWriteHoldCount() == 1) { writeLockHeldTimeStampNanos = timer.monotonicNowNanos(); } }
public void testReentrantReadLock_tryLock() throws Exception { LockingThread thread = new LockingThread(readLockA); thread.start(); thread.waitUntilHoldingLock(); assertFalse(writeLockA.tryLock()); assertTrue(readLockA.tryLock()); readLockA.unlock(); thread.releaseLockAndFinish(); assertTrue(writeLockA.tryLock()); assertTrue(readLockA.tryLock()); }
public void testReentrantWriteLock_tryLock() throws Exception { LockingThread thread = new LockingThread(writeLockA); thread.start(); thread.waitUntilHoldingLock(); assertFalse(writeLockA.tryLock()); assertFalse(readLockA.tryLock()); thread.releaseLockAndFinish(); assertTrue(writeLockA.tryLock()); assertTrue(readLockA.tryLock()); }
@Override public boolean tryLock() { aboutToAcquire(readWriteLock); try { return super.tryLock(); } finally { lockStateChanged(readWriteLock); } }
@Override public void lock() { aboutToAcquire(readWriteLock); try { super.lock(); } finally { lockStateChanged(readWriteLock); } }
@Override public void lockInterruptibly() throws InterruptedException { aboutToAcquire(readWriteLock); try { super.lockInterruptibly(); } finally { lockStateChanged(readWriteLock); } }
@Override public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException { aboutToAcquire(readWriteLock); try { return super.tryLock(timeout, unit); } finally { lockStateChanged(readWriteLock); } }
@Override public void unlock() { try { super.unlock(); } finally { lockStateChanged(readWriteLock); } } }
public void testReadWriteLockDeadlock() { writeLockA.lock(); // Establish an ordering from writeLockA -> lockB lockB.lock(); writeLockA.unlock(); lockB.unlock(); // lockB -> readLockA should fail. lockB.lock(); try { readLockA.lock(); fail("Expected PotentialDeadlockException"); } catch (PotentialDeadlockException expected) { checkMessage(expected, "LockB -> ReadWriteA", "ReadWriteA -> LockB"); } }
public void testReadWriteLockDeadlock_treatedEquivalently() { readLockA.lock(); // readLockA -> writeLockB writeLockB.lock(); readLockA.unlock(); writeLockB.unlock(); // readLockB -> writeLockA should fail. readLockB.lock(); try { writeLockA.lock(); fail("Expected PotentialDeadlockException"); } catch (PotentialDeadlockException expected) { checkMessage(expected, "ReadWriteB -> ReadWriteA", "ReadWriteA -> ReadWriteB"); } }
public void testWriteToReadLockDowngrading() { writeLockA.lock(); // writeLockA downgrades to readLockA readLockA.lock(); writeLockA.unlock(); lockB.lock(); // readLockA -> lockB readLockA.unlock(); // lockB -> writeLockA should fail try { writeLockA.lock(); fail("Expected PotentialDeadlockException"); } catch (PotentialDeadlockException expected) { checkMessage(expected, "LockB -> ReadWriteA", "ReadWriteA -> LockB"); } }
public void testReadWriteLockDeadlock_transitive() { readLockA.lock(); // Establish an ordering from readLockA -> lockB lockB.lock(); readLockA.unlock(); lockB.unlock(); // Establish an ordering from lockB -> lockC lockB.lock(); lockC.lock(); lockB.unlock(); lockC.unlock(); // lockC -> writeLockA should fail. lockC.lock(); try { writeLockA.lock(); fail("Expected PotentialDeadlockException"); } catch (PotentialDeadlockException expected) { checkMessage(expected, "LockC -> ReadWriteA", "LockB -> LockC", "ReadWriteA -> LockB"); } }
@Override public boolean tryLock() { aboutToAcquire(readWriteLock); try { return super.tryLock(); } finally { lockStateChanged(readWriteLock); } }
@Override public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException { aboutToAcquire(readWriteLock); try { return super.tryLock(timeout, unit); } finally { lockStateChanged(readWriteLock); } }
@Override public void lockInterruptibly() throws InterruptedException { aboutToAcquire(readWriteLock); try { super.lockInterruptibly(); } finally { lockStateChanged(readWriteLock); } }
@Override public void unlock() { try { super.unlock(); } finally { lockStateChanged(readWriteLock); } } }