2016-11-30 8 views

답변

4

나는 WebSocketClient이 100 % 스레드 안전하다는 것을 보장 할 수는 없지만, 어느 정도 스레드 안전성을 보장한다고 말할 수 있습니다.

private synchronized void initializeClient() throws IOException 

을하고 connect 방법을 사용하고 있음을 Executor :

// Execute the connection on the executor thread 
executor.execute(promise); 

클래스의 문서는 아무것도 말한다없는 source code 보면

, 우리는 개인 방법 initializeClient가 동기화되는 것을 볼 수 thread의 안전성에 관해서는, 그러나, connect 메서드로부터의 동기화 된 initializeClient 메서드의 호출과 Executor의 사용은, clear sig 어떤 형태의 멀티 스레딩이 지원됩니다.

== 편집 ==

스레드 안전은 종종 작업의 특정 유형을 보장한다. 예를 들어 읽기 조작에만 보장되고 쓰기 조작에는 보장 될 수 없습니다. 이것은 스레드 안전 조건을 정의하는 문서의 역할입니다. Sergio Montoro의 말은 맞습니다. 하나의 스레드가 다른 스레드에 의해 사용되는 동안 객체를 수정하면 이상한 일이 발생할 수 있습니다. WebSocketClient의 경우 스레드 안전성은 다른 스레드에 의한 개체의 비 수정이나 내부 상태의 동기화되고 일치 된 수정에만 확실히 제한됩니다.

WebSocketClient의 목적은 원격 웹 소켓 엔드 포인트에 대한 연결을 확립 평균을 제공하는 것입니다 : the code 여기 왜 적어도 하나의 예이다에서

+0

+1 WebSocketClient는 thread-safe로 작성되었습니다. _code가 때때로 bugs_를 포함 할 수 있다는 사실은 이것이 다중 스레드 코드가 아니라는 것을 의미하지는 않습니다. –

4

그것은 아니다.

이 작업은 Future Session을 반환하는 connect() 메서드를 호출하여 수행됩니다. 좋아, 이제

  1. 스레드 1이 WebSocketClient을 인스턴스화하고 setCookieStore()

  2. 스레드 1 개 통화 connect(Object websocket, URI toUri) 호출 상상.connect() 스레드 1 내부

  3. ClientUpgradeRequest request = new ClientUpgradeRequest(toUri) 
    

    실행
    request.setRequestURI(toUri) 
    
  4. 스레드 2이어서 실 (1)에 의해 생성 된 요청은 쿠키에 대응 가질 수 setCookieStore(CookieStore cookieStore)

실행 스레드의 URI 2.

스레드 안전을 보장하기 위해 개체의 내부 상태가 전체 연결 프로세스 중에 수정 불가능해야합니다.

+0

WebSocketClient에있는 쿠키 저장소가 다른 호출간에 공유되어야하는 공통 쿠키를 설정하는지 확인하지 못했습니다. 요청 별 쿠키는 ClientUpgradeRequest에서 setCookies로 설정해야합니다. – benbenw

+0

쿠키 저장소가 여러 스레드에서 공유되도록 의도 된 경우에는 '휘발성 (volatile)'으로 선언해야합니다. 그렇지 않으면 스레드가 값을 변경할 수 있고 다른 스레드는 변경 사항을 볼 수 없습니다. 또한 클래스에서 두 세트의 쿠키를 유지하는 방법을 보지 못했습니다. 즉, 스레드 하위 집합과 스레드 하위 집합간에 공유됩니다. 또한, 쿠키를 두 개의 하위 집합으로 나누는 합리적인 사용 사례를 생각할 수 있습니까? –