分布式鎖簡單隨筆

2021-10-06 11:05:49 字數 1188 閱讀 5358

前言:防止看完忘記,做一點小筆記方便自己通過這些點回憶起來。

為何高併發會導致資料庫資料出現問題?

一般程式的更新操作分為兩個步驟,先查詢再更新,查詢和更新之間存在一定的業務,如:增加一條訂單資訊。高併發情況下,可能會存在1執行緒還未更新,2執行緒查庫的資料與1相同,之後並行更新導致庫存雖然為0,但產生多於原庫存數量的訂單(也就是超賣了)。單機應用面對高併發使用lock,sysnc就可以保證不會超賣,但分布式系統會有問題。

如何實現分布式鎖?

常見的三種方式:資料庫分布式鎖,zk分布式鎖,redis分布式鎖。

可重入鎖與不可重入鎖:

不可重入鎖:只判斷這個鎖有沒有被鎖上,只要被鎖上申請鎖的執行緒都會被要求等待。實現簡單

可重入鎖:不僅判斷鎖有沒有被鎖上,還會判斷鎖是誰鎖上的,當就是自己(同一執行緒)鎖上的時候,那麼他依舊可以再次訪問臨界資源,並把加鎖次數加一。

設計了加鎖次數,以在解鎖的時候,可以確保所有加鎖的過程都解鎖了,其他執行緒才能訪問。不然沒有加鎖的參考值,也就不知道什麼時候解鎖?解鎖多少次?才能保證本執行緒已經訪問完臨界資源了可以喚醒其他執行緒訪問了。實現相對複雜。

reentrantlock和sychronized是可重入鎖,兩者區別:

synchronized是依賴於jvm實現的,而reentrantlock是jdk實現的。

鎖的細粒度和靈活度:reentrantlock優於synchronized, synchronized的使用比較方便簡潔,並且由編譯器去保證鎖的加鎖和釋放,而reentrantlock需要手工宣告來加鎖和釋放鎖,為了避免忘記手工釋放鎖造成死鎖,所以最好在finally中宣告釋放鎖。

reentrantlock獨有的能力:

reentrantlock可以指定是公平鎖還是非公平鎖。而synchronized只能是非公平鎖。所謂的公平鎖就是先等待的執行緒先獲得鎖。

reentrantlock提供了乙個condition(條件)類,用來實現分組喚醒需要喚醒的執行緒們,而不是像synchronized要麼隨機喚醒乙個執行緒要麼喚醒全部執行緒。

reentrantlock提供了一種能夠中斷等待鎖的執行緒的機制,通過lock.lockinterruptibly()來實現這個機制。

什麼情況下使用reentrantlock:

答案是,如果你需要實現reentrantlock的三個獨有功能時。

簡單聊聊分布式鎖 Redis分布式鎖

單機redis分布式鎖 單機redis分布式鎖 首先咱們先聊聊單機的redis分布式鎖 第乙個最普通的實現方式,就是在 redis 裡使用 setnx 命令建立乙個 key,這樣就算加鎖。set resource name my random value nx px 30000執行這個命令就 ok。...

簡單聊聊分布式鎖 zookeeper分布式鎖

zookeeper分布式鎖 zookeeper分布式鎖 舉個栗子。對某乙個資料連續發出兩個修改操作,兩台機器同時收到了請求,但是只能一台機器先執行完另外乙個機器再執行。那麼此時就可以使用 zookeeper 分布式鎖,乙個機器接收到了請求之後先獲取 zookeeper 上的一把分布式鎖,就是可以去建...

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...