前段时间,我们的系统遇到了一个很奇怪的问题,当系统压力比较大时,常常会出现登陆用户没有权限的问题,退出再次登录就好了。
用户的权限我们是存放在内存中做实时刷新的,每当用户权限设置改变就会动态刷新。
难道是内存刷新机制出了问题?禁止内存刷新后,问题依旧,看来是别的问题所致。
后来当出错时就将内存中的用户权限集合打印到log中,经过比对发现,用户权限的总数是对的,就是colletion中重复的记录。
有重复的记录,也就是说有些权限被冲掉了,怎么会冲掉哪?最后定位在了cellection.sort身上。
原来collection中的url是不排序的,为了正则表达式对比的需要,必须排序。所以在比对之前先做collection.sort的排序。将排序拿掉,一切OK。
原因分析如下:collection.sort方法是非线程安全的,刚刚sort到一半,被复制到别处时,就是这个集合中的前一半是sort后的结果,后一半是未sort的结果,这个collection中的值就乱套了。
结论和教训:在涉及到多线程问题时,要特别的小心,千万不要使用非线程安全的方法。