執行緒安全與執行緒不安全

2021-09-24 05:43:27 字數 1983 閱讀 2922

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

執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料

public boolean add(e e)
第二行,其實是執行

elementdata[size] = e;

size= size+1;

為什麼不安全?比如說,剛開始list為空。如果a執行緒要把a插入list,b執行緒要把b插入list,理想的情況應該是,size=2,list[0] = a,list[1]=b。然而,很可能是這樣的:

a執行elementdata[size] = e,此時 list[0]=a;

b再執行elementdata[size] = e,此時a的值被覆蓋,list[0] = b;

a執行size= size+1; 即1 = 0+1;

b執行size= size+1; 即2 = 1+1;

此時,第二個位置 list[1] = null

首先,arraylist是執行緒不安全的,因為

public class testarraylist ;

}).start();

//啟動執行緒2

new thread(new runnable() ;

}).start();

thread.sleep(1000);

// 列印所有結果

for (int i = 0; i < list.size(); i++) }

//執行緒1:在list中新增0-9

public void method1(arraylistlist) catch (interruptedexception e)

} }

//執行緒2:在list中新增10-19

public void method2(arraylistlist) catch (interruptedexception e)

} }}

我們設想得出的結果應該是:1,2,3…17,18,19。但是得出很多種結果,每次的都不一樣:

第10個元素為:null

第11個元素為:15

第12個元素為:6

第13個元素為:16

arraylistlist = new arraylist<>();
替換為:

listlist = new vector();
因為:arraylist是非執行緒安全的,vector是執行緒安全的;

執行結果:可以看到每乙個輪迴,都是執行緒1完全執行,再到執行緒2(或者先2後1)。不停交替

第0個元素為:0

第1個元素為:10

第2個元素為:11

第3個元素為:1

第4個元素為:2

第5個元素為:12

第6個元素為:3

第7個元素為:13

第8個元素為:4

第9個元素為:14

第10個元素為:5

第11個元素為:15

第12個元素為:16

第13個元素為:6

第14個元素為:17

第15個元素為:7

第16個元素為:18

第17個元素為:8

第18個元素為:9

第19個元素為:19

arraylist是非執行緒安全的,vector是執行緒安全的;

hashmap是非執行緒安全的,hashtable是執行緒安全的;

stringbuilder是非執行緒安全的,stringbuffer是執行緒安全的。

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...

執行緒安全與執行緒不安全

執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...

執行緒安全與執行緒不安全

執行緒不安全 就是不提供資料訪問保護,在多執行緒環境中對資料進行修改,會出現資料不一致的情況。執行緒安全 就是多執行緒環境中有對全域性變數的變動時,需要對執行的 塊採用鎖機制,當乙個執行緒訪問到某個資料時,其他執行緒需要等待當前執行緒執行完該 塊才可執行,不會出現資料不一致或者資料被汙染。如果一段 ...