【Spring】验证 @ServerEndpoint 的类成员变量线程安全

文章目录

    • 前言
    • 猜想来源
    • 验证方法
      • @Controller 的情况
      • @ServerEndpoint 的情况
    • 后记

前言

最近有 websocket 的需求。探索 @ServerEndpoint 的类成员变量特点。
这里类比 @Controller 讨论 @ServerEndpoint 类成员变量是否线程安全。

猜想来源

网上的教程大多数都这么展示程序:

@Component
@ServerEndpoint(value = "/ws")
public class MyWsEndpoint {private final MyContext context = new MyContext();@OnOpenpublic void onOpen(Session session) {}// ... 省略
}    

但是,同样的写法,类比 @Controller ,必然会产生线程安全问题。

@Controller
public class MyController {private static final Logger logger = LoggerFactory.getLogger(MyController.class);private final MyContext context = new MyContext();@GetMapping("/normal")@ResponseBodypublic String normal() {}
}

需要一种快速验证的方式, @ServerEndpoint 的类成员变量则线程安全


验证方法

  • 最简单的用例,把读和写拆成两个步骤,如果读到了其他线程的值,则为不安全的情况
        // 每个请求独立自增int currentCount = ac.incrementAndGet();// 多线程写context.setCurrentCount(currentCount);// 多线程读if (context.getCurrentCount() != currentCount) {logger.error("线程不安全!!!");}
  • 浏览器触发请求,多线程 debug 打断点 制造并发场景
    在这里插入图片描述

@Controller 的情况

  • 线程不安全
    原因是 @Controller 的类默认是单例的
    在这里插入图片描述

@ServerEndpoint 的情况

贴一个前端测试代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>ws client</title>
</head>
<body></body><script>let ws = new WebSocket("ws://localhost:8080/ws")ws.onopen = function () {ws.send("hello")}ws.onmessage = function (message) {console.log(message)}
</script>
</html>
  • 线程安全
    在这里插入图片描述

后记

  • 上文验证了 @ServerEndpoint 的类成员变量是线程安全的。
  • 但是存在矛盾:
    • 上面用例 @Component@ServerEndpoint 共同作用于一个类上
    • Spring 容器管理 @Component 默认是单例的

  • 解释上文的矛盾:
    • 【Spring】@ServerEndpoint 与 Spring 是如何集成的,@Component 用于bean相关的api读取
    • @ServerEndpoint 使用的是servlet的模式,与Spring mvc 不同,在Filter里面做了new操作
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/325896.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OBS插件--音频采集

音频采集 音频采集是一款 源 插件,类似于OBS的win-capture/game-capture&#xff0c;允许从特定应用程序捕获音频&#xff0c;而不是捕获整个系统的音频。避免了因为特定音频的采集而需要引入第三方软件&#xff0c;而且时延也非常低。 下面截图演示下操作步骤&#xff1a; 首…

简单的Python HTML 输出

1、问题背景 一名初学者在尝试将 Python 脚本输出到网页上时遇到了一些问题。他当前使用 Python 和 HTML 进行开发&#xff0c;并且遇到了以下问题&#xff1a; 担心自己的代码过于复杂&#xff0c;尤其是 WebOutput() 函数。希望通过 JavaScript 使用 HTML 模板文件更新数据。…

几个字符串函数的使用和模拟实现(2)

strcop的使用和模拟实现 strcpy函数的使用事项&#xff1a; 源字符串时不需要修改的&#xff0c;在定义前加上const 源字符串被拷贝到目标字符串上时终止字符\0也被拷贝进去 目标数组的大小要相对于源数组的大小足够大&#xff0c;并且不应该在内存中重叠 函数的返回值是一个字…

网络无线网卡无法配置正确的 dns 服务器

网络无线网卡无法配置正确的 dns 服务器--解决办法 网络无线网卡无法配置正确的 dns 服务器--解决办法 网络无线网卡无法配置正确的 dns 服务器–解决办法 建议先使用疑难反馈&#xff08;自带的&#xff09; 打开网络适配中心 之后更改适配器设置&#xff0c;在点击 wlan 属…

绿盟之旅——一段安全实习结束

去年&#xff0c;因为着急找实习&#xff0c;拿着简历就开始海投&#xff0c;当时想的是有人让我去就谢天谢地了&#xff0c;第一个约我面试的就是绿盟&#xff0c;也很顺利的通过了面试&#xff0c;当时让我选择在上海还是北京&#xff0c;我选择的是上海&#xff0c;因为学校…

【C++】set 和 map 学习及使用

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前言 set 和 map 是 STL 中的容器之一&#xff0c;不同于普通容器&#xff0c;它俩的查找速度极快…

