ArrayList与Vector的多线程并发验证

ArrayList与Vector的多线程并发验证

首先要知道ArrayList是线程不安全的,Vector是线程安全的。
下面代码进行验证

一、ArrayList测试并发

测试ArrayList并发的类,具体细节及作用见注释。

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

/**
 * @auther zjj
 * @create 2020-05-11-16:17
 */
public class TestList implements Runnable {
    //这里使用的List接口的ArrayList实现类
    public static final List list = new ArrayList();//两次测试只有这里不同,其他地方完全相同!
    //并发执行的代码
    @Override
    public void run() {
        //对每个线程的集合进行10次数据存储
        for (int i = 0; i < 10; i++) {
            //存储时格式为:线程名称+第几次存储(方便打印输出时比较)
            list.add(Thread.currentThread().getName()+"   "+i);
        }
    }

    public static void main(String[] args) {
        //声明并执行两个线程
        TestList test1 = new TestList();
        TestList test2 = new TestList();
        new Thread(test1,"test1").start();
        new Thread(test2,"test2").start();
        //给主线程进行休眠操作,目的时为了让test1,tes2线程执行完成
        try {
            Thread.sleep(1000l);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印输出两条线程存储在ArrayList中的数据
        for (int i = 0; i < TestList.list.size(); i++) {
            System.out.println(TestList.list.get(i));
        }
    }
}

运行结果:
在这里插入图片描述
示例说明:ArrayList用来处理并发时不适合,甚至会异常。
(异常原因是对是否扩容的错误判断,线程切换后认为不需扩容就插入数据,结果容量不够,就抛出了异常,其实就是变量未同步引起的。)

二、Vector测试并发

测试Vector并发的类,具体细节及作用见注释。

import java.util.List;
import java.util.Vector;

/**
 * @auther zjj
 * @create 2020-05-11-16:17
 */
public class TestList implements Runnable {
    //这里使用的List接口的Vector实现类
    public static final List list = new Vector();
    //并发执行的代码
    @Override
    public void run() {
        //对每个线程的集合进行10次数据存储
        for (int i = 0; i < 10; i++) {
            //存储时格式为:县城名称+第几次存储(方便打印输出时比较)
            list.add(Thread.currentThread().getName()+"   "+i);
        }
    }

    public static void main(String[] args) {
        //声明并执行两个线程
        TestList test1 = new TestList();
        TestList test2 = new TestList();
        new Thread(test1,"test1").start();
        new Thread(test2,"test2").start();
        //给主线程进行休眠操作,目的时为了让test1,tes2线程执行完成
        try {
            Thread.sleep(1000l);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //打印输出两条线程存储在Vector中的数据
        for (int i = 0; i < TestList.list.size(); i++) {
            System.out.println(TestList.list.get(i));
        }
    }
}

运行结果:
在这里插入图片描述
结果说明:因为Vector的代码中都加入了synchronized关键字进行同步,避免了ArrayList出现的问题。所以并发操作时,要用Vector类。

三、举一反三(map接口下的HashMap与Hashtable类)

HashMap线程不安全,Hashtable线程安全。
也就是说,HashMap在处理多线程并发时也会出现存储上的数据错误的问题,此时要用Hashtable。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值