当前位置: 首页 > news >正文

案例07-在线人员列表逻辑混乱

一、背景介绍

在线人员列表涉及到的问题:

类中写了公共变量最后导致数据混乱现象
保存数据没有考虑业务的隔夜覆盖导致的逻辑漏洞
涉及到继承,对于this,如果父类有同样的成员最终使用哪一个?
参数不一致导致后续维护混乱
mysql由于关联字段类型不一致导致产生索引失效问题,进而产生慢sql
sql不考虑业务导致有明显的逻辑漏洞

上面的问题主要分为四类问题:

公共变量导致数据混乱
对于在线人员的业务存在逻辑问题(对应上面的 2 4 6 )
面向对象继承的问题,this.属性和方法的问题
mysql由于关联字段类型不一致导致索引失效的问题。    

二、解决过程

1.类中写了公共变量最后导致数据混乱现象

原因:由于线程共享全局变量,并且在实际业务的过程中对全局变量进行了操作(修改),所以在高并发、多线程的条件下会产生公共变量导致数据混乱的现象。

方案:1.使用ThreadLocal

ThreadLocal叫做线程变量,该变量对于其他线程而言是隔离的,该变量是当前该线程独有的变量。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。正是由于每个线程都有自己的实例副本,且与其他线程不可访问,那就不存在多线程共享该变量的问题。

没使用ThreadLocal之前

代码编写

public class Client {public static void main(String[] args) {// 定义线程实现接口Runnable runnable = new Runnable(){Counter counter = new Counter();@Overridepublic void run() {counter.count();}};// 启动10个线程for( int i= 0;i< 10;i++) {new Thread(runnable).start();}}}
public class Counter{private int number;public void count(){for (int i = 0; i <=10 ; i++) {number=number+i;}System.out.println(Thread.currentThread().getName()+ "--"+number;}
}

执行结果:计算的结果应该都为55,结果出现了混乱的情况

 使用ThreadLocal之后

public class Client {public static void main(String[] args) {// 定义线程实现接口Runnable runnable = new Runnable(){Counter counter = new Counter();@Overridepublic void run() {counter.count();}};// 启动10个线程for( int i= 0;i< 10;i++) {new Thread(runnable).start();}}
}
public class Counter {private static ThreadLocal<Integer> number = new ThreadLocal<Integer>() {// 重写这个方法,可以修改“线程变量”的初始值,默认是null@Overrideprotected Integer initialValue() {return 0;}};//计数方法public  void count() {for( int i= 0;i<= 10;i++) {number.set(number.get()+i);}System.out.println(Thread.currentThread().getName()+ "--"+number.get());}
}

执行结果

 2.将全局变量改为成员变量

public  void count(){int number = 0;for (int i = 0; i <=10 ; i++) {number=number+i;}System.out.println(Thread.currentThread().getName()+ "--"+number);}
}

 

 2.逻辑混乱多种情况

         由于这里查询的入参带了createDate,如果该学生从第一天到第二天一直没有下课,那么你这儿查询的话由于带了createDate就查询不到该学生的在线数据,在后续的流程中就会重复插入,该学生就会有两条数据,查询的时候就会有数据问题。

         对于isOnline参数,上面paramUser中有该参数。不必再进行赋值。这样的好处是参数值保持了一致,降低了复杂度。

        这里主要是对在线人员进行下线处理,1.如果在这里更新了update_time那么就相当于这个课程班级中的所有学生的最近一次登陆时间都是一致的,并且最近一次登陆时间与实际不符。2.如果where条件上加上了create_date作为条件那么如果过了十二点结束课程,那么所有在线的人就无法进行下线处理了。

3.父子类继承对于this的使用

         java中继承关系的父子类,相同的方法会被重写。重写之后如果还想继续使用父类的方法,需要通过super关键字去调用父类的方法。

4.关联字段类型不一致导致索引失效

