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