java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)
Java 的jdk級別的鎖主要是在JUC包下,包括atomic包下的樂觀鎖和locks包下的悲觀鎖。今天來介紹一下locks包下的悲觀鎖(由于百家號對markdown支持不好,代碼只能以圖片的方式展示了)
ReentrantLock
ReentrantLock實現了Lock接口,是可重入鎖,它是支持公平鎖和非公平鎖的。下面從加鎖和解鎖的過程分析一下ReentrantLock。
1、加鎖lock()
lock操作是分為公平和非公平兩種方式的,公平鎖顧名思義就是先到先得,先到的線程先拿到鎖,后到的線程需要排隊,等到前面的線程釋放鎖之后才能拿到鎖,這種方式的缺點是吞吐量小,因為在等待CPU的調度是需要耗費時間的;非公平鎖是先去嘗試獲取鎖,如果拿到鎖就成功了,如果拿不到再去排隊獲取鎖,這種方式相比公平鎖而言,就少了喚醒排隊鎖時所需要的時間,吞吐量會比公平鎖高。
ReentrantLock和AQS使用了模板設計模式,固定的處理方法都在AQS抽象類中
非公平鎖的lock
公平鎖的lock
對于公平鎖和非公平鎖都用到的方法,都是在AQS中,如下:
addWaiter方法構造一個Node放到隊尾
2、解鎖unlock()
unlock方法調用了AQS的release方法
在ReentrantLock中重寫了tryRelease方法,主要操作就是把state值減一
tryRelease成功之后,就要去喚醒它的繼任者,unparkSuccessor同樣是在AQS中實現
3、使用
在源碼中,也給出了簡單的使用例子,但是我覺得在jdk源碼中的類LinkedBlockingQueue使用ReentrantLock還是比較適合參照的,下面以代碼的形式展示ReentrantLock的使用方式
ReentrantLock就介紹到這了,明天繼續更文Lock相關知識
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java锁的级别_Java锁的那些事儿之JDK锁(ReentrantLock)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 审计数据大,oracle审
- 下一篇: Qt学习之Qt基础入门(下)