我有一个队列为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);
线程端清除数据,我应该每次创建新列表吗?
答案 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}领域(你说)。
基本上,如果您的程序仍然可以找到对象的引用,它将不会被销毁。
或每次创建相同的名单时都是正确的?
我不确定你在这里问的是什么......