多執行緒講解系列五

2021-10-05 00:27:30 字數 2825 閱讀 5069

今天我們就來講講執行緒安全?

何為執行緒安全,為什麼會出現執行緒不安全的問題。

其實問題出在,當多個執行緒同時共享,同乙個全域性變數或靜態變數做寫的操作的時候,重要的事情說三遍,做寫的時候,做寫的時候,做寫的時候,可能會發生資料衝突問題,也就是執行緒安全問題,但是在做讀操作時是不會發生資料衝突問題的。

我們來演示乙個案列:現在火車站售票,票數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...