给定一个像这样的Singleton:
@Singleton
public class waitingTimeManager {
private Map<Integer, Object> waitingTimes;
@PostConstruct
public void setup() {
waitingTimes = new HashMap<>();
}
@Lock(LockType.READ)
public boolean shouldWeWait(Integer id) {
if (waitingTimes.containsKey(id)) {
boolean wait = someLogic(waitingTimes.get(id));
if (!wait) {
// we don't need to wait for it anymore
stopWaiting(id);
}
return wait;
}
return false;
}
@Lock(LockType.WRITE)
public void stopWaiting(Integer id){
waitingTimes.remove(id);
}
}
初始方法shouldWeWait可以由多个线程同时访问。另一个stopWaiting将需要获得写锁定。
对的调用是否会在内部停止等待?WeWait是否应该尝试获取写入锁定?还是简单地执行它,因为它最初已经获得了READ锁定?
不,它不会尝试获得写锁定。
容器工作在拦截器中完成,包装EJB方法调用。例如,当无状态BeanA调用您的singleton时,它通过代理进行调用,这使得容器提供的保证(检索锁等(成为可能
但在这种情况下,它只是一个普通的方法调用(stopWaiting(,没有被代理封装,所以没有神奇的地方。