多執行緒競爭問題分析

2021-07-30 16:49:34 字數 1092 閱讀 1457

public

class

mystack

}public

synchronized

string

pop()

throws

interruptedexception

return

list

.remove

(list

.size()-

1);}}

}

問題: 這段**大多數情況下執行正常,但是某些情況下會出問題。什麼時候會出現什麼問題?如何修正?

case1:刪除不存在的元素

假設現在有三個執行緒a、b、c,其中a用於新增元素,b、c用於刪除元素。

某時刻,棧為空,

step1、執行緒b執行,獲取鎖,list.size()=0,進入wait(),wait狀態下會釋放當前鎖

step2、執行緒a執行,獲取鎖,新增元素,執行list.add(value),此時list.size()=1,注意:在a執行notify()之前,執行緒c啟動,發現其他執行緒已經擁有物件鎖,因此進入阻塞狀態,等待鎖

step3、執行緒a執行notify(),試圖喚醒等待中的執行緒b,但是但是但是,

如果此時c獲取了物件鎖,那麼將優先執行

,那麼c判斷list.size()=1,直接刪除元素,然後釋放物件鎖(疑惑:1.這裡c是否可以優先獲取物件鎖,因為b已經在wait狀態? 2.如果c能優先獲取物件鎖,那麼如何保證c結束後b能順利被喚醒?)

step4、wait狀態下的b獲取物件鎖,直接執行list.remove(list.size()-1),發生錯誤!!!

解決辦法: 使用可同步的資料結構來存放資料,比如linkedblockingqueue之類。由這些同步的資料結構來完成繁瑣的同步操作。

case2:虛假喚醒

虛假喚醒就是一些obj.wait()會在除了obj.notify()和obj.notifyall()的其他情況被喚醒,而此時是不應該喚醒的。

解決的辦法是基於while來反覆判斷進入正常操作的臨界條件是否滿足: (將if換成while)

synchronized (obj)

多執行緒 避免多執行緒競爭

不可修改變數 互斥鎖cas 返回狀態碼 https是http加上ssl的應用層協議。在http的基礎上增加了安全性和可靠性。埠的不同 http預設是80埠,https預設是443埠 安全性 http是明文傳輸,https是密文傳輸。認證 http沒有認證,https在建立tcp連線前會進行ssl層的...

多執行緒分析

多程序適合於完全不相干的幾件事情同時做。因為除了 段相同之外,別的都是互不相干的,而多執行緒則可以 所謂多執行緒 執行緒是可執行 的可分派單元。這個名稱 於 執行的線索 的概念。在基於執行緒的多工的環境中,所有程序有至少乙個執行緒,但是它們可以具有多個任務。這意味著單個程式可以併發執行兩個或者多個任...

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

有看過有人買火車票,乙個人在飛豬買,乙個人在12306買,買到了同一張票。也有看到過,庫存中已經沒貨了但是仍然賣出去了。超買,超賣,秒殺等問題就是執行緒安全問題。多個執行緒操作同乙個共享變數。為 a b c a處有判斷,b處有相關業務,c處有共享變數資料改變。在某個時間,有三個執行緒 1 執行緒1首...