科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道关于linkedList百思不得其解的问题

关于linkedList百思不得其解的问题

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

关于linkedList百思不得其解的问题

作者:csdn 来源:csdn 2009年12月17日

关键字: JavaSE 问答 java

  • 评论
  • 分享微博
  • 分享邮件

关于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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章