EJB Singleton-Lock READ方法调用同一实例的Lock WRITE方法



给定一个像这样的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(,没有被代理封装,所以没有神奇的地方。

最新更新