目錄
背景
獨占鎖與共享鎖
獨占鎖
共享鎖
公平鎖與非公平鎖
公平鎖
非公平鎖
可重入鎖
總結
背景
最近有一些小伙伴會問我一些關于并發相關的問題,在與他們的溝通中,我發現他們對鎖的概念很模糊,這部分基礎概念的缺失導致他們寫的程式經常死鎖,還無法bebug,雖然在網上有很多資料,但我還是用一些比較通俗易懂的例子,描述一下,幫助大家理解,
獨占鎖與共享鎖
我發現很多人會把獨占鎖與公平鎖搞混,其實他們不在一個方向上,
獨占鎖
獨占鎖是指在同一個時間只能有一個執行緒占有他,所以具備排他性,像synchronized關鍵字就是典型的獨占鎖,
舉個栗子:獨占鎖相當于獨間的澡堂,一個人進了這件澡堂,其他人都不能進,只有等他出來,
共享鎖
什么是共享鎖?
就是指同一時間可以被多個執行緒占有,像java自帶的ReadWriteLock、Semaphore,他們可以設定自己共享的數量,
舉個栗子:共享鎖相當于一個大型公共澡堂,一開始就設定了能進去洗澡人的數量,比如是10個人,那么你要進去的時候會檢查一下有沒有滿10個,滿了你就在門口排隊去吧,
公平鎖與非公平鎖
如果你在排隊買奶茶,有個人插隊了但是沒人制止,你生不生氣?他買到了奶茶揚長而去,這公不公平,
公平鎖
公平鎖就是多個執行緒去申請鎖的使用權的時候,執行緒會直接進入佇列排隊,排在前面的可以先獲得鎖,排在后面的只能等著前面的先用,
舉個栗子:有個澡堂,里面已經滿了,后面的人想沖進去,但是有個保安站在門口,他讓后面想進來的人都排好隊,出來一個,就從隊伍的前面放一個人進去,
沒錯,這就很公平,
但是公平鎖也會帶來其他的缺點,就是需要一個保安去控制,帶來的其他開銷,如果大家蜂擁而至去搶位置,少了這個保安,會更有效率,沒錯公平鎖的缺點就是會帶來更大的開銷以及吞吐量下降,
非公平鎖
與公平鎖對應的就是非公平了,簡而言之就是和公平鎖反正來,什么不公平來什么,關鍵字synchronized就是典型的非公平鎖,
缺點就是不公平,在某些場景中,特別是每次獲取鎖后會迅速執行并且釋放鎖的情況下,非公平鎖是可以使用的,假設你洗澡的時間巨長,還有人插我隊,這誰能忍得了?
可重入鎖
可重入鎖的概念很多人容易理解錯,他是指同一個執行緒在申請到鎖的情況下,繼續申請鎖不會阻塞,而是有個計數器記錄該執行緒以及執行緒申請的次數,
舉個栗子:還是單間浴室,但是我有一個洗澡卡,一旦我進了洗澡間就要刷卡,而且出來的時候還需要刷卡退出,那么我一旦進了洗澡間,我可以刷好幾次進入卡,這不會阻塞住,因為都是我自己刷的,但是我退出洗澡間的時候我得刷同樣次數的退出卡,不然下一個進來的人刷不了進入卡,好理解嗎?你也別管我刷幾次,反正我刷幾次進入,就刷幾次退出,
像java的關鍵字synchronized和ReentrantLock類都是可重入鎖,
總結
希望這些簡單的栗子可以幫主你理解java一些鎖知識,不要把生硬的文字過度理解,跳出文字本身,設想一些生活中的場景,可以幫助我們更好的理解知識,
分享:
知識有兩種,其一是我們自己精通的問題;其二是我們知道在哪里找到關于某問題的知識, ——約翰生
如果本文對你有用的話,請點個贊吧,謝謝!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385582.html
標籤:java
