首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jetty websocket客户端类WebSocketClient线程安全吗?

Jetty websocket客户端类WebSocketClient线程安全吗?
EN

Stack Overflow用户
提问于 2016-12-01 05:08:24
回答 2查看 1.7K关注 0票数 10

Jetty 9.3

Java 8

org.eclipse.jetty.websocket.client.WebSocketClient线程安全的。

多线程是否可以使用该类的单个实例来创建websocket会话(通过connect方法)?

EN

回答 2

Stack Overflow用户

发布于 2016-12-14 05:22:47

我不能保证WebSocketClient是100%线程安全的,但我可以说它在一定程度上是线程安全的。

查看source code,我们看到私有方法initializeClient是同步的:

代码语言:javascript
复制
private synchronized void initializeClient() throws IOException 

并且connect方法使用的是Executor

代码语言:javascript
复制
// Execute the connection on the executor thread
executor.execute(promise);

该类的文档没有提到线程安全,但是从connect方法调用同步的initializeClient方法和使用Executor清楚地表明支持某种形式的多线程。

==编辑==

线程安全性通常只对某些类型的操作有保证。例如,它只能保证用于读操作,而不能用于写操作。这是文档定义线程安全条件的作用。Sergio Montoro的话是对的,如果一个线程在另一个线程使用对象的过程中修改了对象,可能会发生奇怪的事情。在WebSocketClient的情况下,线程安全至少被限制在其他线程不修改对象的情况下,或者限于WebSocketClient内部状态的同步和协调修改。

票数 4
EN

Stack Overflow用户

发布于 2016-12-15 19:29:34

事实并非如此,来自the code的至少一个例子说明了为什么:

WebSocketClient的目的是提供一种与远程websocket端点建立连接的方法。

这是通过调用connect()方法来实现的,该方法返回Future Session。好了,现在想象一下

线程1实例化并调用setCookieStore()

  1. Thread 1调用connect(Object websocket, URI toUri).
  2. Inside connect()线程1执行

ClientUpgradeRequest请求=新的ClientUpgradeRequest(toUri)

request.setRequestURI(toUri)

  • Thread 2执行setCookieStore(CookieStore cookieStore)

则由线程1创建的请求可以具有对应于线程2的URI的cookie。

为了保证线程的安全性,在整个连接过程中,对象的内部状态应该是不可修改的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40898222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档