java中致命的sort问题--不支持多线程

本文探讨了一项关于用户权限丢失的问题,详细分析了在高并发环境下,由于使用非线程安全的collection.sort方法导致的权限集合混乱现象,并提出了有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间,我们的系统遇到了一个很奇怪的问题,当系统压力比较大时,常常会出现登陆用户没有权限的问题,退出再次登录就好了。

用户的权限我们是存放在内存中做实时刷新的,每当用户权限设置改变就会动态刷新。

 

难道是内存刷新机制出了问题?禁止内存刷新后,问题依旧,看来是别的问题所致。

后来当出错时就将内存中的用户权限集合打印到log中,经过比对发现,用户权限的总数是对的,就是colletion中重复的记录。

有重复的记录,也就是说有些权限被冲掉了,怎么会冲掉哪?最后定位在了cellection.sort身上。

原来collection中的url是不排序的,为了正则表达式对比的需要,必须排序。所以在比对之前先做collection.sort的排序。将排序拿掉,一切OK。

 

原因分析如下:collection.sort方法是非线程安全的,刚刚sort到一半,被复制到别处时,就是这个集合中的前一半是sort后的结果,后一半是未sort的结果,这个collection中的值就乱套了。

 

结论和教训:在涉及到多线程问题时,要特别的小心,千万不要使用非线程安全的方法。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值