给出一个像这样的单身人士:
@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?
答案 0 :(得分:3)
不,它不会尝试获得写锁定。
容器工作在拦截器内完成,包装了EJB方法调用。例如,当无状态BeanA调用您的单例时,它是通过代理进行的,这使得由容器提供的保证成为可能(获取锁等)。
但是在这种情况下,它只是一个普通的方法调用(stopWaiting),没有被代理包装,因此没有放置魔术的地方。