黑客24小时在线接单网站

黑客24小时在线接单网站,黑客网站入口,黑客接单入口,黑客攻击

写了个全局变量的bug,被同事们打脸

话说栈长前段时间写了一个作用,检测 0 bug 就上线,发布后也运作好好地的,好长时间都没人意见反馈bug,爽爆。。

出不来问题还行,出问题便是问题。。

近期有一个顾客意见反馈一些数据信息错乱问题,看编码好歹看不出来什么问题,很怪异,再认真看编码,原来是一个全局变量的问题,造成在高并发状况下产生了线程不安全的问题,过后被朋友们抽脸!!!

谨慎使用全局变量,我还在公司一直在注重,想不到那么低等的问题竟然产生在自个的身上,说起来确实愧疚啊。。

最初应用的是 Spring 注入对象的方法:

  • @Autowired
  • privateObjectobject;
  • 由于 Spring 默认设置是单例模式,因此那样写是没有问题的,之后伴随着项目的发展趋势,必须众多不一样的业务流程案例,我改为了这类方法:

  • @Setter
  • privateObjectobject;
  • 这一 @Setter 是 Lombok 的注释,用于转化成 setters 方式,如今想起来,真的是低等啊,与此同时实际操作的情形下,这一对象毫无疑问会发生遮盖的状况,进而造成上边说的问题。

    写了一个那么低等bug,我就不害怕过意不去传出来,大家都切记一下吧。

    此外,我再汇总好多个谨慎使用全局变量的情景:

    1、SimpleDateFormat

    SimpleDateFormat 严禁界定成 static 自变量或是全局共享资源自变量,因为它是线程不安全的,都被写满阿里的《Java开发手册》里了:

    写了个全局变量的bug,被同事们打脸

    为什么说 SimpleDateFormat 并不是线程安全性的呢?

    看来下它的 format 方式源代码:

    写了个全局变量的bug,被同事们打脸

    能够看见 calendar 自变量竟然也是全局变量,多线程状况下便会存有设定脏自变量的状况。

    因此,假如要用 SimpleDateFormat,就在每一次用的情况下都建立一个 SimpleDateFormat 对象,保证线程间防护。

    2、資源联接

    資源联接包含连接数据库、FTP联接、Redis连接等,这类也需要谨慎使用全局变量,一量应用全局变量,便会碰到下列问题:

    • 关掉联接的情况下,就有可能把他人已经实际操作的联接给关掉,造成别的线程的业务流程终断;
    • 由于是全局变量,建立的情况下也许会建立好几个案例,在关掉联接的情况下,就很有可能只关掉了一个对象的联接,导致别的联接沒有被关掉,最终造成联接耗光系统软件不能用;

    3、数字运算

    这也是个很經典的问题了,假如要用多线程对一个数据开展累积等别的计算解决,千万别用全局基础类型的自变量,如下所示所显示:

  • privatelongcount;
  • 多线程状况下,某一线程获得到的值很有可能早已被别的线程改动了,最终获得的值也不确切了。

    自然,上边的实例可以根据上锁的方法来处理,还可以应用全局的分子类(java.util.concurrent.atomic.Atom*)开展解决,例如:

  • privateAtomicIntegercount=newAtomicInteger();
  • 留意,这类分子类应用全局变量就沒有线程安全性的问题,它采用了 CAS 优化算法确保了数据信息一致性。

    但是,阿里巴巴强烈推荐应用LongAdder,由于特性更强:

  • java.util.concurrent.atomic.LongAdder
  • 写了个全局变量的bug,被同事们打脸

    4、全局session

    看来下边的事例:

  • @Autowired
  • protectedHttpSessionsession;
  • 全局注入一个 Session 对象,在 Spring 中,那样全局注入应用里面是默认设置没什么问题的,包含 request, response 对象,都能够根据全局注入来获得。

    那样会存有线程安全系数吗?

    不容易!

    应用这类方法,当 Bean 复位时,Spring 并沒有注入真正对象,反而是注入了一个代理商对象,真真正正应用的情况下根据该代理商对象获得正确的对象。

    而且,在注入该类对象时,Spring应用了线程静态变量(ThreadLocal),这就确保了 request/response/session 对象的线程安全系数了。

    实际也不进行了,详尽的简介及检测大伙儿可以点开这一连接查询这篇文章。

    即然是线程安全性,但也得当心,假如我还在方式中积极使 session 对象无效并复建了:

  • session.invalidate();
  • session=request.getSession();
  • 那样,session对象就变成了真正对象了,不会再是代理商对象,就变成了文章内容最初的情况下我讲的那类多线程安全隐患了,假如网上发生 session 对话错乱,客户 A 就很有可能见到客户 B 的数据信息,你想一想并不恐怖?

    因此,即使可以如此应用,也得一定谨小慎微,最好在方式等级应用这种对象。

    汇总

    今日,栈长汇总了一下我是怎么写下这一全局变量的低等 bug,也汇总了下谨慎使用全局变量的 4 种状况,坚信各位多是多少都遇到过相似的问题,期待能幫助大伙儿少踩坑。

    全局变量虽好,但大家也得慎重应用啊,一定要考虑到是不是造成多线程安全隐患,要不然会造成重大问题。

    • 评论列表:
    •  离鸢婼粥
       发布于 2022-05-31 05:47:25  回复该评论
    • 低等 bug,也汇总了下谨慎使用全局变量的 4 种状况,坚信各位多是多少都遇到过相似的问题,期待能幫助大伙儿少踩坑。全局变量虽好,但大家也得慎重应用啊,一定要考虑到是不是造成多线程安全隐患,要不然会造成重
    •  俗野歆笙
       发布于 2022-05-31 10:34:32  回复该评论
    • 话说栈长前段时间写了一个作用,检测 0 bug 就上线,发布后也运作好好地的,好长时间都没人意见反馈bug,爽爆。。出不来问题还行,出问题便是问题。。近期有一个顾客意见反馈一些数据信
    •  鸢旧寺瞳
       发布于 2022-05-31 01:24:39  回复该评论
    • teFormatSimpleDateFormat 严禁界定成 static 自变量或是全局共享资源自变量,因为它是线程不安全的,都被写满阿里的《Java开发手册》里了:为什么说 SimpleDateFormat 并不是线程安全性的呢?看来下它的 format 方
    •  舔夺岁吢
       发布于 2022-05-31 10:03:44  回复该评论
    • 分子类应用全局变量就沒有线程安全性的问题,它采用了 CAS 优化算法确保了数据信息一致性。但是,阿里巴巴强烈推荐应用LongAdder,由于特性更强:java.util.concurren

    发表评论:

    Powered By

    Copyright Your WebSite.Some Rights Reserved.