日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java多线程系列(四)---ReentrantLock的使用

發(fā)布時(shí)間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程系列(四)---ReentrantLock的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Lock的使用

前言:本系列將從零開始講解java多線程相關(guān)的技術(shù),內(nèi)容參考于《java多線程核心技術(shù)》與《java并發(fā)編程實(shí)戰(zhàn)》等相關(guān)資料,希望站在巨人的肩膀上,再通過我的理解能讓知識(shí)更加簡單易懂。

目錄

  • 認(rèn)識(shí)cpu、核心與線程
  • java多線程系列(一)之java多線程技能
  • java多線程系列(二)之對象變量的并發(fā)訪問
  • java多線程系列(三)之等待通知機(jī)制
  • java多線程系列(四)之ReentrantLock的使用
  • java多線程系列(五)之synchronized ReentrantLock volatile Atomic 原理分析
  • java多線程系列(六)之線程池原理及其使用

ReentrantLocak特性(對比synchronized)

  • 嘗試獲得鎖
  • 獲取到鎖的線程能夠響應(yīng)中斷

ReentrantLock(重入鎖)

public class MyService {private Lock lock = new ReentrantLock();public void testMethod() {lock.lock();for (int i = 0; i < 5; i++) {System.out.println("ThreadName=" + Thread.currentThread().getName()+ (" " + (i + 1)));}lock.unlock();}}

效果和synchronized一樣,都可以同步執(zhí)行,lock方法獲得鎖,unlock方法釋放鎖

await方法

public class MyService {private Lock lock = new ReentrantLock();private Condition condition=lock.newCondition();public void testMethod() {try {lock.lock();System.out.println("開始wait");condition.await();for (int i = 0; i < 5; i++) {System.out.println("ThreadName=" + Thread.currentThread().getName()+ (" " + (i + 1)));}} catch (InterruptedException e) {// TODO 自動(dòng)生成的 catch 塊e.printStackTrace();}finally{lock.unlock();}}}
  • 通過創(chuàng)建Condition對象來使線程wait,必須先執(zhí)行l(wèi)ock.lock方法獲得鎖

signal方法

public void signal(){try{lock.lock();condition.signal();}finally{lock.unlock();}}
  • condition對象的signal方法可以喚醒wait線程

創(chuàng)建多個(gè)condition對象

  • 一個(gè)condition對象的signal(signalAll)方法和該對象的await方法是一一對應(yīng)的,也就是一個(gè)condition對象的signal(signalAll)方法不能喚醒其他condition對象的await方法
  • ReentrantLock類可以喚醒指定條件的線程,而object的喚醒是隨機(jī)的

Condition類和Object類

  • Condition類的awiat方法和Object類的wait方法等效
  • Condition類的signal方法和Object類的notify方法等效
  • Condition類的signalAll方法和Object類的notifyAll方法等效

Lock的公平鎖和非公平鎖

Lock lock=new ReentrantLock(true);//公平鎖 Lock lock=new ReentrantLock(false);//非公平鎖
  • 公平鎖指的是線程獲取鎖的順序是按照加鎖順序來的,而非公平鎖指的是搶鎖機(jī)制,先lock的線程不一定先獲得鎖。

ReentrantLock類的方法

  • getHoldCount() 查詢當(dāng)前線程保持此鎖的次數(shù),也就是執(zhí)行此線程執(zhí)行l(wèi)ock方法的次數(shù)
  • getQueueLength()返回正等待獲取此鎖的線程估計(jì)數(shù),比如啟動(dòng)10個(gè)線程,1個(gè)線程獲得鎖,此時(shí)返回的是9
  • getWaitQueueLength(Condition condition)返回等待與此鎖相關(guān)的給定條件的線程估計(jì)數(shù)。比如10個(gè)線程,用同一個(gè)condition對象,并且此時(shí)這10個(gè)線程都執(zhí)行了condition對象的await方法,那么此時(shí)執(zhí)行此方法返回10
  • hasWaiters(Condition condition)查詢是否有線程等待與此鎖有關(guān)的給定條件(condition),對于指定contidion對象,有多少線程執(zhí)行了condition.await方法
  • hasQueuedThread(Thread thread)查詢給定線程是否等待獲取此鎖
  • hasQueuedThreads()是否有線程等待此鎖
  • isFair()該鎖是否公平鎖
  • isHeldByCurrentThread() 當(dāng)前線程是否保持鎖鎖定,線程的執(zhí)行l(wèi)ock方法的前后分別是false和true
  • isLock()此鎖是否有任意線程占用
  • lockInterruptibly()如果當(dāng)前線程未被中斷,獲取鎖
  • tryLock()嘗試獲得鎖,僅在調(diào)用時(shí)鎖未被線程占用,獲得鎖
  • tryLock(long timeout TimeUnit unit)如果鎖在給定等待時(shí)間內(nèi)沒有被另一個(gè)線程保持,則獲取該鎖

tryLock和lock和lockInterruptibly的區(qū)別

