首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅在Java 1.8.0_45中使用ConcurrentModificationException

仅在Java 1.8.0_45中使用ConcurrentModificationException
EN

Stack Overflow用户
提问于 2015-09-22 21:56:06
回答 1查看 7.7K关注 0票数 4

关于这段代码,我有两个问题:

代码语言:javascript
复制
import java.util.*;

public class TestClass {

    private static List<String> list;   
    public static void main(String[] argv) {

        list = generateStringList(new Random(), "qwertyuioasdfghjklzxcvbnmPOIUYTREWQLKJHGFDSAMNBVCXZ1232456789", 50, 1000);

//      Collections.sort(list, new Comparator<String>() {
//          public int compare(String f1, String f2) {
//              return -f1.compareTo(f2);
//          }
//      });

        for (int i = 0; i < 500; i++) {
            new MyThread(i).start();
         }

    }

    private static class MyThread extends Thread  {
        int id;
        MyThread(int id) { this.id = id; }
        public void run() {

            Collections.sort(list, new Comparator<String>() {
                public int compare(String f1, String f2) {
                    return -f1.compareTo(f2);
                }
            });

            for (Iterator it = list.iterator(); it.hasNext();) {
                String s = (String) it.next();
                try {
                    Thread.sleep(10 + (int)(Math.random()*100));
                }catch (Exception e) { e.printStackTrace(); }

                System.out.println(id+" -> "+s);
            }           
        }       
    }

    public static List<String> generateStringList(Random rng, String characters, int length, int size)
    {
        List<String> list = new ArrayList<String>();
        for (int j = 0; j < size; j++) {
            char[] text = new char[length];
            for (int i = 0; i < length; i++)
            {
                text[i] = characters.charAt(rng.nextInt(characters.length()));
            }
            list.add(new String(text));
        }
        return list;
    }
}

在java 1.8.0_45上运行这段代码,我得到了java.util.ConcurrentModificationException

1)如果我在thread.start之前解排序,为什么我也会得到异常?

2)为什么只在java 1.8.0_45上得到异常?在1.6.0_45,1.7.0_79,1.8.0_5上它都运行得很好。

EN

回答 1

Stack Overflow用户

发布于 2015-09-22 22:06:11

你会得到这个异常,因为你有不同的线程同时修改和迭代列表。

注释掉的排序不是导致问题的原因。CME是由线程内部的排序和迭代引起的。因为你有多个线程排序和迭代,所以你得到了一个CME。这与Java版本无关。

看起来您的线程不需要修改列表,所以您可以在创建线程的循环之前执行一次排序,然后从线程中删除if。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32718852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档