List 线程不安全,其中的操作不是原子操作 Vector 是线程安全的,其中的操作有sync修饰,为同步操作
/**
* 对比 list 和 vector 线程安全
*/
public class ListVectorSaveTest {
ArrayList<String> dataList = new ArrayList<>();//arrayList线程不安全
Vector<String> vector = new Vector<>();//vector
/**
* list 线程不安全,其中的操作比如add等非原子操作
*/
public void testList(){
//有100个线程往里面各加100次
for (int i = 0;i < 100; i++){
new Thread(()->{
for (int j =0;j < 100;j++){
dataList.add("1");//非原子操作,线程不安全
}
}).start();
}
try {
Thread.sleep(5000);//等待5秒,确保运行完了
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("dataList Size应该有 10000,现有 Size:"+ dataList.size());
//dataList Size应该有 10000,现有 Size:9877
/**
* 此处会偶尔出现报错,原因是 list是线程不安全的,在多线程的情况下,其中的add会出现数组越界等情况
Exception in thread "Thread-1" java.lang.ArrayIndexOutOfBoundsException: 17
at java.util.ArrayList.add(ArrayList.java:444)
at com.teligen.dazt.learn.ListVectorSaveTest.lambda$testList$0(ListVectorSaveTest.java:16)
at com.teligen.dazt.learn.ListVectorSaveTest$$Lambda$1/500977346.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
dataList Size:91
*/
}
public void testVector(){
//有100个线程往里面各加100次
for (int i = 0;i < 100; i++){
new Thread(()->{
for (int j =0;j < 100;j++){
vector.add("1");//加了同步器,是线程安全的
}
}).start();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("vector Size应该有 10000,现有 Size:"+ vector.size());
//运行结果 vector Size应该有 10000,现有 Size:10000
}
public static void main(String[] args) {
ListVectorSaveTest test = new ListVectorSaveTest();
test.testList();
test.testVector();
}
}
dataList Size应该有 10000,现有 Size:9852
vector Size应该有 10000,现有 Size:10000