ArrayList執行緒不安全分析

2021-09-01 06:13:03 字數 986 閱讀 9360

乙個 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。這就是「執行緒不安全」了。

執行緒不安全的例子:

public

class

arraylistinthread

implements

runnable

catch (interruptedexception

e) list1

.add(thread

.currentthread

().getname());

}public

static

void

main(string

args) throws

interruptedexception

while (group

.activecount() >

0) system

.out

.println();

system

.out

.println(t

.list1

.size()); // it should be 10000 if thread safe collection is used.}}

ArrayList 為什麼執行緒不安全

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

執行緒不安全

背景 執行緒不安全 sleep 模擬網路延遲 後多執行緒併發訪問同乙個資源 方法1 同步 塊 語法 synchronized 同步鎖 catch interruptedexception e 方法2 同步方法 使用synchronizd修飾的方法,就叫同步方法,保證a執行緒執行該方法的時候,其他執行...

ArrayList為什麼不安全

arraylist和vector安全問題 前言 執行緒安全 在多執行緒訪問的時候,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能訪問直到該執行緒讀取完,其它執行緒才可以使用,不會出現資料不一致或資料汙染。執行緒不安全 不能提供資料保護,有可能多個執行緒先後更改資料造成所得...