文章目錄
- ArrayList不是執行緒安全的,使用一個案例演示
- 結果分析
- 需要執行緒安全怎么辦?
- 原始碼分析其為何安全?
ArrayList不是執行緒安全的,使用一個案例演示
- 任務類
import java.util.List;
/**
* Created with IntelliJ IDEA.
* Description: If you don't work hard, you will a loser.
* User: Listen-Y.
* Date: 2020-09-27
* Time: 15:42
*/
//執行緒任務類
public class CollectionTask implements Runnable {
private List<String> list;
public CollectionTask(List<String> list) {
this.list = list;
}
@Override
public void run() {
//在任務中插入名字
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(Thread.currentThread().getName());
}
}
- 測驗類
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* Description: If you don't work hard, you will a loser.
* User: Listen-Y.
* Date: 2020-09-27
* Time: 15:41
*/
//測驗類
public class ArrayListSafetyTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
//list = Collections.synchronizedList(list);
CollectionTask task = new CollectionTask(list);
for (int i = 0; i < 50; i++) {
new Thread(task).start();
}
//等待執行緒執行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//遍歷鏈表
for (String str : list
) {
System.out.println(str);
}
}
}
結果分析

- 問題就是遍歷鏈表出現null值, 我們看看原始碼分析一下這是為什么
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
//添加一次元素就會size++一次
elementData[size++] = e;
return true;
}
- 問題就出在size++上, 多個執行緒同時給一個位置添加元素, 導致size++了, 但是資料覆寫了, 所以就會出現空的位置
需要執行緒安全怎么辦?
- 使用Collections.synchronizedList(list)或者Vector<>()
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* Description: If you don't work hard, you will a loser.
* User: Listen-Y.
* Date: 2020-09-27
* Time: 15:41
*/
//測驗類
public class ArrayListSafetyTest {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
//重點
list = Collections.synchronizedList(list);
CollectionTask task = new CollectionTask(list);
for (int i = 0; i < 50; i++) {
new Thread(task).start();
}
//等待執行緒執行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//遍歷鏈表
for (String str : list
) {
System.out.println(str);
}
}
}
原始碼分析其為何安全?

- 很簡單就是給加個一把鎖
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/136504.html
標籤:其他
上一篇:HTTP Basic Auth:使用和Postman 測驗
下一篇:[記錄四]Vue+node+koa2+mysql+nginx+redis,全堆疊開發小程式和管理員管理系統專案——token控制介面權限