开发一款相亲交友小程序

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…

第四届上海理工大学程序设计全国挑战赛 J.上学 题解 DFS 容斥

上学 题目描述 usst 小学里有 n 名学生&#xff0c;他们分别居住在 n 个地点&#xff0c;第 i 名学生居住在第 i 个地点&#xff0c;这些地点由 n−1 条双向道路连接&#xff0c;保证任意两个地点之间可以通过若干条双向道路抵达。学校则位于另外的第 0 个地点&#xff0c;第…

【JAVA进阶篇教学】第十三篇:Java中volatile关键字讲解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十三篇&#xff1a;volatile关键字讲解。 在 Java 中&#xff0c;volatile关键字是一种轻量级的同步机制&#xff0c;用于确保变量的可见性和禁止指令重排序。本文将详细解释volatile关键字的工作原理、可见性保证以及…

Web安全:SQL注入之布尔盲注原理+步骤+实战操作

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

ansible------inventory 主机清单

目录 inventory 中的变量 2&#xff09;组变量[webservers:vars] #表示为 webservers 组内所有主机定义变量&#xff0c;所有组内成 员都有效 ansible_userrootansible_passwordabc1234 3&#xff09; [all:vars…

实现字符串复制(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;char a[100], b[100];//获取字符串&#xff1b;printf("请为数组a输入字符串…

回溯算法精讲

原理 回溯&#xff0c;就和深度优先遍历&#xff08;DFS&#xff09;类似&#xff0c;属于先一层到底直至到终点&#xff0c;如果这条路径不对&#xff0c;则回退一下&#xff0c;再继续往下搜索。 抽象地说&#xff0c;解决一个回溯问题&#xff0c;实际上就是遍历一棵决策树…

未来已来:Spring Cloud引领微服务新纪元

文章目录 1. 引言1.1 微服务架构的兴起与挑战1.2 引入Spring Cloud作为微服务解决方案的重要性 2. 背景介绍2.1 微服务架构概述2.2 Spring Cloud的定位2.3 Spring Cloud特性概览 3. Spring Cloud核心组件3.1 Eureka - 服务发现3.2 Hystrix - 断路器3.3 Ribbon - 客户端负载均衡…

Python vs MATLAB:选择深度学习的首选编程语言

Python vs MATLAB&#xff1a;选择深度学习的首选编程语言 在深度学习领域&#xff0c;编程语言的选择对于初学者的学习路径和未来的职业发展至关重要。目前&#xff0c;Python和MATLAB都是进行科学计算和数据分析的流行工具&#xff0c;但它们在深度学习社区中的应用和受欢迎…

构建教育新未来:智慧校园平台的深度解读与全景呈现

引言 在全球数字化转型的大潮中&#xff0c;智慧校园平台作为教育信息化的重要载体&#xff0c;正以前所未有的姿态颠覆传统的教育模式&#xff0c;引领教育行业步入一个崭新的时代。这个融合了大数据、人工智能、云计算、物联网等一系列前沿科技的平台&#xff0c;以其强大的功…

C++笔记:类和对象(一)

一.类的引入 1.类(class)是C中的一种特殊的数据结构&#xff0c;它封装了数据和操作这些数据的函数。 2.类中的数据被称为成员变量&#xff0c;而函数则被称为成员函数。 3.类可以被看作是一种模板&#xff0c;用于创建具有相同属性和行为的多个对象。 在C语言中结构体是一种复…

数字化运维体系:重塑IT运维的未来面貌

随着信息技术的飞速发展&#xff0c;传统运维模式已难以满足现代企业日益增长的复杂需求。在此背景下数字化运维体系应运而生&#xff0c;以其独特的视角和方法论为IT运维领域带来了革新性的变革。本文将深入探讨数字化运维体系的定义、核心要素&#xff0c;并阐述如何通过这一…

rust开发web服务器框架,github排名对比

Rocket Star最多的框架 github仓库地址&#xff1a;GitHub - rwf2/Rocket: A web framework for Rust. Rocket 是一个针对 Rust 的异步 Web 框架&#xff0c;重点关注可用性、安全性、可扩展性和速度。 Axum 异步运行时 githuh仓库地址&#xff1a;GitHub - tokio-rs/axum: …

Redis—图文详解高可用原因

本文不会讲解Redis的用途&#xff0c;关于用途会发另一片文章讲解&#xff0c;本文主要讲的是高可用的原理。 Redis高可用主要有以下三个原因&#xff1a;主从模式(上一篇讲Kafka的文章里有涉及到)&#xff0c;哨兵模式&#xff0c;Redis-Cluster(Redis集群)。 什么是主从模式…