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

河南省城乡和住房建设厅网站/福州关键词快速排名

河南省城乡和住房建设厅网站,福州关键词快速排名,免费软件下载网站入口,国家商标查询官方网站目录一:背景介绍二:思路&方案公共变量导致数据混乱现象解决方案1 使用ThreadLocalThreadLocal介绍ThreadLocal常见使用场景ThreadLocal使用解决方案2 将全局变量修改为成员变量业务逻辑问题面向对象继承问题索引失效的问题三:总结一&…

目录

  • 一:背景介绍
  • 二:思路&方案
    • 公共变量导致数据混乱现象
      • 解决方案1 使用ThreadLocal
        • ThreadLocal介绍
        • ThreadLocal常见使用场景
        • ThreadLocal使用
      • 解决方案2 将全局变量修改为成员变量
    • 业务逻辑问题
    • 面向对象继承问题
    • 索引失效的问题
  • 三:总结

一:背景介绍

该《案例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();@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);}
}

实现效果
在这里插入图片描述

业务逻辑问题

在这里插入图片描述
在查询逻辑中添加了createDate的字段,如果13号这天学生没有下课的话,当14号这天你按照createDate字段查询的话,是查不到该学生的数据的,系统默认为该学生是第一次登录软件,所以就会再次存入一条该学生的数据。
在这里插入图片描述
上面的paramUser中已经有了isOnline参数,就不需要在进行赋值了,避免数据不一致。
在这里插入图片描述
1、如果更新了update_time,那么在线人员记录中的最近一次登录时间就修改为同一个了
2、如果在where条件上添加了create_date的话,那么过了12点结束课程后,所有在线的人就都无法下线了

面向对象继承问题

java中继承关系的父子类,相同的方法会被重写
当子类父类中的成员没有重名时,子类都可以通过this去调用。
当成员方法 重名,子类就会将父类中的方法进行重写。如果还想调用父类中的方法只能通过 super去进行调用。
当时成员变量不存在覆盖重写:在子类中只能通过super调用父类的
在这里插入图片描述

索引失效的问题

在这里插入图片描述

三:总结

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

http://www.jmfq.cn/news/4728763.html

相关文章:

  • 莱芜市莱城区城乡建设局网站/百度视频下载
  • 如何做快递api接口网站/外贸seo网站建设
  • wordpress缩略图采集火车头/重庆seo优
  • 世界建筑网站/网络搜索关键词排名
  • 网站建设网站定制开发/seo推广方案
  • 杭州企业公司网页设计/池州网站seo
  • 网站策划建站/百度商城
  • 建设网站 费用/外贸营销网站怎么建站
  • 专业做化妆品外包材的招聘网站/seo实战优化
  • 工商工事上哪个网站做/淘宝指数
  • 网站开发常用语言比较/聚合搜索引擎
  • 网站制作常见问题 图片版权/搜索引擎营销的优缺点
  • 福州专业网站设计/网络广告策划书模板范文
  • 提供温州手机网站制作哪家好/惠州seo关键词排名
  • 苏州住房和城乡建设厅网站/会计培训班哪个机构比较好
  • 新的网站设计制作/seo基础教程
  • 四川 法治政府建设 网站/seo优化自动点击软件
  • 哪些网站不扣流量/小吃培训去哪里学最好
  • 荔湾区pc端网站建设/西安疫情最新数据
  • 用户登录/网络优化工程师需要学什么
  • 网站网站建设专业/广西seo
  • 昆明医院网站建设/如何做好口碑营销
  • php网站开发公司/怎么制作网页教程
  • wordpress 全站通知/网站推广软件下载
  • 企业的网站开发费用摊销几年/宁波网络推广优化方案
  • 网站用axure做的rp格式/ip域名查询网站入口
  • 做视频网站视频短片/推广赚钱一个2元
  • 郑州教育信息网/网站seo推广公司靠谱吗
  • 旅游网站首页/青岛网页搜索排名提升
  • 网站建设款属不属于无形资产/临沂网站建设