【项目实战典型案例】07.在线人员列表逻辑混乱反例

简介: 【项目实战典型案例】07.在线人员列表逻辑混乱反例

一:背景介绍

该《案例07.在线人员列表逻辑混乱反例》中涉及到的问题:

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

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

3、 如果涉及到继承,对于this,父类有同样的成员你最终用的是那个呢?

4、 参数传递问题,参数不一致导致的后续维护混乱

5、 mysql由于关联字段类型不一致导致产生索引失效问题,进而产生慢sql

6、sql不考虑业务导致的明确逻辑漏洞

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

1、公共变量(1)

2、业务逻辑问题( 2 4 6 )

3、面向对象的问题(3)

4、索引失效的问题(5)

二:思路&方案

公共变量导致数据混乱现象

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

解决方案1 使用ThreadLocal

ThreadLocal介绍

ThreadLocal详解

1、ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。

2、ThreadLocal提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。

3、既然每个Thread有自己的实例副本,且其它Thread不可访问,那就不存在多线程间共享的问题。

4、ThreadLocal变量通常被private static修饰,当一个线程结束时,它所使用的所有ThreadLocal相对的实例副本都可被回收。

ThreadLocal常见使用场景

  • 每个线程需要有自己单独的实例
  • 实例需要在多个方法中共享,但不希望被多线程共享

ThreadLocal使用

多线程环境下未使用ThreadLocal出现数据混乱的问题

public class Client {
    public static void main(String[] args) {
        // 定义线程实现接口
        Runnable runnable = new Runnable(){
            Counter counter = new Counter();
            @Override
            public 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();
            @Override
            public 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
        @Override
        protected 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);
    }
}

实现效果

业务逻辑问题

在查询逻辑中添加了createDate的字段,如果13号这天学生没有下课的话,当14号这天你按照createDate字段查询的话,是查不到该学生的数据的,系统默认为该学生是第一次登录软件,所以就会再次存入一条该学生的数据。

上面的paramUser中已经有了isOnline参数,就不需要在进行赋值了,避免数据不一致。

1、如果更新了update_time,那么在线人员记录中的最近一次登录时间就修改为同一个了

2、如果在where条件上添加了create_date的话,那么过了12点结束课程后,所有在线的人就都无法下线了

面向对象继承问题

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

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

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

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

索引失效的问题

三:总结

做事情要从全局观出发,要明确事情的边界


相关文章
|
5月前
|
程序员
程序员必知!里式替换原则的实战应用与案例分析
里式替换原则(Liskov Substitution Principle, LSP)是面向对象设计的基本原则之一,由Barbara Liskov于1987年提出。这个原则的主要思想是:在软件中,如果一个类可以被另一个类所替换,并且不会影响程序的正确性,那么这两个类就遵循了里式替换原则。
程序员必知!里式替换原则的实战应用与案例分析
dapp互助预约排单系统开发步骤指南/案例设计/规则详细/方案逻辑/源码程序
-Determine the core functions and objectives of the system, understand user needs and expectations.
|
3月前
|
机器学习/深度学习 监控 算法
量化交易系统开发步骤功能/规则玩法/案例项目/逻辑功能
量化交易策略系统开发是指利用编程和数学模型来设计、开发和实施自动化交易策略的过程。它涉及了将交易策略转化为可编程的算法,以便计算机可以根据预定规则和条件进行自动交易。
|
3月前
|
运维 监控 安全
软件研发核心问题之用在需求拆解时明确监控范围与形式的问题如何解决
软件研发核心问题之用在需求拆解时明确监控范围与形式的问题如何解决
|
3月前
软件研发核心问题之在需求拆解过程中,“数据与UI如何关联”的问题如何解决
软件研发核心问题之在需求拆解过程中,“数据与UI如何关联”的问题如何解决
|
SQL 安全 关系型数据库
项目实战典型案例7——在线人员列表逻辑混乱反例
项目实战典型案例7——在线人员列表逻辑混乱反例
148 0
项目实战典型案例7——在线人员列表逻辑混乱反例
游戏对接广告看视频系统开发详细规则/方案逻辑/步骤逻辑/规则玩法/源码程序
Advertising location and display method: According to the characteristics of the game interface and scene, choose the appropriate advertising location and display method to ensure that the advertisement naturally integrates into the game and does not affect the player&#39;s game experience.
|
5月前
|
人工智能 算法 测试技术
【简历优化平台-03】轻字段信息的合理性及单独算法
【简历优化平台-03】轻字段信息的合理性及单独算法
|
5月前
|
自然语言处理 监控 项目管理
第六章项目整体管理(选择5分,案例偶尔考)
第六章项目整体管理(选择5分,案例偶尔考)
交易所系统开发详细项目丨案例规则丨方案设计丨步骤需求丨逻辑功能丨源码程序
Requirement analysis and planning: Collaborate with customers to clarify the requirements and goals of the coin exchange system. Understand the customer&#39;s business model, target user group, and currencies to be supported by the exchange, and develop a detailed demand plan.
下一篇
无影云桌面