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。