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

2021-10-23 11:08:34 字數 1190 閱讀 3806

這就要從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 單執行緒執行這段 完全...