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

EJB Singleton - Lock READ method calling a Lock WRITE method of the same instance

给定一个这样的单身人士:

@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 将需要获得写锁。

shouldWeWait 中对 stopWaiting 的调用是否会尝试获取 WRITE 锁?或者简单地执行它,因为它最初已经获得了读锁?

不,它不会尝试获取写锁。

容器作业在拦截器中完成,包装 EJB 方法调用。例如,当无状态 BeanA 调用您的单例时 - 它通过代理执行此操作,这使得容器提供的保证成为可能(检索锁等)。

但在这种情况下,它只是一个普通的方法调用 (stopWaiting),没有被代理包装,所以没有魔法的地方。