gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:16:44 25 4
gpt4 key购买 nike

在我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com