今天我們就來講講執行緒安全?
何為執行緒安全,為什麼會出現執行緒不安全的問題。
其實問題出在,當多個執行緒同時共享,同乙個全域性變數或靜態變數,做寫的操作的時候,重要的事情說三遍,做寫的時候,做寫的時候,做寫的時候,可能會發生資料衝突問題,也就是執行緒安全問題,但是在做讀操作時是不會發生資料衝突問題的。
我們來演示乙個案列:現在火車站售票,票數100張,有兩個視窗同時搶火車票,我們用多執行緒模擬搶票效果。廢話不多說,直接上**。
public class threadtraindemo implements runnable catch (exception e)
sale();}}
public void sale()
}public static void main(string args)
}//列印
視窗1,**第1張票
視窗2,**第2張票
視窗1,**第3張票
視窗2,**第4張票
視窗1,**第5張票
視窗2,**第6張票
視窗2,**第7張票
視窗1,**第7張票
視窗1,**第9張票
視窗2,**第9張票
視窗1,**第11張票
視窗2,**第11張票
視窗1,**第13張票
視窗2,**第13張票
視窗2,**第15張票
視窗1,**第15張票
視窗1,**第17張票
視窗2,**第18張票
視窗1,**第19張票
視窗2,**第20張票
視窗2,**第21張票
視窗1,**第22張票
視窗1,**第23張票
視窗2,**第24張票
視窗1,**第25張票
視窗2,**第25張票
視窗2,**第27張票
視窗1,**第27張票
視窗1,**第29張票
視窗2,**第29張票
視窗1,**第31張票
視窗2,**第31張票
視窗2,**第33張票
視窗1,**第33張票
視窗1,**第35張票
視窗2,**第35張票
視窗1,**第37張票
視窗2,**第37張票
視窗2,**第39張票
視窗1,**第39張票
視窗1,**第41張票
視窗2,**第41張票
視窗2,**第43張票
視窗1,**第44張票
視窗1,**第45張票
視窗2,**第45張票
視窗2,**第47張票
視窗1,**第47張票
視窗2,**第49張票
視窗1,**第50張票
視窗2,**第51張票
視窗1,**第51張票
視窗1,**第53張票
視窗2,**第53張票
視窗2,**第55張票
視窗1,**第55張票
視窗1,**第57張票
視窗2,**第57張票
視窗1,**第59張票
視窗2,**第59張票
視窗1,**第61張票
視窗2,**第61張票
視窗2,**第63張票
視窗1,**第63張票
視窗1,**第65張票
視窗2,**第66張票
視窗2,**第67張票
視窗1,**第68張票
視窗1,**第69張票
視窗2,**第69張票
視窗1,**第71張票
視窗2,**第71張票
視窗1,**第73張票
視窗2,**第73張票
視窗2,**第75張票
視窗1,**第75張票
視窗2,**第77張票
視窗1,**第78張票
視窗1,**第79張票
視窗2,**第80張票
視窗2,**第81張票
視窗1,**第81張票
視窗1,**第83張票
視窗2,**第84張票
視窗1,**第85張票
視窗2,**第86張票
視窗1,**第87張票
視窗2,**第88張票
視窗1,**第89張票
視窗2,**第90張票
視窗1,**第91張票
視窗2,**第92張票
視窗1,**第93張票
視窗2,**第94張票
視窗1,**第95張票
視窗2,**第96張票
視窗1,**第97張票
視窗2,**第98張票
視窗1,**第99張票
視窗2,**第100張票
process finished with exit code 0
大家看到上面的執行結果沒有,在售11,13,15張票的時候,兩個售票視窗同時售了,售了兩遍,這是啥情況,要是這樣把票售出去了,那估計會,老哥們可以腦部一下。
我們來從上面的**得到乙個結論,多個執行緒共享同乙個全域性成員變數時,做寫的操作可能會發生資料衝突問題。
問題不是目的,目的是要把他解決了。
執行緒安全解決辦法:
問題:如何解決多執行緒之間執行緒安全問題
使用多執行緒之間同步synchronized或使用鎖(lock)
問題:為什麼使用執行緒同步或使用鎖能解決執行緒安全問題了。
將可能會發生資料衝突問題(執行緒不安全問題),只能讓當前乙個執行緒進行執行,**執行完成後釋放鎖,然後才能讓其他執行緒進行執行,這樣的話,就可以解決執行緒不安全的問題。
什麼是多執行緒之間同步。
當多個執行緒共享同乙個資源,不會受到其他執行緒的干擾。
多執行緒講解系列三
今天我們就來講講run 方法與start 方法的區別 通常情況下,系統通過呼叫執行緒類的start 方法來啟動一線程,此時該執行緒處於就緒狀態,而非執行狀態,也就意味著這個執行緒可以被jvm來排程執行,在排程過程中,jvm通過呼叫執行緒類的run 方法來完成實際的操作,當run 方法結束後,此執行緒...
多執行緒講解
using system using system.threading using system.windows.forms namespace threadtest private void form1 load object sender,eventargs e private void but...
Spring系列(五)Spring的多執行緒
spring通過任務執行器 taskexecutor 來實現多執行緒和併發程式設計。使用thredpooltaskexecutor可以實現基於執行緒池的taskexecutor。為了實現非同步任務,可以在配置類中通過 enable開啟對非同步任務的支援,並通過實際執行的bean的方法使用 async...