【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.xdnf.cn/news/1421057.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Ardupilot开源代码之Rover上路 - 后续1

Ardupilot开源代码之Rover上路 - 后续1 1. 源由2. 问题汇总2.1 问题1&#xff1a;飞控选择2.2 问题2&#xff1a;飞控安装位置和固定2.3 问题3&#xff1a;各种插头、插座配套2.4 问题4&#xff1a;分电板缺陷2.5 问题5&#xff1a;电机编码器接线及正反向问题2.6 问题6&#x…

树莓派python开发

树莓派自带thonny 点亮LED灯 import RPi.GPIO as GPIO import time# 设置GPIO模式为BCM GPIO.setmode(GPIO.BCM)# 设置LED引脚 led_pin 18# 设置LED引脚为输出 GPIO.setup(led_pin, GPIO.OUT)# 点亮LED GPIO.output(led_pin, GPIO.HIGH)# 延时2秒 time.sleep(2)# 关闭LED GPI…

电商核心技术揭秘55:社群与粉丝经济的结合

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

Jboss 反序列化 CVE-2017-12149

一、漏洞简介 JBoss是一个管理EJB的容器和服务器&#xff0c;支持EJB 1.1、EJB 2.0和EJB3的规范。在/invoker/readonly路径下&#xff0c;攻击者可以构造序列化代码传入服务器进行反序列化,由于没有对反序列化操作进行任何检测&#xff0c;导致攻击者可以执行任意代码。 而jbo…

重发布和路由策略实验(课堂练习)

需求&#xff1a; 将1.1.1.0/24网段&#xff08;不在OSPF中&#xff09;重发布到网络中&#xff0c;不允许出现次优路径&#xff0c;实现全网可达。 需求分析&#xff1a; 1、在R1上重发布1.1.1.0/24网段&#xff0c;但是需要过滤192.168.12.0/24和192.168.13.0/24 2、在R2和R3…

考研数学|强化阶段怎么刷《660》《880》《1000》?

强化阶段想要刷好题&#xff0c;首先要选一本适合自己的题集&#xff01; 一般在强化阶段&#xff0c;大家用多个最多的题集就是660题&#xff0c;880题还有1000题 660题的特点是只训练客观题&#xff0c;虽然题目的质量很高&#xff0c;但是训练面还是比较窄 880题是综合训…

关于DDD和COLA的一些总结和思考

1|0思维&#xff1a;面向对象和面向过程 领域驱动设计本质上是讲的面向对象&#xff0c;但是谈面向对象&#xff0c;始终无法绕开面向过程&#xff0c;所以我们先好好说一下面向过程和面向对象这两个概念。 什么是面向过程呢&#xff0c;其实就是我们学习编程时最初被植入的逻辑…

C++笔记(STL标准库)

1.STL六大部件 容器 Containers分配器 Allocators&#xff1a;帮容器分配内存算法 Algorithms迭代器 Iterators&#xff1a;算法通过迭代器操作容器里的数据&#xff0c;是一种泛化的指针适配器 Adapters&#xff1a;修改或扩展已有类或函数的接口以满足特定的需求仿函数 Func…

《动手学深度学习》V2(11-18)

文章目录 十一、二 模型选择与过拟合和欠拟合1、模型的选择2、过拟合和欠拟合3、估计模型容量4、线性分类器的VC维5、过拟合欠拟合的代码实现 :fire:①生成数据集②定义评估损失③定义训练函数④三阶多项式函数拟合⑤线性函数拟合(欠拟合)⑤高阶多项式函数拟合(过拟合) 十三、权…

【020】基于JavaWeb实现的批报管理系统

项目介绍 基于jspservlet实现的批报管理系统采用B/S架构,该项目设计了一个角色管理员&#xff0c;管理员实现了我的案件、查询统计、项目维护等三大功能模块 技术栈 开发工具&#xff1a;Idea2020.3 运行环境&#xff1a;jdk1.8tomcat9.0mysql5.7 服务端技术&#xff1a;j…

