前言
還記得你第一次遇到「執行緒安全」這個詞的時候嗎?
我第一次遇到執行緒安全這個詞是在學習多執行緒并發操作的時候,看到人家文章里出現這個詞,還有說各種執行緒安全的類,但是一開始并不理解執行緒安全是什么意思,也沒去深究執行緒怎樣是安全的?怎樣是不安全的?只是腦子里接收了這么一個詞,
執行緒安全是多執行緒編程時的計算機程式代碼中的一個概念,在擁有共享資料的多條執行緒并行執行的程式中,執行緒安全的代碼會通過同步機制保證各個執行緒都可以正常且正確的執行,不會出現資料污染等意外情況,——《百度百科》
默認已學前置知識
- 行程:程式的一次執行的程序,是動態的,是系統進行資源分配的基本單位,一個行程里可以有多個執行緒,
- 執行緒:是一個系統進行調度的基本單位,是能獨立運行的,
下面開始回爐重造!打好基礎!
執行緒安不安全是怎樣定義的?
先給出個問題,為什么有執行緒安全這個詞?這個詞是怎么來的?可能這里會有點懵,不過沒事,我來回答,
在多執行緒的情況下,我們會遇到這樣一個問題,這里舉例 A、B、C 三個執行緒,它們共同操作同一個資源(吶,這里同一個資源指的是,變數,方法這些,更準確的話,應該說是記憶體,畢竟值都是存盤記憶體中的),記住,前提是多執行緒,畢竟如果你單執行緒,就不可能不安全了,單執行緒直接安安全全!

這三個執行緒同時操作,就可能出現這樣的問題,比如舉個具體的例子,經典例子,買票(老演員了)!啥票都行,
三個執行緒代表三個人,票的剩余量對于這三個執行緒來說就是共享資源,
設票的剩余量為10,記 ticketSurplus = 10,三人購票,那么肯定需要對這個剩余量進行減一操作的,
public void buy() {
ticketSurplus = ticketSurplus - 1;
System.out.println(ticketSurplus);
}
那么現在同時執行,就很大可能會出現這樣的情況,如圖所示(假設這三個執行緒執行順序是A、B、C,實際上順序是不確定的):

從上面可以看出,輸出結果為:9,9,8,而從上帝視角來看,顯然是錯誤的,因為兩個人買了票,不能只減一張票的值,正確的結果應該為9,8,7,
所以,在多執行緒并發的情況下,這就是所謂的「不安全」,即不能正確執行,結果出現了混亂(資料污染),
執行緒安全?
所謂執行緒安全,就是指當并發情況下,也就是有多個執行緒操作同一個資源(具體的話,這里同一個資源可以看成上面例子中的 ticketSurplus,當然這個同一資源也不一定只的是一個變數,也可以是某一個方法),能不能保證這個資源的一致性,如果任何時候都能夠保證這種正確的操作結果,那么就可以說是執行緒安全的,
如何保證執行緒安全?
在學習作業系統的時候,我們學習了行程管理的內容,其中就有個「行程同步」的概念,所謂行程同步,說簡單點就是行程之間具有前后的執行關系,在并發的情況下,不同行程有不同制約關系,比如某些情況下我們是需要 A 行程先執行,然后 B 行程再執行的,但是作業系統具有「異步性」,在并發的情況下,可能出現 B 先執行,A 后執行了,這顯然不是我們想要的,所以如果不制約,不控制行程的同步,就會出現上面說的情況,
當然,除了「同步」這個詞,還有一個詞——「互斥」,互斥也是用于控制行程之間關系的,
同步:完成某種任務,需要行程之間的執行順序有先后順序,相互協調作業,
互斥:一個行程進入臨界區訪問臨界資源,那么剩下的行程就需要進行等待,只有當它退出臨界區,才允許下一個行程訪問,
在 Java 中,我們可以通過 synchronized 關鍵字來保證臨界區的同步互斥,當然還有其他的鎖也可以實作同步互斥,進而保證多執行緒運行的安全,
總的來說,在多執行緒的情況下,通過加鎖的方式保證執行緒安全,
最后的最后
由本人水平所限,難免有錯誤以及不足之處, 螢屏前的靚仔靚女們 如有發現,懇請指出!
最后,謝謝你看到這里,謝謝你認真對待我的努力,希望這篇博客對你有所幫助!
你輕輕地點了個贊,那將在我的心里世界增添一顆明亮而耀眼的星!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/482521.html
標籤:Java