  • tryLock能獲得鎖就返回true,不能就立即返回false,tryLock(long timeout,TimeUnit unit),可以增加時(shí)間限制,如果超過該時(shí)間段還沒獲得鎖,返回false
  • lock能獲得鎖就返回true,不能的話一直等待獲得鎖
  • lock和lockInterruptibly,如果兩個(gè)線程分別執(zhí)行這兩個(gè)方法,但此時(shí)中斷這兩個(gè)線程,前者不會(huì)拋出異常,而后者會(huì)拋出異常

讀寫鎖

  • ReentrantLock是完全互斥排他的,這樣其實(shí)效率是不高的。
public void read() {try {try {lock.readLock().lock();System.out.println("獲得讀鎖" + Thread.currentThread().getName()+ " " + System.currentTimeMillis());Thread.sleep(10000);} finally {lock.readLock().unlock();}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
  • 讀鎖,此時(shí)多個(gè)線程可以或得讀鎖
public void write() {try {try {lock.writeLock().lock();System.out.println("獲得寫鎖" + Thread.currentThread().getName()+ " " + System.currentTimeMillis());Thread.sleep(10000);} finally {lock.writeLock().unlock();}} catch (InterruptedException e) {e.printStackTrace();}}
  • 寫鎖,此時(shí)只有一個(gè)線程能獲得寫鎖
public void read() {try {try {lock.readLock().lock();System.out.println("獲得讀鎖" + Thread.currentThread().getName()+ " " + System.currentTimeMillis());Thread.sleep(10000);} finally {lock.readLock().unlock();}} catch (InterruptedException e) {e.printStackTrace();}}public void write() {try {try {lock.writeLock().lock();System.out.println("獲得寫鎖" + Thread.currentThread().getName()+ " " + System.currentTimeMillis());Thread.sleep(10000);} finally {lock.writeLock().unlock();}} catch (InterruptedException e) {e.printStackTrace();}}
  • 結(jié)果是讀鎖釋放后才執(zhí)行寫鎖的方法,說明讀鎖和寫鎖是互斥的

總結(jié)

  • Lock類也可以實(shí)現(xiàn)線程同步,而Lock獲得鎖需要執(zhí)行l(wèi)ock方法,釋放鎖需要執(zhí)行unLock方法
  • Lock類可以創(chuàng)建Condition對象,Condition對象用來是線程等待和喚醒線程,需要注意的是Condition對象的喚醒的是用同一個(gè)Condition執(zhí)行await方法的線程,所以也就可以實(shí)現(xiàn)喚醒指定類的線程
  • Lock類分公平鎖和不公平鎖,公平鎖是按照加鎖順序來的,非公平鎖是不按順序的,也就是說先執(zhí)行l(wèi)ock方法的鎖不一定先獲得鎖
  • Lock類有讀鎖和寫鎖,讀讀共享,寫寫互斥,讀寫互斥

我覺得分享是一種精神,分享是我的樂趣所在,不是說我覺得我講得一定是對的,我講得可能很多是不對的,但是我希望我講的東西是我人生的體驗(yàn)和思考,是給很多人反思,也許給你一秒鐘、半秒鐘,哪怕說一句話有點(diǎn)道理,引發(fā)自己內(nèi)心的感觸,這就是我最大的價(jià)值。(這是我喜歡的一句話,也是我寫博客的初衷)

作者:jiajun 出處:?http://www.cnblogs.com/-new/

from:?https://www.cnblogs.com/-new/p/7256297.html?

總結(jié)

以上是生活随笔為你收集整理的java多线程系列(四)---ReentrantLock的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。