/** * Releases in shared mode. Implemented by unblocking one or more threads if * {@link #tryReleaseShared(int, Object, Object)} returns true. * * @throws IllegalMonitorStateException * If releasing would place this synchronizer in an illegal state or * lock is not held by the calling thread. This exception must be * thrown in a consistent fashion for synchronization to work * correctly. */ public final void releaseReadLock() { tryReleaseShared(); this.sync.signalSharedWaiters(); }
/** * @see ReadWriteLockObject#releaseReadLock() */ public void releaseReadLock() { final boolean traceLock = traceLock(); if (traceLock) { SanityManager.DEBUG_PRINT(GfxdConstants.TRACE_LOCK, fillSB( new StringBuilder("releaseReadLock: releasing ") .append("read lock for ")).toString()); } final boolean result = tryReleaseShared(0 /* not used */, null /* not used in release */, null); if (result) { this.sync.signalSharedWaiters(); } if (traceLock) { SanityManager.DEBUG_PRINT(GfxdConstants.TRACE_LOCK, fillSB( new StringBuilder("releaseReadLock: read lock release ") .append(result ? "successful" : "unsuccessful").append( " for lock ")).toString()); } }
/** * @see ReadWriteLockObject#releaseReadLock() */ public void releaseReadLock() { final boolean traceLock = traceLock(); if (traceLock) { SanityManager.DEBUG_PRINT(GfxdConstants.TRACE_LOCK, fillSB( new StringBuilder("releaseReadLock: releasing ") .append("read lock for ")).toString()); } final boolean result = tryReleaseShared(0 /* not used */, null /* not used in release */, null); if (result) { this.sync.signalSharedWaiters(); } if (traceLock) { SanityManager.DEBUG_PRINT(GfxdConstants.TRACE_LOCK, fillSB( new StringBuilder("releaseReadLock: read lock release ") .append(result ? "successful" : "unsuccessful").append( " for lock ")).toString()); } }
/** * @see ReadWriteLockObject#releaseReadLock() */ public void releaseReadLock() { final boolean traceLock = traceLock(); if (traceLock) { SanityManager.DEBUG_PRINT(GfxdConstants.TRACE_LOCK, fillSB( new StringBuilder("releaseReadLock: releasing ") .append("read lock for ")).toString()); } final boolean result = tryReleaseShared(0 /* not used */, null /* not used in release */, null); if (result) { this.sync.signalSharedWaiters(); } if (traceLock) { SanityManager.DEBUG_PRINT(GfxdConstants.TRACE_LOCK, fillSB( new StringBuilder("releaseReadLock: read lock release ") .append(result ? "successful" : "unsuccessful").append( " for lock ")).toString()); } }
Node s = node.next; if (s == null || s.isShared()) signalSharedWaiters();
/** * Signal any waiting threads in the {@link QueuedSynchronizer}. By default * the {@link QueuedSynchronizer} is obtained by a call to * {@link #getQueuedSynchronizer}. */ protected void signalQueuedSynchronizer(final Object context, final boolean shared) { final QueuedSynchronizer sync = getQueuedSynchronizer(context); if (shared) { sync.signalSharedWaiters(); } else { sync.clearOwnerThread(); sync.signalWaiters(); } }
/** * @see ExclusiveSharedSynchronizer#signalQueuedSynchronizer(Object, boolean) */ @Override protected final void signalQueuedSynchronizer(final Object context, final boolean shared) { if (hasWaiters()) { // if there is waiting thread queue then need to empty that too final CustomEntryConcurrentHashMap<RegionEntry, QueuedSynchronizer> lockWaiters = ((LocalRegion)context).getLockWaiters(); final QueuedSynchronizer sync = lockWaiters.get(this); if (sync != null) { if (shared) { sync.signalSharedWaiters(); } else { sync.clearOwnerThread(); sync.signalWaiters(); } } } }