28个案例问题分析---007---在线人员逻辑反例--ThreadLocal、继承、索引失效、

简介: 28个案例问题分析---007---在线人员逻辑反例--ThreadLocal、继承、索引失效、

ThreadLocal、继承、索引失效、

三:总结升华

一:背景介绍

本文是对项目实战中出现的6个问题进行的总结,希望通过总结的方式,提升自己的技术水平,避免类似的错误。


1.1 具体问题

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

2.保存数据没有考虑业务的隔夜覆盖导致的逻辑漏洞

3.涉及到继承,对于this,如果父类有同样的成员最终使用哪一个?

4.参数不一致导致后续维护混乱

5.mysql由于关联字段类型不一致导致产生索引失效问题,进而产生慢sql
6.sql不考虑业务导致有明显的逻辑漏洞

1.2 问题实际到的知识点

上文涉及到的知识点主要有


公共变量(1)、

业务逻辑(2,4,6)、

继承中的this(3)、

mysql索引失效(5)。

二:解决方案

2.1 类中公共变量由于线程共享,导致的数据混乱(公共变量)

线程是共享全局变量的,如果在业务过程中,对全局变量进行修改操作。在多线程的情况下,会产生全局变量数据混乱问题。


2.1.1使用ThreadLocal变量

ThreadLocal是Java中的一个类,用于实现线程本地变量。线程本地变量指的是每个线程拥有自己独立的变量副本,不同线程之间互不干扰。可以理解为在多线程环境下,ThreadLocal变量是每个线程私有的变量。


2.1.1.1 代码复现

直接上代码

package org.example;
public class Main {
    static ThreadLocal<String> localVar = ThreadLocal.withInitial(() -> "默认localVar");
    static void  print(String str){
        //打印当前线程内存储的本地变量的值
        System.out.println( str +"   de~~~   " + localVar.get());
    }
    public static void main(String[] args) {
        //创建线程一
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                //打印一下localvar的值
                System.out.println("thread1线程" + localVar.get());
                //修改一下localvar的值
                localVar.set("thread1的local");
                //打印
                print("thread1");
            }
        });
        thread1.start();
        //创建线程二
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程二不共享localVar变量,值为默认值" + localVar.get());
            }
        });
        thread2.start();
    }
}

上述代码


创建了一个 ThreadLocal类型名为localVar的变量,并且赋初值为 默认localVar

一个打印 localVar值的print()方法

main方法 创建了两个线程,第一个线程操作修改了localVar的值,第二个线程直接打印了localVar的值

2.1.1.2 执行结果

从结果上我们可以看出 第一个线程修改了我们定义的localVar的值之后,第二个线程打印的仍是我们一开始初始化设置的默认值

结论:ThreadLocal 定义的变量是线程安全的

2.2 在线人员逻辑(逻辑漏洞)

2.2.1 问题二:保存数据没有考虑业务隔夜


在查询的逻辑里添加了 createDate的字段,这里的createDate是按照天取得年月日。如果跨天就会出现问题。

2.2.2 参数不一致,导致维护混乱

登录状态问题,这里的状态在之前的业务里,已经传入了,但是后续却用了一个魔法值表示,虽然功能上没有出现问题,但是却多了一个写死的值,不利与复用。

2.2.3 sql不考虑业务,出现明显逻辑漏洞


此sql对应的是教师进行结课之后,将学生的最近登录时间修改。这里存在两个问题。


update_time字段的使用,这个是我们数据库建表规范必备三字段(id,create_time,update_time)之一,业务需要应该新建字段,而不是使用update_time字段

额外添加了createDate字段,用当天时间做为where条件,如果跨天的话,就会出现下线状态无法更新问题。

2.3:继承(this)


Java中继承关系的父子类,相同的方法会被重写

当子类父类中的成员没有重名时,子类都可以通过this去调用。

当成员方法 重名,子类就会将父类中的方法进行重写。如果还想调用父类中的方法只能通过 super去进行调用。

当时成员变量不存在覆盖重写:在子类中只能通过super调用父类的

2.4 慢sql问题(索引失效)

索引会因为 隐示数据转换造成 索引失效的问题。在设置外键的时候,一定要保持与相对应的主键的数据类型一致,否则查询的时候,就会出现不走索引的慢sql。

具体原因可以参考:mysql索引博客

三:总结升华

以上为我对开发中出现的6个问题的总结。这个问题高所我们使用一项技术的时候,一定要清楚使用边界。并且出现问题要及时总结,保证不出同样的问题。


目录
相关文章
|
5月前
|
Java Scala 开发工具
访问者模式问题之在 ProcessSimulator 类中记录访问到的审批节点,如何实现
访问者模式问题之在 ProcessSimulator 类中记录访问到的审批节点,如何实现
‘}‘ expected,解决问题的思路是生成token没反应,解决问题的方法是认真比较,同时同一功能的接口一定要写在一个Controller类下,别写到类外面
‘}‘ expected,解决问题的思路是生成token没反应,解决问题的方法是认真比较,同时同一功能的接口一定要写在一个Controller类下,别写到类外面
分页列表数据不出来,初始化页面数据不出来的原因,Create中传一个参数1,解决bug的方法,学习敲代码的时候仔细与原项目比对,从上比到下
分页列表数据不出来,初始化页面数据不出来的原因,Create中传一个参数1,解决bug的方法,学习敲代码的时候仔细与原项目比对,从上比到下
|
6月前
|
Java 数据库连接 应用服务中间件
表单数据返回不到,HTTP状态 404 - 未找未找到,解决方法,针对这个问题,写一篇文章,理一下思路,仔细与原项目比对,犯错的原因是Mapper层的select查询表单数据写错,注意打开的路径对不对
表单数据返回不到,HTTP状态 404 - 未找未找到,解决方法,针对这个问题,写一篇文章,理一下思路,仔细与原项目比对,犯错的原因是Mapper层的select查询表单数据写错,注意打开的路径对不对
|
7月前
|
监控 Java
记录页面修改差异(java注解实现)
记录页面修改差异(java注解实现)
|
8月前
|
SQL 算法
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
基于若依的ruoyi-nbcio流程管理系统修改代码生成的sql菜单id修改成递增id(谨慎修改,大并发分布式有弊端)
133 1
|
SQL 安全 前端开发
案例07-在线人员列表逻辑混乱-ThreadLocal、继承、索引失效
案例07-在线人员列表逻辑混乱-ThreadLocal、继承、索引失效
|
安全 NoSQL Java
28个案例问题分析---15---登陆之后我加入的课程调用接口报错--ArrayList线程不安全。占用内存情况
28个案例问题分析---15---登陆之后我加入的课程调用接口报错--ArrayList线程不安全。占用内存情况
92 0
|
Oracle 关系型数据库
设计一个Stock类和DividendStock类 - 编写了一个表示拥有股票情况的Stock类,这里给出了一个简化版,去掉了对参数的合法性的检查等细节:
设计一个Stock类和DividendStock类 - 编写了一个表示拥有股票情况的Stock类,这里给出了一个简化版,去掉了对参数的合法性的检查等细节:
182 0
设计一个Stock类和DividendStock类 - 编写了一个表示拥有股票情况的Stock类,这里给出了一个简化版,去掉了对参数的合法性的检查等细节:
|
XML 前端开发 安全
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
170 0
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)

热门文章

最新文章