2014-10-20 106 views
1

我正在寻找一段时间,无法弄清楚CDI容器如何对待@ApplicationScoped bean。我的意思是 - 如果你有类Session,如:Java CDI @ApplicationScoped同步/异步访问

@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到地图中。其他电话暂停,直到第一个电话会议结束? (例如,我们有额外的,simutaneous 4个通话 - 2 getSession方法和2 add方法)

  2. 如果某些呼叫试图getSession。其他同时通话也会暂停,直至完成?

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

该问题的主题是:@ApplicationScoped真的能“冻结”我的应用程序吗?因为我觉得它是一个真正的瓶颈,因为我不能像EJB那样使用@ConcurencyManagement锁。

回答

3

CDI bean上的方法可以同时访问。没有锁,没有瓶颈,但是你的代码可能存在再入口问题。

@ApplicationScoped bean上的方法必须是无状态的或者可以访问线程安全属性:在你的情况下,你应该把HashMap改成一个ConcurrentHashMap。

+0

是的,我想通了。但我想确认一下。你没有瓶颈,但也需要处理并发访问。 – Ziemo 2014-10-27 18:21:40