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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java多线程(4) ----- Lock的使用

發布時間:2023/12/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java多线程(4) ----- Lock的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(歡迎關注微信公眾號:深入Java底層)

4.1使用ReentrantLock類

調用ReentrantLock對象的lock()方法獲取鎖,調用unlock()方法釋放鎖,效果和使用synchronized關鍵字一樣。

Object類中的wait()方法相當于Condition類中的await()方法。在condition. await()方法調用之前需要先調用lock.lock()代碼獲得同步器。

Object類中的wait(longtimeout)方法相當于Condition類中的await(longtime,TimeUnit unit)方法。

Object類中的notify()方法相當于Condition類中的signal()方法。

Object類中的notifyAll()方法相當于Condition類中的signalAll()方法。

使用ReentrantLock對象(準確說是Condition()對象)可以喚醒指定種類的線程,對線程執行的業務進行排序規劃。

方法getHoldCount()、getQueueLength()和getWaitQueueLength()的測試

1) ?方法int getHoldCount()的作用是查詢當前線程保持此鎖定的個數,也就是調用lock()方法的次數。

2) ?方法int getQueueLength()的作用是返回正等待獲取此鎖鎖定的線程估計數,比如有5個線程,1個線程首先執行await()方法,那么在調用getQueueLength()方法后返回值是4,說明有4個線程同時在等待lock的釋放。

3) ?方法int getWaitQueueLength(Conditioncondition) 的作用是返回等待與此鎖定相關的給定條件Condition的線程估計數,比如有5個線程,每個線程都執行了同一個condition對象的await()方法,則調用getWaitQueueLength(Conditioncondition)方法時返回的int值是5。

方法hasQueueThread()、hasQueueThreads()和hasWaiters()的測試

1)????????方法boolean hasQueueThread(Thread thread)的作用是查詢指定的線程是否正在等待獲取此鎖定。

2)????????方法boolean hasQueueThreads的作用是查詢是否有線程正在等待獲取此鎖定。

3)????????方法boolean hasWaiters(Conditioncondition)的作用是查詢是否有線程正在等待與此鎖定有關的condition條件。

方法isFair ()、isHeldByCurrentThread()和isLocked()的測試

1)????????方法boolean isFair()的作用是判斷是不是公平鎖。在默認情況下,ReentrantLock類使用的是非公平鎖。

2)????????方法boolean isHeldByCurrentThread()的作用是查詢當前線程是否保持此鎖定。

3)????????方法boolean isLocked()的作用是查詢此鎖定是否由任意線程保持。

方法lockInterruptibly()、tryLock()和tryLock(long timeout,TimeUnit unit)的測試

1)????????方法void lockInterruptibly()的作用是:如果當前線程未被中斷,則獲取鎖定,如果已經被中斷則出現異常。

2)????????方法boolean tryLock()的作用是,僅在調用時鎖定未被另一個線程保持的情況下,才獲取該鎖定。

3)????????方法boolean tryLock(long timeout, TimeUnit unit)的作用是,如果鎖定在給定等待時間內沒有被另一個線程保持,且當前線程未被中斷,則獲取該鎖定。

方法awaitUninterruptibly()的使用

void awaitUninterruptibly();

//調用該方法的前提是,當前線程已經成功獲得與該條件對象綁定的重入鎖,否則調用該方法時會拋出IllegalMonitorStateException?

//調用該方法后,結束等待的唯一方法是其它線程調用該條件對象的signal()signalALL()方法。等待過程中如果當前線程被中斷,該方法仍然會繼續等待,同時保留該線程的中斷狀態。

方法awaitUntil()的使用

long awaitNanos(longnanosTimeout) throws InterruptedException;

//調用該方法的前提是,當前線程已經成功獲得與該條件對象綁定的重入鎖,否則調用該方法時會拋出IllegalMonitorStateException

//nanosTimeout指定該方法等待信號的的最大時間(單位為納秒)。若指定時間內收到signal()signalALL()則返回nanosTimeout減去已經等待的時間;?

//若指定時間內有其它線程中斷該線程,則拋出InterruptedException并清除當前線程的打斷狀態;若指定時間內未收到通知,則返回0或負數。

boolean awaitUntil(Date deadline) throwsInterruptedException;

//適用條件與行為與awaitNanos(long nanosTimeout)完全一樣,唯一不同點在于它不是等待指定時間,而是等待由參數指定的某一時刻。

4.2 使用ReentrantReadWriteLock類

讀寫鎖表示有兩個鎖,一個是讀操作相關的鎖,也稱為共享鎖;另一個是寫操作相關的鎖,也叫排他鎖。也就是多個讀鎖之間不互斥,讀鎖與寫鎖互斥,寫鎖與寫鎖互斥。

(歡迎關注微信公眾號:深入Java底層)

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。