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),没有被代理包装,所以没有魔法的地方。
给定一个这样的单身人士:
@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),没有被代理包装,所以没有魔法的地方。