執行緒安全就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。
執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得到的資料是髒資料
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是執行緒安全的。
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...
執行緒安全與執行緒不安全
執行緒不安全 就是不提供資料訪問保護,在多執行緒環境中對資料進行修改,會出現資料不一致的情況。執行緒安全 就是多執行緒環境中有對全域性變數的變動時,需要對執行的 塊採用鎖機制,當乙個執行緒訪問到某個資料時,其他執行緒需要等待當前執行緒執行完該 塊才可執行,不會出現資料不一致或者資料被汙染。如果一段 ...