多執行緒 執行緒安全問題簡單分析

2021-10-17 11:20:55 字數 1251 閱讀 2951

有看過有人買火車票,乙個人在飛豬買,乙個人在12306買,買到了同一張票。

也有看到過,庫存中已經沒貨了但是仍然賣出去了。

超買,超賣,秒殺等問題就是執行緒安全問題。

多個執行緒操作同乙個共享變數。

**為 a->b->c

a處有判斷,b處有相關業務,c處有共享變數資料改變。

在某個時間,有三個執行緒:

1、執行緒1首先來到了a**,接著往下執行,在執行c之前。

2、執行緒2來到了a**,判斷通過,進入,執行執行緒任務,這一步就錯了,執行緒2不應該過來。

3、等執行緒1執行c**後,共享變數已經改變,執行緒2在a處判斷就會失敗,不應該進來。

4、可以說,執行緒2鑽了空子,趁執行緒1執行過程中,還沒有對c進行修改,就進來了。

b**執行時間越長,就越容易產生這種問題。

同步**塊和同步方法解決的就是執行緒安全的問題。

同步**塊就是方法裡某幾行很安全的**。

同步方法就是這個方法一整個方法很安全。

只有持有鎖的執行緒才能進入同步**塊/方法。

在同步**塊中,鎖是自己new的。

在同步方法中,看這個方法是靜態還是非靜態(原因:靜態方法載入靠前):

靜態:類名.class。

非靜態:this,即方法的呼叫者物件。

鎖物件就是乙個普通的物件,僅僅起到乙個標識的作用,可以是任意型別。

意思就是這個鎖,你可以隨便new乙個字串,也可以隨便new乙個student類,都可以。

只需要遵循這個格式即可:

synchronized

(abc)

tips:

鎖物件是唯一的,多個執行緒要使用同乙個鎖物件。

執行緒離開同步**塊,就會釋放鎖。

synchronized可以修飾**塊,也可以修飾方法。

修飾方法,就是直接在方法前邊加上synchronized。

修飾**塊,就是在方法內部對某些**進行上鎖,就是修飾**塊。

synchronized不需要手動去釋放鎖,執行緒離開同步**塊,自動釋放鎖。

需要手動加鎖釋放鎖,

lock lock =

newreentrantlock()

;lock.

lock()

;...

lock.

unlock()

;

多執行緒安全問題

這裡的安全問題可以理解為 實現在邏輯上的問題,比如 火車站賣票 100張票讓4個人去賣,一定不能出現賣的票是負數問題,那麼開啟多執行緒後,如何才能保證賣的票不可能存在負數呢?常用的解決方法有兩種 1,使用同步 塊,把需要同步的 再放同步 塊中 2,使用同步函式 同步的鎖,可以理解為就是那個物件!同步...

多執行緒二 多執行緒安全問題

當多個執行緒共享同乙個全域性或者靜態變數,做寫的操作,可能會發生資料衝突問題,也就是執行緒安全問題。讀操作和區域性變數是不會發生的。二 執行緒安全的解決方法 該資源只能讓當前執行緒操作,操作完成之後,再讓其他執行緒執行 多執行緒之間同步 synchronized 使用鎖 lock 語法 synchr...

多執行緒(多執行緒的安全問題)

多執行緒的執行出現安全問題。非常可怕的問題,一出問題比較惱火 問題原因 重點 當多條語句在操作同乙個執行緒共享資料時,乙個執行緒對多條語句只執行了一部分,還沒執行完,另乙個執行緒參與進來執行。導致共享資料的錯誤。解決方法 對多條操作共享資料的語句,只能讓乙個執行緒都執行完,在執行過程中,其他執行緒不...