从成员列表中删除时创建新对象(扩展线程)会导致UnsupportedOperationException

问题描述 投票:0回答:1

我有一个MyObject() extends Thread,它会以MyObject方法创建自己的新run()。该对象具有List<E>作为成员,在某些情况下我从中删除该对象。

I在创建新对象时,我随后调用start()以启动其run方法。但是,一旦我生成新对象,它就会抛出一个

Exception in thread "Thread-1" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:73)
at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.remove(ImmutableCollections.java:80)
at mypackage.MyMainClass.MyObject.run(MyObject.java:87)  <- here I remove from my List

示例:

public class MyObject extends Thread {
    List<SomeType> list = new ArrayList<SomeType>();
    SomeType st;

    public MyObject(SomeType st) {
        this.st = st;
        // returns a List of SomeType
        list = st.getList();
    }

    @Override
    public void run() {
        while(!done) {
            SomeType toDelete;
            if (condition) {
                toDelete = st.getToDelete();
            }
            // Checks for null etc are done and not important
            for (SomeType sometype : list) {
                if (somecondition) {
                    // toDelete is always in that List
                    list.remove(toDelete)
                } 
            }

            if (lastcondition) {
                MyObject newObject = new MyObject(this.st);
                newObject.start();
            }
        }
    }
}

为什么会出现此错误?由于列表是对象的每个实例的成员,所以为什么它对于新线程是不可变的,但对于我的初始对象却不可变?

java multithreading list thread-safety immutability
1个回答
0
投票

问题由@Joachim Sauer指出:使用List.of()创建的列表是不可变的。

© www.soinside.com 2019 - 2024. All rights reserved.