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的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: win10打不开磁盘提示本次操作由于这台
 - 下一篇: 电信和互联网用户个人信息保护规定_你的孩