我想找一段时间,不知道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个额外的调用-2个用于getSession方法,2个用于add方法)getSession。其他同步通话是否也会暂停,直到通话结束?SynchronizedList和/或AtomicInteger (假设我们有整数列表,因为特定情况只是一个例子)是否改变了它?这个问题的主要主题是:@ApplicationScoped真的可以“冻结”我的应用程序吗?因为我觉得这是一个真正的瓶颈,因为我不能像在EJB中那样使用@ConcurencyManagement锁。
发布于 2014-10-27 18:18:20
可以并发访问can上的方法。没有锁,没有瓶颈,但是您的代码可能会有重新进入的问题。
@ApplicationScoped上的方法必须是无状态的或对线程安全属性的访问:在您的示例中,您应该将HashMap更改为ConcurrentHashMap。
https://stackoverflow.com/questions/26473725
复制相似问题