Является ли Jetty Websocket клиентский класс WebSocketClient потоком безопасным?

Jetty 9.3

Java 8

Является org.eclipse.jetty.websocket.client.WebSocketClient безопасным потоком.

Может ли несколько потоков использовать один экземпляр этого класса для создания сеанса websocket (с помощью метода connect)?

Ответ 1

Я не могу гарантировать, что WebSocketClient на 100% безопасен по потоку, но могу сказать, что он должен быть потокобезопасным в определенной степени.

Рассматривая исходный код мы видим, что частный метод initializeClient синхронизируется:

private synchronized void initializeClient() throws IOException 

и что метод connect использует Executor:

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

Документация класса ничего не говорит о безопасности потоков, но вызов синхронизированного метода initializeClient из метода connect и использование Executor являются явными признаками поддержки некоторой формы многопоточности.

== Правка ==

Безопасность потоков часто гарантируется только для определенных типов операций. Например, это может быть гарантировано только для операций чтения, а не для операций записи. В этом заключается роль документации для определения условий безопасности потоков. Замечание Серхио Монторо прав, если один поток изменяет объект во время его использования другим потоком, могут произойти странные вещи. В случае WebSocketClient безопасность потока, безусловно, по крайней мере ограничена немодификацией объекта другими потоками или синхронизированной и согласованной модификацией внутреннего состояния WebSocketClient.

Ответ 2

Нет, из код здесь приведен хотя бы один пример:

Цель WebSocketClient - предоставить среднее значение для установления соединений с удаленными конечными точками websocket.

Это достигается путем вызова метода connect(), который возвращает Future Session. Хорошо, теперь представьте, что

  • Тема 1 создает экземпляр WebSocketClient и вызывает setCookieStore()

  • Тема 1 вызывает connect(Object websocket, URI toUri).

  • Внутри connect() Выполняется выполнение темы 1

    ClientUpgradeRequest request = new ClientUpgradeRequest(toUri)
    

    и

    request.setRequestURI(toUri)
    
  • Тема 2 выполняет setCookieStore(CookieStore cookieStore)

Затем запрос, созданный Thread 1, может иметь файлы cookie, соответствующие URI Thread 2.

Чтобы обеспечить безопасность потока, внутреннее состояние объекта должно быть немодифицировано в течение всего процесса соединения.