各类锁(互斥锁,自旋锁,读写锁,乐观锁,悲观锁,死锁)
互斥鎖
當有一個線程要訪問共享資源(臨界資源)之前,會對線程訪問的這段代碼(臨界區)進行加鎖。如果在加鎖之后沒釋放鎖之前其他線程要對臨界資源進行訪問,則這些線程會被阻塞睡眠,直到解鎖,如果解鎖時有一個或者多個線程阻塞,那么這些鎖上的線程就會變成就緒狀態,然后第一個變為就緒狀態的線程就會獲取資源的使用權,并且再次加鎖,其他線程繼續阻塞等待。
讀寫鎖
也叫做共享互斥鎖,讀模式共享,寫模式互斥。有點像數據庫負載均衡的讀寫分離模式。它有三種模式:讀加鎖狀態,寫加鎖狀態和不加鎖狀態。簡單來說就是只有一個線程可以占有寫模式的讀寫鎖,但是可以有多個線程占用讀模式的讀寫鎖。
當寫加鎖的模式下,任何線程對其進行加鎖操作都會被阻塞,直到解鎖。
當在讀加鎖的模式下,任何線程都可以對其進行讀加鎖的操作,但所有試圖進行寫加鎖操作的線程都會被阻塞。直到所有讀線程解鎖。但是當讀線程太多時,寫線程一直被阻塞顯然是不對的,所以一個線程想要對其進行寫加鎖時,就會阻塞讀加鎖,先讓寫加鎖線程加鎖
自旋鎖
自旋鎖和互斥鎖很像,唯一不同的是自旋鎖訪問加鎖資源時,會一直循環的查看是否釋放鎖。這樣要比互斥鎖效率高很多,但是仍然需要占用CPU。所以自旋鎖適用于多核的CPU。但是還有一個問題是當自旋鎖遞歸調用的時候會造成死鎖現象。所以慎重使用自旋鎖。
樂觀鎖
這其實是一種思想,當線程去拿數據的時候,認為別的線程不會修改數據,就不上鎖,但是在更新數據的時候會通過版本來判斷其他線程是否修改了該數據。,如果數據被修改了就拒絕更新,之所以叫樂觀鎖是因為并沒有加鎖。
悲觀鎖
當線程去拿數據的時候,總假設別的線程會去修改數據,所以它每次拿數據的時候都會上鎖,別的線程去拿數據的時候就會阻塞。
這兩種鎖一般用于數據庫,當一個數據庫的讀操作遠遠大于寫的操作次數時,使用樂觀鎖會加大數據庫的吞吐量。
總結
以上是生活随笔為你收集整理的各类锁(互斥锁,自旋锁,读写锁,乐观锁,悲观锁,死锁)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三星成立电动汽车特别小组 拆了一辆特斯拉
- 下一篇: 一箱油跑1000多公里!比亚迪最豪华MP