LinkedList - java.util.ConcurrentModificationException

來源:互聯網
上載者:User

標籤:

package com.test.io;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.LinkedList;import com.mysql.jdbc.Buffer;public class ReadKeyFile {    public static void main(String[] args) throws IOException {                BufferedReader bufferedReader=null;        try {            bufferedReader = new BufferedReader(new FileReader("C:/Users/Administrator/Desktop/test.txt"));            LinkedList<String> list = new LinkedList<String>();            String str=bufferedReader.readLine();            while((str=bufferedReader.readLine())!=null) {                System.out.println(str);                list.add(str);            }            System.out.println("------------");            for (String string : list) {                System.out.println(list.removeLast());            }        } catch (Exception e) {            e.printStackTrace();        } finally {            if(bufferedReader != null)                bufferedReader.close();         }    }}

結果及報錯:

222222222222222222223333333333333333333344444444444444444444555555555555555555556666666666666666666677777777777777777777------------77777777777777777777java.util.ConcurrentModificationException    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966)    at java.util.LinkedList$ListItr.next(LinkedList.java:888)    at com.test.io.ReadKeyFile.main(ReadKeyFile.java:24)

test.txt:

11111111111111111111222222222222222222223333333333333333333344444444444444444444555555555555555555556666666666666666666677777777777777777777

 

如果將原始碼紅色部分替換為以下,則可以正常輸出,可見問題並不在remveLast()方法,而在迭代。

System.out.println(list.removeLast());System.out.println(list.removeLast());

 

在網上查到一段文字:

1.在使用增強for迴圈進行集合的迭代的時候其實預設使用的是迭代器;
2.因此在迴圈中不能使用集合的引用變數直接操作集合,避免導致多線程並發訪問的安全性異常。

1的意思即增強for迴圈的遍曆方式類似與:

Iterator<String> iterator = list.iterator();            while(iterator.hasNext())                System.out.println(iterator.next());

 

鑒於此,有必要看一下LinkedList的代碼。在LinkedList中,這個iterator就是ListItr ,它是繼承自Itr類,next()方法正是出自Itr類,在裡面找到next()的源碼如下:

public E next() {            checkForComodification();            try {                int i = cursor;                E next = get(i);                lastRet = i;                cursor = i + 1;                return next;            } catch (IndexOutOfBoundsException e) {                checkForComodification();                throw new NoSuchElementException();            }}

注意checkForComodification(),這就是報錯的地方啦,具體是在下面這個地方報的錯:

final void checkForComodification() {            if (modCount != expectedModCount)                throw new ConcurrentModificationException();}

根據我們的測試:LinkedList列印出第一排7就報錯了。

modCount 這個在打應出第一排7之後的值應該為8,因為add了7次,又removeLast了一次嘛

那expect為多少呢?

看看Itr原始碼吧,真亂,又實在是不想去讀注釋,我還是去翻翻JAVA編程思想先

 

LinkedList - java.util.ConcurrentModificationException

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.