Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WebSocket会话之间共享的所有成员是否应同步?_Java_Session_Websocket_Synchronization - Fatal编程技术网

Java WebSocket会话之间共享的所有成员是否应同步?

Java WebSocket会话之间共享的所有成员是否应同步?,java,session,websocket,synchronization,Java,Session,Websocket,Synchronization,在我的WebSocket应用程序中,我有一组包含会话间共享的数据的集合——每个会话都可以访问集合中的所有数据。我通过简单地将集合设置为静态来实现这一点 通过阅读web,我的理解是在Tomcat8上运行的WebSocket遵循单线程模型,每个会话都有一个单独的线程。所以 我的问题是,;我是否应该使共享成员同步,因为它们可以被任何WebSocket线程访问 还是WebSockets会帮我解决这个问题 我假设我应该同步所有共享的内容,但只是确认一下!谢谢。如果您有多个线程正在读取共享集或任何非线程安全

在我的WebSocket应用程序中,我有一组包含会话间共享的数据的集合——每个会话都可以访问集合中的所有数据。我通过简单地将集合设置为静态来实现这一点

通过阅读web,我的理解是在Tomcat8上运行的WebSocket遵循单线程模型,每个会话都有一个单独的线程。所以

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

还是WebSockets会帮我解决这个问题

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

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

即使使用websocket,也需要同步,因为您已经定义了静态数据集,可以由多个websocket会话同时访问。实例数据非静态变量不需要同步,因为单线程模型保证同一会话中类上的两个方法不能同时执行。有关每个Websocket会话的一个线程的信息,请参见。具体来说,它说:

与servlet相反,WebSocket端点被多次实例化。容器为每个到其部署URI的连接创建端点的一个实例。每个实例仅与一个连接关联。这种行为有助于保持每个连接的用户状态并简化开发,因为在任何给定时间只有一个线程在执行端点实例的代码

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

如果您有多个线程从共享集或任何非线程安全变量中读取数据,并且这些变量可能会同时被写入更新,则您需要同步它们。Java 8向集合添加了一个新的synchronizedSet方法,请参见Collections.synchronizedSet。在Java8之前,您提供自己的同步。有关创建Java 8 synchronizedSet的更多信息,请参见本文

即使使用websocket,也需要同步,因为您已经定义了静态数据集,可以由多个websocket会话同时访问。实例数据非静态变量不需要同步,因为单线程模型保证同一会话中类上的两个方法不能同时执行。有关每个Websocket会话的一个线程的信息,请参见。具体来说,它说:

与servlet相反,WebSocket端点被多次实例化。容器为每个到其部署URI的连接创建端点的一个实例。每个实例仅与一个连接关联。这种行为有助于保持每个连接的用户状态并简化开发,因为在任何给定时间只有一个线程在执行端点实例的代码

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