当前位置: 代码迷 >> J2EE >> 此代码有时会出现java.util.NoSuchElementException
  详细解决方案

此代码有时会出现java.util.NoSuchElementException

热度:341   发布时间:2016-04-22 03:38:24.0
关于linkedList百思不得其解的问题,看那个高手能道出个原因出来
我有一段这样的代码:
Java code
private 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就好了.

------解决方案--------------------
public Connection getConn()
方法没有同步,导致两个线程同时进入此方法了

结果线程一在运行re = freeCon.getFirst();之后,可能时间片用完了,暂时停止运行。
这个时候线程二进入了这个方法,同时运行了removeFirst了。
然后线程一继续运行时removeFirst就报错了

所以你的getConn必须增加同步声明
------解决方案--------------------
LinkedList存在结构变化,多线程访问时需要加同步。
------解决方案--------------------
我觉得是需要同步的,因为你的连接list是一个共享资源
------解决方案--------------------
感觉还是6楼说的线程同步问题,至于后面也发生这个情况可能是你在什么地方又向freeCon里添加了Connection结果导致发生同样的情况。
------解决方案--------------------
1,首先这个类必须是单例.不能存在两个连接池控制对象.
2,其次,这个getConnection方法必须是同步的.否则会造成同抢而抛异常.
3,满足了2,ArrayList是否要同步就无所谓了.应为不会同抢了.
------解决方案--------------------
LinkedList不是线程安全的。你可以改成用Vector或者SynchronizedList。
------解决方案--------------------
多线程同步问题。
------解决方案--------------------
同步啊大哥,几天才出几次问题那肯定是没同步
  相关解决方案