老废物乐园 瓜子的技术笔记 · Java / AI / 金融科技

SimpleDateFormat 非线程安全导致线上日期错乱复盘

客服说:订单创建时间显示成了 1970 年 5 月 14 号早上,客服群里转过来一张用户截图,订单详情里的创建时间是 1970-01-01 08:00:00。我第一反应是数据库存了 0,查了一下,数据库里的时间戳完全正常。 那就是显示的时候格式化错了。去看那段代码: @Service public

遥望星星 遥望星星 发布于 2019-01-23

深拷贝与浅拷贝:一次对象被意外修改引发的生产事故

优惠券金额半夜自己变了 4 月 27 号凌晨一点,我被电话叫醒。客服说有用户投诉:领的 20 元券,下单时变成 5 元了。我爬起来查数据库,发现那批用户券的金额字段确实从 20 变成了 5,而且更新时间不是操作时间。 翻代码的时候找到了这段: // 从配置里取出默认的券模板 CouponTempla

遥望星星 遥望星星 发布于 2019-01-19

String 拼接用 + 还是 StringBuilder?一次循环拼接引发的 CPU 飙高

导出功能上线,CPU 直接干到 780% 新做的对账单导出上线第一天,监控图上 CPU 从 15% 一条直线拉到 780%(8 核机器)。同一个时间点 Full GC 频率从每小时 2 次变成每分钟 30 多次。导出的文件也就 4MB 大小,不至于。 我用 jstack 抓了几把线程,大量线程停在这

遥望星星 遥望星星 发布于 2019-01-12

BigDecimal 金额计算踩坑:0.1 + 0.2 与精度丢失

测试提了个单:0.06 的账对不上 入职第三个月,我接手了个结算的小需求。上线第二天测试同学甩过来一张截图,说订单金额 0.06 元的对账差了 1 分钱。我当时还嘴硬:"double 怎么可能算错?"然后自己跑了一遍。 System.out.println(0.1 + 0.2); //

遥望星星 遥望星星 发布于 2019-01-03

泛型通配符 extends 与 super 到底怎么用?PECS 原则实践

一段编译不过的代码 上周写了个把 List<Integer> 拷到 List<Number> 的工具方法,编译直接红了。我当时第一反应是:Integer 不是 Number 的子类吗,这也不行? List<Integer> ints = Arrays.asList(1, 2, 3); List<Nu

遥望星星 遥望星星 发布于 2019-01-01