如何在Java中重用列表?

时间:2015-07-19 02:02:58

标签: java multithreading list queue

我有一个队列为list<string>的线程类。当我从Java列表中的主要线程类队列中推送一个列表时,通过引用传递。因此,当下次我再次使用该列表清单时,清除我的线程端队列列表也清楚了。

list<int> my-list=new array list<int>();
obj.push(my-list); //obj is thread class obj.

下次如何使用my-list让线程方面对列表没有影响。

如果我再次使用my-list.clear();obj.push(my-list);线程端清除数据,我应该每次创建新列表吗?

1 个答案:

答案 0 :(得分:2)

  

我应该每次创建新列表吗?

是的,你应该。如果你没有,你改变了列表,那么你将(不可避免地)修改你先前入队的列表。

当您将Java对象放入Queue(或者实际上和其他集合框架数据结构)时,它不会复制它。您的代码必须考虑到这一点。

实际上,情况更糟。由于您正在讨论多线程应用程序,即使您打算更改队列中的列表,也可能会在队列上调用(例如)clear

问题在于,除非列表上的操作正确同步,否则正在读取列表的另一个线程不一定会看到列表的一致版本。它可能根本看不到更新,但更糟糕的是,它可能会看到列表的不一致视图;例如它看到的“大小”可能与列表中的实际元素数不匹配。 (即使读者和作者没有同时做事也是如此......)

  for(0---5){
    list<int> my-list=new array list<int>(); 
    obj.push(my-list); //obj is thread class obj. 
  } 
     

当我的for循环全5列表中的代码将被破坏时会发生什么   来自线程队列。

您所创建的5个列表对象将保留在队列中。他们没有被摧毁。

在Java中,当引用它们的变量超出范围时,对象不会被“销毁”。最多,他们可能成为符合条件进行垃圾收集...如果没有剩余的可访问参考。但是在您的示例中,obj队列中会有引用...因为您刚刚添加了它们...... obj队列本身是可以访问的,因为obj是{{1}领域(你说)。

基本上,如果您的程序仍然可以找到对象的引用,它将不会被销毁。

  

或每次创建相同的名单时都是正确的?

我不确定你在这里问的是什么......