java - WebSocket session 之间共享的所有成员是否应该同步?

标签 java session websocket synchronization

在我的 WebSocket 应用程序中,我有包含我在 session 之间共享的数据的集合 - 每个 session 都可以访问集合中的所有数据。我通过简单地使 Sets 静态来做到这一点。

我通过阅读网络了解到 WebSockets(在我的例子中运行在 Tomcat 8 上)遵循单线程模型,因为每个 session 都有一个单独的线程。所以……

我的问题是; 我是否应该使共享成员同步,因为它们可以被任何 WebSocket 线程访问?

或者 WebSockets 会为我处理这个问题吗?

我假设我应该同步共享的所有内容,但只是确认一下!谢谢。

最佳答案

如果您有多个线程从可能同时写入(更新)的共享集(或任何非线程安全变量)读取,那么您需要同步它们。 Java 8 向 Collections 添加了一个新的 synchronizedSet 方法(参见 Collections.synchronizedSet)。在 Java 8 之前,您需要提供自己的同步。有关创建 Java 8 synchronizedSet 的更多信息,请参见 documentation .

即使使用 Websockets 也需要同步,因为您已经定义了可以由多个 websocket session 同时访问的静态数据(Set)。实例数据(非静态变量)不需要同步,因为单线程模型保证你的类(在同一个 session 中)没有两个方法可以同时执行。关于每个 Websocket session 一个线程的信息可以在这个 Oracle documentation 中找到。 .具体来说:

As opposed to servlets, WebSocket endpoints are instantiated multiple times. The container creates one instance of an endpoint for each connection to its deployment URI. Each instance is associated with one and only one connection. This behavior facilitates keeping user state for each connection and simplifies development because only one thread is executing the code of an endpoint instance at any given time.

因此每个实例变量(非静态)不需要特殊的同步。 Websockets 保证单线程模型中的线程安全。但是,这不适用于这些实例之间的共享数据(静态变量)。因为它们可能在自己的线程中运行,所以您需要在适当的地方提供同步。

关于java - WebSocket session 之间共享的所有成员是否应该同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26110182/

相关文章:

java - 调试递归方法来查找单词是否存在于滑板中

java - 在 Java 中读取 OpenSSL 生成的 PEM/DER 格式的 S/MIME 消息

java - 如何在 Eclipse 中轻松运行不同的配置?

Java Swing 绘图应用程序不绘图

php - 在 PHP SESSION 中存储用户 ID

session - 使用非连接默认 session 存储有什么好处?

javascript - 使用 stringify 通过套接字发送数据

websocket - 如何通过 websockets 在本地 RSK 节点上订阅 `newBlockHeaders`?

javascript - 检查用户是否刷新、返回、关闭浏览器等。socket.io

android - Parse.com 即使在注销后也接收推送通知-Android