集合的线程安全问题
之前一直对Arraylist、Linkedlist的线程安全问题比较模糊,今天特意将ArrayList、Linkedlist、Vector三个集合进行线程安全测试
代码如下:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
public class Demo4 implements Runnable {
private static List<String> list1 = new ArrayList<String>();
private static List<String> list2 = new LinkedList<String>();
private static Vector<String> vector = new Vector<>();
private static int addNum = 0;
@Override
public void run() {
for(int i = 0; i < addNum; i ++){
list1.add("" + i);
list2.add("" + i);
vector.add("" + i);
}
}
public void listTest(int num, int addNum){
System.out.println("启动的线程数是:" + num);
System.out.println("循环的次数是:" + addNum);
Demo4.addNum = addNum;
Demo4 d = new Demo4();
for(int i = 0; i < num; i ++){
//无论是继承Thread还是实现Runnable,永远都是调用start()方法来启动线程,如果调用run()方法,JVM会当成普通方法来执行
//new Thread(d).run();
new Thread(d).start();
}
//之前漏掉了这句代码,然后测了N遍,发现三个集合都是线程不安全的,当时直接就怀疑人生了
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("ArrayList的大小:" + list1.size());
System.out.println("LinkedList的大小:" + list2.size());
System.out.println("Vector的大小:" + vector.size());
}
}
测试结果:
启动的线程数是:10
循环的次数是:10
ArrayList的大小:100
LinkedList的大小:100
Vector的大小:100
启动的线程数是:100
循环的次数是:100
ArrayList的大小:8475
LinkedList的大小:9312
Vector的大小:10000
结论:
1.在低并发下,三者都不会产生线程安全问题;
2.在高并发下,只有Vector是线程安全的;
上面的结论也不能绝对看待,可以仿照着线程安全的类,将其它线程不安全的类改造成线程安全的类。