Jetty websocket客户端类WebSocketClient线程是否安全?

时间:2016-11-30 21:08:24

标签: java websocket jetty client jetty-9

Jetty 9.3

Java 8

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

多个线程可以使用此类的单个实例来创建websocket会话(使用connect方法)吗?

2 个答案:

答案 0 :(得分:4)

我无法保证WebSocketClient 100%是线程安全的,但我可以说它在某种程度上是线程安全的。

查看source code,我们发现私有方法initializeClient已同步:

private synchronized void initializeClient() throws IOException 

并且connect方法正在使用Executor

// 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. 线程1实例化setCookieStore()并调用connect(Object websocket, URI toUri)

  2. 主题1调用connect()

  3. 内部ClientUpgradeRequest request = new ClientUpgradeRequest(toUri) 线程1执行

    request.setRequestURI(toUri)
    

    setCookieStore(CookieStore cookieStore)
  4. 线程2执行{{1}}

  5. 然后,线程1创建的请求可能具有与线程2的URI相对应的cookie。

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