Jetty 9.3
Java 8
Является org.eclipse.jetty.websocket.client.WebSocketClient
безопасным потоком.
Может ли несколько потоков использовать один экземпляр этого класса для создания сеанса websocket (с помощью метода connect
)?
Jetty 9.3
Java 8
Является org.eclipse.jetty.websocket.client.WebSocketClient
безопасным потоком.
Может ли несколько потоков использовать один экземпляр этого класса для создания сеанса websocket (с помощью метода connect
)?
Я не могу гарантировать, что 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
.
Нет, из код здесь приведен хотя бы один пример:
Цель 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.
Чтобы обеспечить безопасность потока, внутреннее состояние объекта должно быть немодифицировано в течение всего процесса соединения.