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

时间:2018-11-15 10:06:13

标签: java concurrency singleton ejb

给出一个像这样的单身人士:

@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 的调用是否会尝试获得写锁定?还是直接执行它,因为它最初已经获得了READ Lock?

1 个答案:

答案 0 :(得分:3)

不,它不会尝试获得写锁定。

容器工作在拦截器内完成,包装了EJB方法调用。例如,当无状态BeanA调用您的单例时,它是通过代理进行的,这使得由容器提供的保证成为可能(获取锁等)。

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