1 22 package org.jboss.aspects.concurrent; 23 24 import org.jboss.aop.joinpoint.Invocation; 25 26 import java.util.concurrent.locks.ReentrantLock ; 27 28 33 public class MutexAspect 34 { 35 public static class BlockingMutex 36 { 37 protected MutexLocked props; 38 39 public Object acquire(Invocation invocation) throws Throwable 40 { 41 MutexedObject obj = (MutexedObject) invocation.getTargetObject(); 42 ReentrantLock lock = obj.getMutex(); 43 try 44 { 45 lock.lockInterruptibly(); 46 } 47 catch (InterruptedException e) 48 { 49 throw new LockAcquisitionFailureException("Failed to lock for @Mutexed class", e); 50 } 51 52 53 try 54 { 55 return invocation.invokeNext(); 56 } 57 finally 58 { 59 lock.unlock(); 60 } 61 } 62 } 63 64 public static class TryLockMutex 65 { 66 protected MutexLocked props; 67 68 public Object acquire(Invocation invocation) throws Throwable 69 { 70 MutexedObject obj = (MutexedObject) invocation.getTargetObject(); 71 ReentrantLock lock = obj.getMutex(); 72 if (!lock.tryLock()) 73 { 74 throw new LockAcquisitionFailureException("Failed to lock for @Mutexed class"); 75 } 76 77 try 78 { 79 return invocation.invokeNext(); 80 } 81 finally 82 { 83 lock.unlock(); 84 } 85 } 86 } 87 88 89 public static class TimeoutMutex 90 { 91 protected MutexLocked props; 92 93 public TimeoutMutex(MutexLocked props) 94 { 95 this.props = props; 96 } 97 98 public Object acquire(Invocation invocation) throws Throwable 99 { 100 MutexedObject obj = (MutexedObject) invocation.getTargetObject(); 101 ReentrantLock lock = obj.getMutex(); 102 try 103 { 104 if (!lock.tryLock(props.timeout(), props.unit())) 105 { 106 throw new LockAcquisitionFailureException("Failed to acquire permit for @Semaphored class. Timeout reached."); 107 } 108 } 109 catch (InterruptedException e) 110 { 111 throw new LockAcquisitionFailureException("Failed to acquire permit for @Semaphored class", e); 112 } 113 114 115 try 116 { 117 return invocation.invokeNext(); 118 } 119 finally 120 { 121 lock.unlock(); 122 } 123 } 124 } 125 126 127 } 128 | Popular Tags |