多個執行緒(或行程)要執行同一個特定的不可重入的程式碼區塊(稱為臨界區),這就需要適當的並發控制同步技術。否則,可能會發生競態條件。
--維基百科
說白了就是但多個執行緒同時要對某一區域區塊(臨界區/臨界資源)操作,需要運用一些技術手段來對臨界資源進行保護,避免共同使用期間產生混亂。
舉個簡單的例子,我們支付寶給?@旺柴先生轉帳?1RBM,這個時候同時也有另外一個人給他轉帳?1RBM,這時他自己的錢包已經有1塊錢來,但由於這兩筆帳是同時進帳的,所以非線程同步系統會作出如下操作:
#非線程同步最終取錢包餘額為2元,顯然是不對的,我們來看看加上線程同步後:
最終取錢包餘額為3元,這裡的解決方案採用了加鎖?來解決,那麼具體的都有哪幾種方式呢?
我們這裡也可以用一個更通俗的例子來說明:
有一個新建的十字路口,剛開始的適合這個路口沒多少車輛?,大家每次到這個路口都很愉快地通過了可是慢慢的知道這條路的人越來越多,但是大家都沒有秩序地通過路口,結果有一天就出了事故了,所以負責道路設施的人來裝了一個紅綠燈,只有這個方向的綠燈亮了,這個方向的人方可前行,這就是互斥鎖
而有的車輛到這裡不一定是要過路口的,有的車輛這是到這裡掉個頭,所以負責道路設施的人就設計了一條掉頭車道,允許掉頭的車輛?通過,而不用跟直行車輛等待紅燈才能掉頭。這就是讀寫鎖
附近有家倉庫發生火災了,消防車佔用了轉彎車道(佔用資源不釋放,自己過了別人才能過),直到消防車隊?? ?通過後後面的車輛才能正常通行,這就是自旋鎖
這個路口是城區入口,久而久之交通壓力變大,交通部門開始指定規定,早晚高峰時段外端口車輛禁止通行,且限號出現,這就是增加「條件變數」添加緩衝區緩解壓力
有些例子可能不那麼準確,例如自旋鎖,但透過這個例子結合實際理論可我們可以快速理解記憶各鎖?的特徵。
以上是兩個生活範例帶你理解'線程同步原理”的詳細內容。更多資訊請關注PHP中文網其他相關文章!