Jetty 9.3
Java 8
org.eclipse.jetty.websocket.client.WebSocketClient
线程是否安全。
多个线程可以使用此类的单个实例来创建websocket会话(使用connect
方法)吗?
答案 0 :(得分:4)
我无法保证WebSocketClient
100%是线程安全的,但我可以说它在某种程度上是线程安全的。
查看source code,我们发现私有方法initializeClient
已同步:
private synchronized void initializeClient() throws IOException
// Execute the connection on the executor thread
executor.execute(promise);
该类的文档没有提及线程安全性,但是initializeClient
方法中同步connect
方法的调用以及Executor
的使用是一些形式的明显迹象支持多线程。
==编辑==
通常只为某些类型的操作保证线程安全。例如,它只能用于读操作而不能用于写操作。这是文档的作用,用于定义线程安全的条件。 Sergio Montoro的评论是对的,如果一个线程在另一个线程使用它时修改了对象,可能会发生奇怪的事情。在WebSocketClient
线程安全的情况下,当然至少要限制其他线程对对象的非修改,或WebSocketClient
内部状态的同步和协调修改。
答案 1 :(得分:4)
不是,从the code这里至少有一个例子:
connect()
的目的是提供与远程websocket端点建立连接的方法。
这是通过调用WebSocketClient
方法来实现的,该方法返回Future Session。好吧,现在想象一下
线程1实例化setCookieStore()
并调用connect(Object websocket, URI toUri)
主题1调用connect()
。
内部ClientUpgradeRequest request = new ClientUpgradeRequest(toUri)
线程1执行
request.setRequestURI(toUri)
和
setCookieStore(CookieStore cookieStore)
线程2执行{{1}}
然后,线程1创建的请求可能具有与线程2的URI相对应的cookie。
为了确保线程安全,在整个连接过程中,对象的内部状态应该是不可修改的。