2014-10-20 6 views
1

잠시 동안 찾고 있는데 CDI 컨테이너가 @ApplicationScoped bean을 처리하는 방법을 알 수 없습니다. 내 말은 - 당신은 같은 클래스 Session이있는 경우 :Java CDI @ApplicationScoped sync/async 액세스

@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 퍼팅됩니다. 첫 번째 퍼팅 콜이 끝날 때까지 다른 통화가 일시 중지됩니까? 일부 전화가 getSession를 시도하는 경우

  2. - (2 getSession 방법이 add하는 방법에 대한 예를 들어 우리는 추가, 동시 신호 4 개 통화를). 다른 동시 통화도 완료 될 때까지 일시 중지됩니까?

  3. SynchronizedList 및/또는 AtomicInteger (특정 상황이 예일 뿐이므로 정수 목록이 있다고 가정)이 변경되었습니다.

그 질문의 주요 주제는 다음과 같습니다. @ApplicationScoped은 내 응용 프로그램을 실제로 "정지시킬 수 있습니까? 왜냐하면 EJB에서와 같이 @ConcurencyManagement 잠금을 사용할 수 없으므로 실제 병목 현상이라고 생각하기 때문입니다.

답변

3

CDI 빈의 메소드에 동시에 액세스 할 수 있습니다. 자물쇠가없고 병목 현상이 없지만 코드에 재진입 문제가있을 수 있습니다.

@ApplicationScoped Bean의 메소드는 상태 비 저장이거나 스레드 안전 속성에 대한 액세스 여야합니다. 사용자의 경우 HashMap을 ConcurrentHashMap으로 변경해야합니다.

+0

예, 알아 냈습니다. 그러나 나는 그것을 확인하고 싶었다. 병목 현상이 없으며 동시에 액세스를 처리해야합니다. – Ziemo

관련 문제