集合的线程安全问题

集合的线程安全问题

之前一直对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是线程安全的;

上面的结论也不能绝对看待,可以仿照着线程安全的类,将其它线程不安全的类改造成线程安全的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值