ArrayList為什麼不安全

2021-09-29 16:37:52 字數 692 閱讀 6701

arraylist和vector安全問題

前言

執行緒安全:在多執行緒訪問的時候,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能訪問直到該執行緒讀取完,其它執行緒才可以使用,不會出現資料不一致或資料汙染。

執行緒不安全:不能提供資料保護,有可能多個執行緒先後更改資料造成所得到的資料是髒資料,資料不一值等,結果不可預料。

為什麼arraylist是不安全的?vector是安全的

list介面下有兩個實現,乙個是arraylist,另外乙個是vector。從原始碼來看,因為vecto的方法前面加了synchronized關鍵字,也就是同步的,所以說它是執行緒安全的,但是效能不高。arraylist是高效的,但是執行緒不安全的。

/**

** @return true (as specified by )

*/public

boolean

add(e e)

以上是arraylist add方法的原始碼–

elementdata[size++

]= e;

由此**片段可以得出兩個步驟:

1.elementdata[size] 存放元素。

2.size=size+1 增大size的值。

ArrayList 為什麼執行緒不安全

我們先來看看 arraylist 的 add 操作原始碼。public boolean add e e arraylist 的不安全主要體現在兩個方面。其一 elementdata size e 不是乙個原子操作,是分兩步執行的。elementdata size e size 單執行緒執行這段 完全...

ArrayList為什麼是執行緒不安全的

提到執行緒安全我們應該第一時間想到鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用,所以通過加鎖我們就可以保證乙個執行緒的安全性,list介面下面有兩個實現,乙個是arraylist,另外乙個是vector。從原始碼的角度來看,因為ve...

ArrayList 為什麼說是執行緒不安全的

這就要從arraylist的資料結構和原始碼分析了。關鍵點是,arraylist的add的方法不是執行緒安全的。還是帶大家大致看下原始碼吧!新增元素 複寫了介面list裡面的方法,這個方法沒有任何的鎖,也沒有看到cas public boolean add e e private void ensu...