2014-10-20 101 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