扫一扫
分享文章到微信

扫一扫
关注官方公众号
至顶头条
关于linkedList百思不得其解的问题
我有一段这样的代码: 
Java codeprivate LinkedList<Connection> freeCon = new LinkedList<Connection>();
public Connection getConn()
    {
        Connection re = null;
        if(freeCon.size()>0)
        {        
                        re = freeCon.getFirst();
            freeCon.removeFirst();            
                     try {    
                if(re.isClosed())
                {
                    this.getConn();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }else{
            re = this.getConnByDateSource();
        }
        return re;
    }
此代码有时会出现java.util.NoSuchElementException 
java.util.LinkedList.remove(Unknown Source) 
java.util.LinkedList.removeFirst(Unknown Source) 
dlp.oa.sql.SqlOracle.getConn(SqlOracle.java:117) 
这个异常不常发生,一般好几天发生一次,让我感到很奇怪的就是,re = freeCon.getFirst();没有出现NoSuchElementException为什么freeCon.removeFirst();会发生异常呢.看那个高手能道出个原因出来. 此错误重启tomcat就好了.
楼主是想模拟数据库连接池把?? 
出现这个异常时因为freeCon.getFirst();值为空 
肯定是楼主释放掉资源没有把资源放入连接池中,刚开始启动的时候比如有20个连接吧, 
用过释放掉,你用过20个之后,连接池中的connection就空了,所有报了这个异常. 
楼主释放资源的代码有问题.自己看看,是不是没把connection放回连接池中
public Connection getConn() 
方法没有同步,导致两个线程同时进入此方法了 
结果线程一在运行re = freeCon.getFirst();之后,可能时间片用完了,暂时停止运行。 
这个时候线程二进入了这个方法,同时运行了removeFirst了。 
然后线程一继续运行时removeFirst就报错了 
所以你的getConn必须增加同步声明 
你这个异常我用List的时候也出现过,不知道情形是否相同 
解决方法是 
不要用你list对象直接去remove 
而是用Iterator遍历 
然后用Iterator对象去remove 
for (Iterator it = list.iterator(); it.hasNext();) { 
    Object o=it.next(); 
    if(条件){ 
        it.remove(); 
    } 
} 
说不出原因来,但的确能解决
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。