第 5-7 课:Java 中的各种锁和 CAS + 面试题
生活随笔
收集整理的這篇文章主要介紹了
第 5-7 课:Java 中的各种锁和 CAS + 面试题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如果說快速理解多線程有什么捷徑的話,那本文介紹的各種鎖無疑是其中之一,它不但為我們開發多線程程序提供理論支持,還是面試中經常被問到的核心面試題之一。因此下面就讓我們一起深入地學習一下這些鎖吧。
樂觀鎖和悲觀鎖
悲觀鎖和樂觀鎖并不是某個具體的“鎖”而是一種并發編程的基本概念。樂觀鎖和悲觀鎖最早出現在數據庫的設計當中,后來逐漸被 Java 的并發包所引入。
悲觀鎖
悲觀鎖認為對于同一個數據的并發操作,一定是會發生修改的,哪怕沒有修改,也會認為修改。因此對于同一個數據的并發操作,悲觀鎖采取加鎖的形式。悲觀地認為,不加鎖的并發操作一定會出問題。
樂觀鎖
樂觀鎖正好和悲觀鎖相反,它獲取數據的時候,并不擔心數據被修改,每次獲取數據的時候也不會加鎖,只是在更新數據的時候,通過判斷現有的數據是否和原數據一致來判斷數據是否被其他線程操作,如果沒被其他線程修改則進行數據更新,如果被其他線程修改則不進行數據更新。
公平鎖和非公平鎖
根據線程獲取鎖的搶占機制,鎖又可以分為公平鎖和非公平鎖。
公平鎖
公平鎖是指多個線程按照申請鎖的順序來獲取鎖。
非公平鎖
非公平鎖是指多個線程獲取鎖的順序并不是按照申請鎖的順序,有可能后申請的線程比先申請的線程優先獲取鎖。
ReentrantLock 提供了公平鎖和非公平鎖的實現。
- 公平鎖:new ReentrantLock(true)
- 非公平鎖:new ReentrantLock(false)
如果構造函數不傳任何參數的時候,默認提供的是非公平鎖。
獨占鎖和共享鎖
根據鎖能否被多個線程持有,可以把鎖分為獨占鎖和共享鎖。
總結
以上是生活随笔為你收集整理的第 5-7 课:Java 中的各种锁和 CAS + 面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有人说:轻量级锁一定比重量级锁快!我忍不
- 下一篇: Java 200+ 面试题补充② Net