@PostInjection public void listenForThreadCleanup(PerthreadManager perthreadManager) { perthreadManager.addThreadCleanupCallback(this); }
public void acquireReadLock() { if (isReadLocked() || isWriteLocked()) { return; } lock.readLock().lock(); perthreadManager.addThreadCleanupCallback(new Runnable() { public void run() { // The read lock may have been released, if upgraded to a write lock. if (isReadLocked()) { lock.readLock().unlock(); } } }); }
public void acquireWriteLock() { if (isWriteLocked()) { return; } if (isReadLocked()) { lock.readLock().unlock(); } // During this window, no lock is held, and the next call may block. lock.writeLock().lock(); perthreadManager.addThreadCleanupCallback(new Runnable() { public void run() { // This is the only way a write lock is unlocked, so no check is needed. lock.writeLock().unlock(); } }); } }
@Scope(ScopeConstants.PERTHREAD) public Environment buildEnvironment(PerthreadManager perthreadManager) { final EnvironmentImpl service = new EnvironmentImpl(); perthreadManager.addThreadCleanupCallback(new Runnable() { public void run() { service.threadDidCleanup(); } }); return service; }