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