我正在寻找一段时间,无法弄清楚CDI容器如何处理@ApplicationScoped
bean。我的意思是 - 如果你有课程Session
喜欢:
@ApplicationScoped
public class Session {
Map<User,Session> map = new HashMap<>();
public void add(User user,Session session) {
sessions.put(user,session);
}
public Session getSession(User user) {
return list.get(user);
}
}
每次用户登录时都会调用方法addSession(Session session, User user)
。假设我们想要不时检索用户的会话 - 我们可以通过调用getSession(User user)
方法来执行此操作。
问题是:
如果有人打电话将Session
和User
放到地图上。是否有其他呼叫暂停,直到第一个看涨期权结束? (例如,我们有额外的,同时的4个调用 - getSession
方法2个,add
方法2个
如果某个电话正在尝试getSession
。其他同时通话是否也会暂停直至完成?
SynchronizedList
和/或AtomicInteger
(假设我们有整数列表,因为那个具体情况只是一个例子)用它改变了什么?
该问题的主题是:@ApplicationScoped
能否真正“冻结”我的申请?因为我觉得这是一个真正的瓶颈,因为我不能像在EJB中那样使用@ConcurencyManagement
锁。
答案 0 :(得分:3)
可以同时访问CDI bean上的方法。没有锁定,没有瓶颈,但你的代码可能会出现重入问题。
@ApplicationScoped bean上的方法必须是无状态的或访问线程安全属性:在您的情况下,您应该将HashMap更改为ConcurrentHashMap。