互斥鎖
自旋鎖讀寫鎖
條件變數
訊號量原子鎖
互斥鎖:首先它是睡眠鎖,會進行執行緒的切換
自旋鎖:迴圈等待鎖 一般用原子鎖實現的,會一直占用我們的cpu
lock(mutex);
執行unlock(mutex);
1、時間上的考慮,時間少就用自旋鎖,時間長就用互斥鎖
2、設計上,充分利用cpu時候,自旋鎖。代表是nginx。(鎖的力度要足夠小)
互斥鎖和自旋鎖是可以同時使用的
1、自旋鎖+時間2、時間超時後改用互斥鎖
乙個機器中的程序間競爭資源的鎖。nginx把以下結構放在共享記憶體中。
nginx程序鎖有三種方式的實現:
1、只支援原子鎖、自旋鎖
2、既支援原子操作有支援訊號量,自旋鎖+互斥鎖
3、檔案鎖
ngx_shmtx_t放在共享記憶體中。
實現方案:redis、資料庫、zookeeper
為什麼說分布式鎖比較難實現?如何保證分布式鎖
1、程序與資料中心的連線是不穩定的
2、程序是不穩定的,程序隨時可能崩掉
redis如何實現分布式鎖:
獲取鎖:set ["lock",1,nx] setnx["lock",1]
釋放鎖: del["lock"]
問題:a.如果a程序掛了,就會變成死鎖 b.誰可以釋放鎖,需要確定當前誰獲取了鎖
在分布式系統中如何區分不同的程序?
pid是依次累加的,可能出現重複,可以通過ip:port:pid:startime 四元組唯一標識程序
獲取鎖:set("lock",四元組,nx,ex,30)
釋放鎖:if get("lock")==程序四元組 redis的lua事務 mysql儲存過程一樣
del("lock")
問題:a.如果a操作臨界資源的時間超過30秒,加乙個執行緒:續時間
b、c、d程序怎麼去查詢鎖?第一種 時間輪訓 嘗試獲取鎖 第二中: 監聽發布機制+key超時機制。
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...
鎖和分布式鎖
一 鎖和分布式鎖 1.1 鎖 我們一般所說的鎖,就是指單程序多執行緒的鎖機制。在單程序中,如果有多個執行緒併發訪問某個某個全域性資源,存在併發修改的問題。如果要避免這個問題,我們需要對資源進行同步,同步其實就是可以加乙個鎖來保證同一時刻只有乙個執行緒能操作這個資源。在不同的場景,可能使用的鎖得方式不...
分布式鎖 紅鎖
單台redis支援 set key value nx px time value 必須唯一避免誤解鎖,設定與失效時間不能分割,刪除鎖判斷是否解鎖人就是加鎖人,鎖失效時間應自動延長有效期 1 獲取當前時間 2 向多個節點獲取鎖,獲取鎖有乙個極小的超時時間。獲取鎖失敗後,立即嘗試下乙個redis節點獲取...