2014-02-14 4 views
3

setAttribute (link)를 호출 할 때 필요하다는 것을 알고 있지만 getAttirbute는 어떻습니까?Vaadin 7에서 VaadinSession getAttribute를 호출 할 때 잠금이 필요합니다.

이 정보가 맞습니까?

public Object getMyAttribute() { 
    return VaadinSession.getCurrent().getAttribute("myAttribute"); 
} 

잠금이 필요합니까?

public Object getMyAttribute() { 
    try { 
     VaadinSession.getCurrent().getLockInstance().lock(); 
     return VaadinSession.getCurrent().getAttribute("myAttribute"); 
    } finally { 
     VaadinSession.getCurrent().getLockInstance().unlock(); 
    } 
} 

답변

5

the answer by Patton에 추가 할 수 있습니다. 본인은이 주제에 대한 전문가는 아니지만 문서를 철저히 읽고 Roland Krüger가 this post을 읽은 후에 저의 이해를 게시하고 있습니다.

결말 : 나는 당신의 질문에 대한 정확한 답을 알고하지 않지만 모의 질문

, 나는 질문은 논쟁 믿습니다.

Vaadin 7.1 이상에서는 자동으로 잠금 장치을 처리합니다. 의사는 자동 잠금 방식이 수동 잠금 방식보다 선호된다고 말합니다. 메인 쓰레드

비 문제는 보통 주 angel이라는 사용자 인터페이스 스레드 내에서 VaadinSession에 액세스 한 후 명시 적으로 잠금이 필요하지 않은 경우. Vaadin은 메인 스레드에서 작업 할 때 필요에 따라 VaadinSession을 자동으로 잠급니다.

모든 앱 상태는 해당 세션 개체에 저장되므로 Vaadin은 해당 세션을 정기적으로 액세스하고 보호합니다. 당신이 시작 스레드에서 백그라운드 스레드에서 VaadinSession 액세스하는 경우

다른 스레드

잠금에만 문제입니다.

  • access 방법 방법
  • access 객체 VaadinSession에 : 심지어이 경우

    는, 만약 angel는 이러한 "접근"방법 중 하나에 Runnable를 전달하면 잠금이 자동으로 처리됩니다 옵션의 쌍을 제공 on UI 오브젝트

코드는 UI 오브젝트를 만지지 않고 VaadinSession에만 영향을줍니다 (사용자 인터페이스 , 레이아웃, 위젯 구성 요소 등)를 입력 한 다음 첫 번째 인 VaadinSession.access()을 사용하십시오.반면에 코드가 VaadinSession을 직접 처리 할뿐만 아니라 UI 객체에 영향을주는 경우 두 번째 인 UI.access()을 사용하십시오.

당신이 VaadinSession에 액세스하는 동안 잠금을 관리 할 수 ​​있습니다 동안

그래서, 당신은 어떤 이유로 백그라운드 스레드 에 당신도 access를 호출하지 않도록 경우에만 할 필요가 불필요한 수동 잠금 방법. 그러나 나는 그런 이유를 상상할 수 없다.


더 논의

내가 만든 groovy diagramhow to put data in session variable and get the data in different page in vaadin?이 비슷한 질문을 참조하십시오.

+0

흠, 네 말이 맞아, 나에게 명확하지 않았다. Vaadin은 주 스레드의 잠금을 처리하므로 ** setAttribute 또는 getAttribute (가시성 보증)를 호출하면 잠금 **이 발생합니다. – Krayo

+0

나는 당신이 절대적으로 정확하다고 생각합니다, 바질. 당신의 대답에 더할 것이 없습니다. VaadinSession이나 UI 객체에 대한 동시 접근은'access()'메소드를 통해 수행하는 것이 바람직합니다. 주 스레드에서 이러한 개체에 액세스 할 때 잠금을 수행 할 필요가 없습니다. 위에서 언급 한 [블로그 게시물] (https://blog.oio.de/2013/02/22/vaadins-variable-scopes-vaadinsession-and-ui)을 작성할 때 Vaadin 7.1은 아직 공개되지 않았으며 명시 적으로 공개되지 않았습니다. 이 기사에서 설명한대로 세션 잠금을 수행해야했습니다. 그에 따라 블로그 게시물을 업데이트 할 예정입니다. –

+0

@ RolandKrüger 내 의견을 확인해 주셔서 감사합니다. 그것은 그것이 옳다는 안도입니다. 스레딩은 까다로운 일입니다! Vaadin이 쉽게 볼 수있게 된 것을 기쁘게 생각합니다. –

2

다른 백그라운드 스레드에서 Vaadin 세션에 액세스하려고하면 잠금에 액세스해야합니다. 그렇지 않으면 실제로는 필요하지 않습니다. Vaadin 서비스가 자동으로이를 수행합니다. 즉, vaadin 프레임 워크가 메소드를 호출하기 전에 UI에서 일부 조작을 수행하면 프레임 워크가 세션에 대한 잠금을 갖게됩니다.

다른 스레드에서 세션 변수에 액세스하려고하면 다음과 같이 세션 변수에 액세스해야합니다.

  UI.getCurrent().access(new Runnable() { 

       @Override 
       public void run() { 

        Thread thread = new Thread(new Runnable(){ 
         //TODO Write your logic to perform some session related action 

        }); 
        thread.start(); 

       } 
      }); 

희망이 당신