Java CDI @ApplicationScoped同步/异步访问

时间:2014-10-20 19:49:09

标签: java-ee asynchronous concurrency containers cdi

我正在寻找一段时间,无法弄清楚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)方法来执行此操作。

问题是:

  1. 如果有人打电话将SessionUser放到地图上。是否有其他呼叫暂停,直到第一个看涨期权结束? (例如,我们有额外的,同时的4个调用 - getSession方法2个,add方法2个

  2. 如果某个电话正在尝试getSession。其他同时通话是否也会暂停直至完成?

  3. SynchronizedList和/或AtomicInteger(假设我们有整数列表,因为那个具体情况只是一个例子)用它改变了什么?

  4. 该问题的主题是:@ApplicationScoped能否真正“冻结”我的申请?因为我觉得这是一个真正的瓶颈,因为我不能像在EJB中那样使用@ConcurencyManagement锁。

1 个答案:

答案 0 :(得分:3)

可以同时访问CDI bean上的方法。没有锁定,没有瓶颈,但你的代码可能会出现重入问题。

@ApplicationScoped bean上的方法必须是无状态的或访问线程安全属性:在您的情况下,您应该将HashMap更改为ConcurrentHashMap。