ArrayList 為什麼執行緒不安全
我們先來看看 ArrayList 的 add 操作原始碼。
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
ArrayList 的不安全主要體現在兩個方面。
- 其一:
elementData[size++] = e;
不是一個原子操作,是分兩步執行的。
elementData[size] = e;
size++;
單執行緒執行這段程式碼完全沒問題,可是到多執行緒環境下可能就有問題了。可能一個執行緒會覆蓋另一個執行緒的值。
- 列表為空 size = 0。
- 執行緒 A 執行完
elementData[size] = e;
之後掛起。A 把 "a" 放在了下標為 0 的位置。此時 size = 0。 - 執行緒 B 執行
elementData[size] = e;
因為此時 size = 0,所以 B 把 "b" 放在了下標為 0 的位置,於是剛好把 A 的資料給覆蓋掉了。 - 執行緒 B 將 size 的值增加為 1。
- 執行緒 A 將 size 的值增加為 2。
這樣子,當執行緒 A 和執行緒 B 都執行完之後理想情況下應該是 "a" 在下標為 0 的位置,"b" 在標為 1 的位置。而實際情況確是下標為 0 的位置為 "b",下標為 1 的位置啥也沒有。
- 其二:
ArrayList 預設陣列大小為 10。假設現在已經新增進去 9 個元素了,size = 9。
- 執行緒 A 執行完 add 函式中的
ensureCapacityInternal(size + 1)
掛起了。 - 執行緒 B 開始執行,校驗陣列容量發現不需要擴容。於是把 "b" 放在了下標為 9 的位置,且 size 自增 1。此時 size = 10。
- 執行緒 A 接著執行,嘗試把 "a" 放在下標為 10 的位置,因為 size = 10。但因為陣列還沒有擴容,最大的下標才為 9,所以會丟擲陣列越界異常
ArrayIndexOutOfBoundsException
相關文章
- ArrayList執行緒不安全怎麼辦?(CopyOnWriteArrayList詳解)執行緒
- 為什麼?為什麼StringBuilder是執行緒不安全的?UI執行緒
- 什麼是執行緒安全和執行緒不安全執行緒
- 29-HashMap 為什麼是執行緒不安全的?HashMap執行緒
- HashMap為何執行緒不安全HashMap執行緒
- 什麼時候執行緒不安全?怎樣做到執行緒安全?怎麼擴充套件執行緒安全的類?執行緒套件
- 執行緒池管理(1)-為什麼需要執行緒池執行緒
- 執行緒安全和執行緒不安全理解執行緒
- python為什麼要用執行緒Python執行緒
- 為什麼要使用執行緒池執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- 程式執行緒新解:什麼是程式?什麼是執行緒?執行緒
- 為什麼redis是單執行緒的以及為什麼這麼快?Redis執行緒
- 我會手動建立執行緒,為什麼讓我使用執行緒池?執行緒
- python 多執行緒為什麼雞肋?Python執行緒
- Redis為什麼是單執行緒?為什麼有如此高的效能?Redis執行緒
- ArrayList 的執行緒安全問題執行緒
- redis是單執行緒的,為什麼這麼快Redis執行緒
- 什麼是多執行緒?Python多執行緒有什麼優勢?執行緒Python
- 單執行緒的 Javascript 為什麼可以非同步執行緒JavaScript非同步
- 為什麼多執行緒可以利用到多核?執行緒
- 為什麼說執行緒太多,cpu切換執行緒會浪費很多時間?執行緒
- GC 為什麼要掛起使用者執行緒? 什麼愁什麼怨?GC執行緒
- HashMap為何執行緒不安全?HashMap,HashTable,ConcurrentHashMap對比HashMap執行緒
- 【多執行緒與高併發】Java守護執行緒是什麼?什麼是Java的守護執行緒?執行緒Java
- 一步步瞭解執行緒池之為什麼要用執行緒池執行緒
- 為什麼 Random.Shared 是執行緒安全的random執行緒
- 為什麼 Go map 和 slice 是非執行緒安全的?Go執行緒
- 什麼是程式(執行緒)同步執行緒
- 什麼是Python執行緒?Python執行緒如何建立?Python執行緒
- Redis是單執行緒的,但Redis為什麼這麼快?Redis執行緒
- JDK21的虛擬執行緒是什麼?和平臺執行緒什麼關係?JDK執行緒
- Netty是什麼,Netty為什麼速度這麼快,執行緒模型分析Netty執行緒模型
- SimpleDateFormat一定是執行緒不安全嗎?ORM執行緒
- 24. 一個普通main方法的執行,是單執行緒模式還是多執行緒模式?為什麼?AI執行緒模式
- 從執行緒池理論聊聊為什麼要看原始碼執行緒原始碼
- 為什麼dispatch_sync在主執行緒會死鎖執行緒
- 為什麼有人說 Python 多執行緒是雞肋?Python執行緒