import EDU.oswego.cs.dl.util.concurrent.*; import org.aspectj.lang.SoftException; public abstract aspect ReadWriteLockSynchronizationAspect perthis(readOperations() || writeOperations()) { public abstract pointcut readOperations(); public abstract pointcut writeOperations(); private ReadWriteLock _lock = new ReentrantWriterPreferenceReadWriteLock(); before() : readOperations() { _lock.readLock().acquire(); } after() : readOperations() { _lock.readLock().release(); } before() : writeOperations() { _lock.writeLock().acquire(); } after() : writeOperations() { _lock.writeLock().release(); } after() throwing(SoftException ex) throws InterruptedRuntimeException : readOperations() || writeOperations() { throw new InterruptedRuntimeException(ex); } } aspect SoftenInterruptedException { declare soft : InterruptedException : call(void Sync.acquire()) && within(ReadWriteLockSynchronizationAspect); }