這就要從arraylist的資料結構和原始碼分析了。關鍵點是,arraylist的add的方法不是執行緒安全的。還是帶大家大致看下原始碼吧!
//新增元素 複寫了介面list裡面的方法,這個方法沒有任何的鎖,也沒有看到cas
public
boolean
add(e e)
private
void
ensurecapacityinternal
(int mincapacity)
private
static
intcalculatecapacity
(object[
] elementdata,
int mincapacity)
return mincapacity;
}
//這裡面就不看了,無非就是擴擴容
private
void
ensurecapacityinternal
(int mincapacity)
arraylist方法新增方法是非執行緒安全的,新增操作可以簡單理解為兩個步驟給索引位置賦值
size加1如果現在有兩個執行緒a,b,size為5,索引為4,a執行緒讀到索引位值時,將值賦值到這個位置,這時cpu時間片讓出,b執行緒讀到的索引位置也是4,將size加1。這個時候a執行緒恢復cpu時間片,size加1。這樣,索引位置值變成了a執行緒賦值的值,b執行緒的值被覆蓋了,但是size卻加了2次,這樣取值的時候自然就取到了空值。
這樣的話大家git到
為啥說arraylist
是執行緒不安全的了嘛?
public
class
arraylisttest})
.start()
;}trycatch
(interruptedexception e)
print
(personlist);}
public
void
print
(list
personlist)})
;}}
影響力 你為什麼會說「是」?
第二章 互惠 互惠原理認為,我們應該盡量以相同的方式回報他人為我們所做的一切。互惠原理的威力在於,即使是乙個陌生人,或者是乙個不討人喜歡或不受歡迎的人,如果先施予我們一點小小的恩惠然後再提出自己的要求,也會大大提高我們答應這個要求的可能性。互惠原理指出,乙個人在採取了某種行為以後,自己也應該受到同樣...
ArrayList為什麼不安全
arraylist和vector安全問題 前言 執行緒安全 在多執行緒訪問的時候,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能訪問直到該執行緒讀取完,其它執行緒才可以使用,不會出現資料不一致或資料汙染。執行緒不安全 不能提供資料保護,有可能多個執行緒先後更改資料造成所得...
ArrayList 為什麼執行緒不安全
我們先來看看 arraylist 的 add 操作原始碼。public boolean add e e arraylist 的不安全主要體現在兩個方面。其一 elementdata size e 不是乙個原子操作,是分兩步執行的。elementdata size e size 單執行緒執行這段 完全...