 相关博客:(5条消息) 案例12-数据类型不一致导致索引失效_武梓龙_Arvin的博客-CSDN博客

三、总结提升

        拓展我们的知识面,不怕不知道就怕不知道。知识面宽广了在解决问题,思考解决办法才能更丰富维度才会更多。

相关文章:

案例07-在线人员列表逻辑混乱

一、背景介绍 在线人员列表涉及到的问题&#xff1a; 类中写了公共变量最后导致数据混乱现象 保存数据没有考虑业务的隔夜覆盖导致的逻辑漏洞 涉及到继承&#xff0c;对于this&#xff0c;如果父类有同样的成员最终使用哪一个&#xff1f; 参数不一致导致后续维护混乱 mysql由…...

Java集合框架

Java集合框架是Java编程语言所提供的一种便捷的数据结构的实现。Java集合框架提供了一种统一的接口和机制来访问和操作集合中的元素&#xff0c;这些元素可以是对象、基本数据类型或其他集合。Java集合框架是Java应用程序中最常用的特性之一&#xff0c;它为开发人员提供了许多…...

奇异值分解(SVD)原理与在降维中的应用

奇异值分解(SVD)原理与在降维中的应用 奇异值分解(Singular Value Decomposition&#xff0c;以下简称SVD)是在机器学习领域广泛应用的算法&#xff0c;它不光可以用于降维算法中的特征分解&#xff0c;还可以用于推荐系统&#xff0c;以及自然语言处理等领域。是很多机器学习算…...

GDB调试程序

1.GDB 调试程序 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。在UNIX平台下做软件&#xff0c;GDB这个调试工具有比VC的图形化调试器更强大的功能。所谓“寸有所长&#xff0c;尺有所短”就是这个道理。 一般来说&#xff0c;GDB主要帮忙你完成下面四个方面的功能…...

五种IO模型

用户空间与内核空间 操作系统把内存空间划分成了两个部分&#xff1a;内核空间和用户空间。 为了保护内核空间的安全&#xff0c;操作系统一般都限制用户进程直接操作内核。 所以&#xff0c;当我们使用TCP发送数据的时候&#xff0c;需要先将数据从用户空间拷贝到内核空间&a…...

5 全面认识java的控制流程

全面认识java控制流程1.块作用域2.条件语句3.迭代语句3.1while语句3.2do-while语句3.3for语句3.4 for-in语法4.中断控制流程的语句4.1 return4.2 break和continue4.2.1 不带标签的break语句4.2.2 带标签的break语句4.2.3 continue语句4.3 goto()5.多重选择:switch语句1.块作用域…...

第二章 测验【嵌入式系统】

第二章 测验【嵌入式系统】前言推荐第二章 测验【嵌入式系统】最后前言 以下内容源自《嵌入式系统》 仅供学习交流使用 推荐 第一章 测验【嵌入式系统】 第二章 测验【嵌入式系统】 1单选题 32bit宽的数据0x12345678 在小端模式&#xff08;Little-endian&#xff09;模式…...

排序算法之插入排序

要考数据结构了&#xff0c;赶紧来复习一波排序算法 文章目录一、直接插入排序二、希尔排序一、直接插入排序 直接上主题 插排&#xff0c;揪出一个数&#xff0c;插入到原本已经有序的数组里面&#xff0c;如数组有n个数据&#xff0c;从0~n下标依次排列&#xff0c;先从左往…...

Kaggle实战入门:泰坦尼克号生生还预测

Kaggle实战入门&#xff1a;泰坦尼克号生生还预测1. 加载数据2. 特征工程3. 模型训练4. 模型部署泰坦尼克号&#xff08;Titanic&#xff09;&#xff0c;又称铁达尼号&#xff0c;是当时世界上体积最庞大、内部设施最豪华的客运轮船&#xff0c;有“永不沉没”的美誉&#xff…...

【大汇总】11个Python开发经典错误(1)

“但是太阳,他每时每刻都是夕阳也都是旭日。当他熄灭着走下山去收尽苍凉残照之际,正是他在另一面燃烧着爬上山巅散烈烈朝晖之时。” --------史铁生《我与地坛》 🎯作者主页:追光者♂🔥 🌸个人简介:计算机专业硕士研究生💖、2022年CSDN博客之星人工智能领…...

Java中的异常

程序错误一般分为三种&#xff1a;编译错误&#xff1a; 编写程序时没有遵循语法规则&#xff0c;编译程序能够自己发现错误并提示位置和原因。运行错误&#xff1a;程序在执行的时候运行环境发现了不能执行的操作。比如&#xff0c;JVM出错了&#xff0c;内存溢出等。逻辑错误…...

L2-022 重排链表 L2-002 链表去重

给定一个单链表 L1 →L2→⋯→L n−1 →L n &#xff0c;请编写程序将链表重新排列为 L n →L 1 →L n−1 →L 2 →⋯。例如&#xff1a;给定L为1→2→3→4→5→6&#xff0c;则输出应该为6→1→5→2→4→3。 输入格式&#xff1a; 每个输入包含1个测试用例。每个测试用例第1行…...

【手撕八大排序】——插入排序

文章目录插入排序概念插入排序分为2种一 .直接插入排序直接插入排序时间复杂度二.希尔排序希尔排序时间复杂度效率比较插入排序概念 直接插入排序是从一个有序的序列中选择一个合适的位置进行插入&#xff0c;这个合适的位置取决于是要升序排序还是降序排序。 每一次进行排序…...

flink多流操作(connect cogroup union broadcast)

flink多流操作1 分流操作2 connect连接操作2.1 connect 连接&#xff08;DataStream,DataStream→ConnectedStreams)2.2 coMap&#xff08;ConnectedStreams → DataStream&#xff09;2.3 coFlatMap&#xff08;ConnectedStreams → DataStream&#xff09;3 union操作3.1 uni…...

漫画:什么是快速排序算法?

这篇文章&#xff0c;以对话的方式&#xff0c;详细着讲解了快速排序以及排序排序的一些优化。 一禅&#xff1a;归并排序是一种基于分治思想的排序&#xff0c;处理的时候可以采取递归的方式来处理子问题。我弄个例子吧&#xff0c;好理解点。例如对于这个数组arr[] { 4&…...

vue 3.0组件(下)

文章目录前言&#xff1a;一&#xff0c;透传属性和事件1. 如何“透传属性和事件”2.如何禁止“透传属性和事件”3.多根元素的“透传属性和事件”4. 访问“透传属性和事件”二&#xff0c;插槽1. 什么是插槽2. 具名插槽3. 作用域插槽三&#xff0c;单文件组件CSS功能1. 组件作用…...

双指针 -876. 链表的中间结点-leetcode

开始一个专栏&#xff0c;写自己的博客 双指针&#xff0c;也算是作为自己的笔记吧&#xff01; 双指针从广义上来说&#xff0c;是指用两个变量在线性结构上遍历而解决的问题。狭义上说&#xff0c; 对于数组&#xff0c;指两个变量在数组上相向移动解决的问题&#xff1b;对…...

Linux之运行级别

文章目录一、指定运行级别基本介绍CentOS7后运行级别说明一、指定运行级别 基本介绍 运行级别说明: 0:关机 1:单用户【找回丢失密码】 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重启 常用运行级别是3和5&#xff0c;也可以…...

python搭建web服务器

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…...

【SpringCloud】SpringCloud Feign详解

目录前言SpringCloud Feign远程服务调用一.远程调用逻辑图二.两个服务的yml配置和访问路径三.使用RestTemplate远程调用四.构建Feign五.自定义Feign配置六.Feign配置日志七.Feign调优八.抽离Feign前言 微服务分解成多个不同的服务&#xff0c;那么多个服务之间怎么调用呢&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...