【问题标题】:Java ArrayList removes non existing objects from parallel threadJava ArrayList 从并行线程中删除不存在的对象
【发布时间】:2013-07-11 11:48:51
【问题描述】:

最近我在玩信号量和多线程,当我注意到数组列表发生了一些奇怪的事情时。更多详情:

我有一个带有单个私有 ArrayList 的类:

public class NewClass{

    private ArrayList list = new ArrayList();

    public void put(Object val){
        list.add(val);
    }

    public void del(Object val){
        list.remove(val);
    }
}

从某个线程中,我正在尝试从中删除元素(在此之前不放置任何内容):

public class SomeClass {

    public static void main(String[] args) throws InterruptedException {
        new SomeClass();
    }

    public SomeClass() throws InterruptedException {
        Thread tr2 = new Thread() {
            @Override
            public void run() {
                NewClass nc = new NewClass();
                for (int i = 0; i < 100; i++) {
                        nc.del(i);
                }
            }
        };
        tr2.start();
    }
}

当线程开始工作时 - 我没有错误,没有异常等。而如果调试,我可以清楚地看到 list.indexOf(val);返回 -1 值 - 它实际上不存在,而是被“移除”。谁能解释这里发生了什么?

【问题讨论】:

  • 你能否澄清这部分 虽然,如果调试,我可以清楚地看到,list.indexOf(val);返回 -1 值 - 它实际上不存在,而是被“移除”。谁能解释这里发生了什么?
  • 你对这个项目的期望和你得到了什么
  • 这里没有太多的多线程,只要tr2启动,主线程就结束了。
  • 您是否会在某个时候将任何内容添加到您的列表中?
  • 并且没有并行线程访问您的列表!

标签: java multithreading arraylist


【解决方案1】:

如果您尝试使用 remove(Object o) 方法删除不在其中的内容,列表不会引发异常。他们返回 false。

【讨论】:

  • 啊,索引版返回元素。
  • 好的,我现在明白了 - 看起来,当我使用 remove(i) 之类的东西时,它不是作为对象值被接受的,而是作为对象的索引 - 因此,它真的返回了结果为 null - 不引发异常。感谢您帮助理解:)
【解决方案2】:

评论太长了:

  • 您的NewClass 实例不跨线程共享,每个实例只能从一个线程访问。
  • 在空列表上调用 List.remove(int index) 没有什么特别的(它返回 -1)。

【讨论】:

    【解决方案3】:

    就像你说的“玩弄东西”。

    我怀疑你被抓到了 ArrayList的两种方法。

     public E remove(int index) // throws exception 
    
    and 
    
     public boolean remove(Object o) // doesn't throws exception
    

    当您通过它访问线程时,您实际上是在将它作为引用作为对象传递。它实际上调用了不会抛出异常的 remove(Object o) 方法。

    虽然我认为在玩单线程程序时你直接调用

    list.remove(int) /// 实际抛出 IndexOutOfBoundsException 的方法。

    这只是我的假设,因为您没有提供引发异常的代码

    【讨论】:

      【解决方案4】:

      当您调用 remove 时,列表将变得比以前更短。你认为你的循环代码是正确的吗?总长度不再是 100。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-05
        • 2020-08-23
        • 2010-11-21
        • 2013-01-26
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 2013-03-17
        相关资源
        最近更新 更多