之前写个并发处理的小模块,怕多线程同时写把数据搞花,顺手加了个 synchronized。锁对象图省事直接用了传进来的 Integer 当 key。服了
结果上线没两天数据就开始串味儿…,排查半天才反应过来:Integer.valueOf 对 -128~127 是有缓存的,用小整数当锁对象时,不同请求拿到的是同一个对象,锁等于没锁。范围再大点反而各自 new,互不干扰了,诡异得很。
就这种反直觉的坑,文档里明明白白写着,真踩到之前谁会往这想。后来换成 ConcurrentHashMap 当锁池才消停。
你们还踩过哪些"看起来很稳其实在裸奔"的坑。