Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList从并行线程中删除不存在的对象_Java_Multithreading_Arraylist - Fatal编程技术网

Java ArrayList从并行线程中删除不存在的对象

Java ArrayList从并行线程中删除不存在的对象,java,multithreading,arraylist,Java,Multithreading,Arraylist,最近,我在玩信号量和多线程时,注意到数组列表出现了一些奇怪的情况。更多详情: 我有一个带有单个私有ArrayList的类: public class NewClass{ private ArrayList list = new ArrayList(); public void put(Object val){ list.add(val); } public void del(Object val){ list.remove(v

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

我有一个带有单个私有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);
    }
}
从某个线程中,我尝试从中删除元素(之前没有添加任何内容):

公共类SomeClass{
公共静态void main(字符串[]args)引发InterruptedException{
新类();
}
public SomeClass()抛出InterruptedException{
线程tr2=新线程(){
@凌驾
公开募捐{
NewClass nc=新的NewClass();
对于(int i=0;i<100;i++){
北卡罗来纳州德尔(i);
}
}
};
tr2.start();
}
}

当线程开始工作时-我没有错误,没有异常,等等,而如果调试,我可以清楚地看到列表;返回-1值-它实际上不存在,但被“删除”。有人能解释一下这里发生了什么吗?

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

注释太长:

  • 您的
    NewClass
    实例不会跨线程共享,每个实例只能从一个线程访问
  • 对空列表调用
    List.remove(int-index)
    并没有什么特别的作用(它返回-1)
    • 就像你说的“玩弄东西”

      我怀疑你被夹在中间 ArrayList的两种方法

       public E remove(int index) // throws exception 
      
      and 
      
       public boolean remove(Object o) // doesn't throws exception
      
      当您通过它访问线程时,实际上是将它作为引用作为对象进行传递。它实际上调用了remove(objecto)方法,该方法不会引发异常

      而我认为当你在玩单线程程序时,你可以直接调用

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


      这只是我的假设,因为您没有提供在调用remove时抛出异常的代码,列表将比以前更短。你认为你的循环码是对的吗?总长度不再是100

      如果调试的话,我可以清楚地看到这个列表,请你澄清一下这个部分;返回-1值-它实际上不存在,但被“删除”。有人能解释一下这里发生了什么吗?你期望从这个程序中得到什么?这里没有太多的多线程,只要
      tr2
      启动,主线程就完成了。你在某个时候向列表中添加了什么吗?并且没有并行线程访问你的列表!啊,索引版本返回元素。好的,我现在明白了-看起来,当我使用像remove(i)这样的东西时,它不是作为对象值被接受的,而是作为对象的索引被接受的-出于这个原因,它实际上作为结果返回空值-没有引发异常。感谢您帮助理解:)
       public E remove(int index) // throws exception 
      
      and 
      
       public boolean remove(Object o) // doesn't throws exception