Java Jetty websocket客户端类websocket客户端线程安全吗?
码头9.3 爪哇8 是线程安全的Java Jetty websocket客户端类websocket客户端线程安全吗?,java,websocket,jetty,client,jetty-9,Java,Websocket,Jetty,Client,Jetty 9,码头9.3 爪哇8 是线程安全的 多个线程是否可以使用此类的单个实例创建websocket会话(使用connect方法)?我不能保证WebSocketClient是100%线程安全的,但我可以说它在一定程度上是线程安全的 查看,我们看到私有方法是同步的: private synchronized void initializeClient() throws IOException 并且该方法使用的是: 该类的文档没有说明线程安全,但是从connect方法调用synchronizediniti
多个线程是否可以使用此类的单个实例创建websocket会话(使用
connect
方法)?我不能保证WebSocketClient
是100%线程安全的,但我可以说它在一定程度上是线程安全的
查看,我们看到私有方法是同步的:
private synchronized void initializeClient() throws IOException
并且该方法使用的是:
该类的文档没有说明线程安全,但是从connect
方法调用synchronizedinitializeClient
方法以及使用Executor
都清楚地表明支持某种形式的多线程
==编辑==
线程安全通常仅在某些类型的操作中得到保证。例如,它只能保证读操作,不能保证写操作。这是文档定义线程安全条件的作用。Sergio Montoro的评论是正确的,如果一个线程在另一个线程使用对象的过程中对其进行修改,可能会发生奇怪的事情。在WebSocketClient
的情况下,线程安全肯定至少限于其他线程不修改对象,或者同步一致地修改WebSocketClient
内部状态。不是,这里至少有一个示例说明了原因:
WebSocketClient
的目的是提供一种与远程websocket端点建立连接的方法
这是通过调用connect()
方法来实现的,该方法返回将来的会话。好吧,现在想象一下
WebSocketClient
并调用setCookieStore()
connect(对象websocket,URI-toUri)
connect()
执行线程1
ClientUpgradeRequest request = new ClientUpgradeRequest(toUri)
及
为了确保线程安全,在整个连接过程中,对象的内部状态应该是不可修改的。+1 WebSocketClient绝对是线程安全的。代码有时可能包含bug这一事实并不意味着这不是多线程代码。不确定WebSocketClient中的cookie存储是否用于设置应在不同调用之间共享的公共cookie。应在ClientUpgradeRequest上使用setCookies设置每请求cookie。如果cookieStore旨在跨线程共享,则应声明为
volatile
。否则,一个线程可能会更改值,而另一个线程看不到更改。此外,我在课堂上没有看到如何保存两组cookie:线程间共享子集和每线程子集。此外,是否有可能想到一个合理的用例,以这种方式将cookie拆分为两个子集?
ClientUpgradeRequest request = new ClientUpgradeRequest(toUri)
request.setRequestURI(toUri)