java中致命的sort问题
前段时间,我们的系统遇到了一个很奇怪的问题,当系统压力比较大时,常常会出现登陆用户没有权限的问题,退出再次登录就好了。
用户的权限我们是存放在内存中做实时刷新的,每当用户权限设置改变就会动态刷新。
难道是内存刷新机制出了问题?禁止内存刷新后,问题依旧,看来是别的问题所致。
后来当出错时就将内存中的用户权限集合打印到log中,经过比对发现,用户权限的总数是对的,就是colletion中重复的记录。
有重复的记录,也就是说有些权限被冲掉了,怎么会冲掉哪?最后定位在了cellection.sort身上。
原来collection中的url是不排序的,为了正则表达式对比的需要,必须排序。所以在比对之前先做collection.sort的排序。将排序拿掉,一切OK。
原因分析如下:collection.sort方法是非线程安全的,刚刚sort到一半,被复制到别处时,就是这个集合中的前一半是sort后的结果,后一半是未sort的结果,这个collection中的值就乱套了。
结论和教训:在涉及到多线程问题时,要特别的小心,千万不要使用非线程安全的方法。
相关文档:
上次談過了使用iText產生PDF檔,這次換成來談談使用JExcel來產生EXCEL檔的方法。
首先,先到他的SourceForge主頁面download相關的API檔案。
http://sourceforge.net/projects/jexcelapi/
或
http://www.andykhan ......
java jce对aes算法有很好的支持,但是默认安装的JDK或者JRE是不能支持aes192bit密钥和aes256bit密钥两种算法的,需要到sun官方下载Java(TM) Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files,以下是jce unilimited strength jurisdiction policy files 6的官方 ......
学习Java值传递方法-武汉北大青鸟
值传递是在一个函数中,调用另外一个函数,其中含有参数传递的情况。往往值传递就是把数据传递到另外一个函数中进行进一步处理,以更清楚地显示函数的表达意思。在函数调用的时候会有数据传递,同样要考虑形参和实参的问题,如下面的一个程序:
on error resume next ShockMode ......
编写多线程的程序一直都是一件比较麻烦的事情,要考虑很多事情,处理不好还会出很多意想不到的麻烦。加上现在很多开发者接触到的项目都是打着企业级旗号的B/S项目,大多数人都很少涉及多线程,这又为本文的主角增加了一份神秘感。
讲到Java多线程,大多数人脑海中跳出来的是Thread、Runnable、synchronized…&hellip ......
package com.wfy.system.dao;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
......