初识C语言——第十八天

循环while/do while while 语法结构 while(表达式) 循环语句; break:在while循环中&#xff0c;break用于永久的终止循环 continue:在while循环中&#xff0c;continue的作用是跳过本次循环continue后面的代码 直接去判断部分&#xff0c;看是否进行下一次循环。 注意事项…

资料总结分享:瀑布图,GESA,生存曲线

目录 瀑布图 GESA 生存曲线 瀑布图 肿瘤的瀑布图是一种常用的数据可视化方式&#xff0c;用于展示个体患者或研究样本的肿瘤基因组学数据&#xff0c;通常包括基因突变、基因拷贝数变异、染色体重排等信息。 颜色编码&#xff1a; 柱状图通常会使用颜色编码来表示不同类型…

GIS数据—1984-2020中国1km人造夜间灯光观测数据

夜间灯光观测数据&#xff08;Nighttime Light,NTL&#xff09;是评估人类活动边界的常用手段&#xff0c;目前&#xff0c;该数据已经广泛应用于城市范围、不透水面、基础设施建设等一系列过程。今天&#xff0c;小编要带来的是长时间序列中国区域边界的夜间灯光观测数据。 数…

python-dict序列化的数据为啥前后不一致

前情提要及背景:流式数据的二次处理终结篇-CSDN博客 假如直接将dict进行str,那么编码数据都是一致的,但是在postman上就表现不那么好看,如下: 而之前的显示如下: 其中的差别就是单引号与双引号的差别了。 采用如下方案无疑是最笨的方法了: 在Python中,如果你想将处理…

浅谈SiC MOSFET之MOSFET

1.掺杂后的半导体 P型半导体&#xff0c;多子是空穴&#xff0c;少子是自由电子。 N型半导体&#xff0c;多子是自由电子&#xff0c;少子是空穴。 2.电中性 尽管他们分别有着空穴带正电&#xff0c;自由电子带负电&#xff0c;但是整体上是电中性的。 以P型半导体为例&…

Java开发工具Idea的下载与激活

一&#xff0c;官网下载Idea 建议从官网下载&#xff0c;安全、可靠。 1&#xff0c;点击此处进入官网下载 2&#xff0c;进入官网之后点击[Support]&#xff0c;点击浮窗左侧[Download and Install] 3&#xff0c;跳入如下新界面&#xff0c;点击Download进入下载界面 4&am…

【OpenGL的数学01】从窗口空间计算视空间

文章目录 一、说明二、定义三、来自gl_FragCoord四、来自gl_FragCoord的XYZ4.1 从窗口到ndc4.2 从NDC到剪辑4.3 从剪辑到眼睛4.4 GLSL示例 五、从gl_FragCoord的XYZ优化方法 一、说明 本文将解释如何在给定窗口空间顶点位置的情况下重新计算眼空间顶点位置。以及相反的计算。其…

1064 朋友数

solution 给出n个整数&#xff0c;统计可能的位数和&#xff0c;并按升序输出&#xff08;考虑用set实现&#xff09; #include<iostream> #include<set> using namespace std; int main(){set<int> st;int n, x, sum;scanf("%d", &n);while…

实验八 Linux虚拟内存 实验9.1:统计系统缺页次数成功案例

运行环境&#xff1a; VMware17.5.1 build-23298084Ubuntu 16.04LTS ubuntu版本下载地址Linux-4.16.10 linux历史版本下载地址虚拟机配置&#xff1a;硬盘一般不少于40G就行 内核版本不同内核文件代码也有出入&#xff0c;版本差异性令c文件要修改&#xff0c;如若要在linux6.7…

【智能算法应用】遗传粒子群算法(GA-PSO)求解选址问题

目录 1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】粒子群算法&#xff08;PSO&#xff09;原理及实现 经典PSO算法用于连续空间优化问题&#xff0c;选址问题作为组合优化问题&#xff0c;需要在离散空间中求解。因此&#xff0c;考虑遗传算…