首先我没有在这里使用迭代器。我无法从Java共享ArrayList中删除元素,同时添加到它
我在一个共享的ArrayList上使用2个线程,1st用于向ArrayList添加值,另一个用于创建它的临时副本并对其执行一些操作,然后从原始列表中删除所有临时元素。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ArraylistTest {
public static void main(String...ar){
new AddingThread().start();
new RemovalThread().start();
}
}
class RemovalThread extends Thread{
static List<Integer> originalBigList = new ArrayList<>();
@Override
public void run(){
System.out.println("RemovalThread started");
while(true){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("creating copy of originalBigList");
List<Integer> tempList = new ArrayList<>(originalBigList);
System.out.println("copied list");
//
//some operations on copied temp list
//
System.out.println("removing tempList elements after completing operations");
System.out.println("originalBigList before removing size "+originalBigList.size());
originalBigList.removeAll(tempList);
System.out.println("removed!!");
System.out.println("after size "+originalBigList.size());
}
}
}
class AddingThread extends Thread{
@Override
public void run(){
System.out.println("Adding thread started");
int ctr = 0;
while(true){
RemovalThread.originalBigList.add(ctr);
ctr++;
}
}
}
输出: -
Adding thread started
RemovalThread started
creating copy of originalBigList
copied list
removing tempList elements after completing operations
originalBigList before removing size 4102267
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:261)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
at java.util.ArrayList.add(ArrayList.java:458)
at AddingThread.run(ArraylistTest.java:47)
现在我的问题是,我看到在其中复制列表中的语句被执行,正在从最初的名单列表温度的输出,但去除语句没有执行,也没有给出任何异常,我使用简单的arraylist不同步,那么为什么这样呢?
移除或添加操作时是否有内部锁定?如果是,那么Collections.synchronised(ArrayList)有什么用?
ArrayList是不是线程安全的? – LazerBanana
2在2分钟内向上提问?是的,这看起来不像投票欺诈。 – Tom
嘿汤姆为什么有-1评级,我只是问了一个有效的问题.... –