Jetty 9.3
Java 8
是org.eclipse.jetty.websocket.client.WebSocketClient线程安全的。
多线程是否可以使用该类的单个实例来创建websocket会话(通过connect方法)?
发布于 2016-12-14 05:22:47
我不能保证WebSocketClient是100%线程安全的,但我可以说它在一定程度上是线程安全的。
查看source code,我们看到私有方法initializeClient是同步的:
private synchronized void initializeClient() throws IOException // Execute the connection on the executor thread
executor.execute(promise);该类的文档没有提到线程安全,但是从connect方法调用同步的initializeClient方法和使用Executor清楚地表明支持某种形式的多线程。
==编辑==
线程安全性通常只对某些类型的操作有保证。例如,它只能保证用于读操作,而不能用于写操作。这是文档定义线程安全条件的作用。Sergio Montoro的话是对的,如果一个线程在另一个线程使用对象的过程中修改了对象,可能会发生奇怪的事情。在WebSocketClient的情况下,线程安全至少被限制在其他线程不修改对象的情况下,或者限于WebSocketClient内部状态的同步和协调修改。
发布于 2016-12-15 19:29:34
事实并非如此,来自the code的至少一个例子说明了为什么:
WebSocketClient的目的是提供一种与远程websocket端点建立连接的方法。
这是通过调用connect()方法来实现的,该方法返回Future Session。好了,现在想象一下
线程1实例化并调用setCookieStore()
connect(Object websocket, URI toUri).connect()线程1执行ClientUpgradeRequest请求=新的ClientUpgradeRequest(toUri)
和
request.setRequestURI(toUri)
setCookieStore(CookieStore cookieStore)则由线程1创建的请求可以具有对应于线程2的URI的cookie。
为了保证线程的安全性,在整个连接过程中,对象的内部状态应该是不可修改的。
https://stackoverflow.com/questions/40898222
复制相似问题