為什麼說ArrayList是執行緒不安全的?
阿新 • • 發佈:2018-12-11
概要介紹 首先說一下什麼是執行緒不安全:執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料。 如圖,List介面下面有兩個實現,一個是ArrayList,另外一個是vector。 從原始碼的角度來看,因為Vector的方法前加了,synchronized 關鍵字,也就是同步的意思,sun公司希望Vector是執行緒安全的,而希望arraylist是高效的,缺點就是另外的優點。 說下原理(百度的,很好理解): 一個 ArrayList ,在新增一個元素的時候,它可能會有兩步來完成: 1. 在 Items[Size] 的位置存放此元素; 2. 增大 Size 的值。 在單執行緒執行的情況下,如果 Size = 0,新增一個元素後,此元素在位置 0,而且 Size=1; 而如果是在多執行緒情況下,比如有兩個執行緒,執行緒 A 先將元素存放在位置 0。但是此時 CPU 排程執行緒A暫停,執行緒 B 得到執行的機會。執行緒B也向此 ArrayList 新增元素,因為此時 Size 仍然等於 0 (注意哦,我們假設的是新增一個元素是要兩個步驟哦,而執行緒A僅僅完成了步驟1),所以執行緒B也將元素存放在位置0。然後執行緒A和執行緒B都繼續執行,都增加 Size 的值。 那好,現在我們來看看 ArrayList 的情況,元素實際上只有一個,存放在位置 0,而 Size 卻等於 2。這就是“執行緒不安全”了。 示例程式: