天天看點

測試并發應用 (一)監控Lock接口

校對:方騰飛

lock 接口是java 并發 api提供的最基本的機制來同步代碼塊。它允許定義臨界區。臨界區是代碼塊可以共享資源,但是不能被多個線程同時執行。此機制是通過lock 接口和 reentrantlock 類實作的。

在這個指南,你将學習從lock對象可以擷取的資訊和如何擷取這些資訊。

準備

指南中的例子是使用eclipse ide 來實作的。如果你使用eclipse 或者其他的ide,例如netbeans, 打開并建立一個新的java項目。

怎麼做呢…

按照這些步驟來實作下面的例子:

它是如何工作的…

在這個指南裡,你實作的mylock類擴充了reentrantlock類來傳回資訊,除此之外獲得不到這些資訊 ,因為reentrantlock 類裡的資料都是保護類型的。 通過mylock類實作的方法:

getownername():隻有唯一一個線程可以執行被lock對象保護的臨界區。鎖存儲了正在執行臨界區的線程。此線程會被reentrantlock類的保護方法 getowner()傳回。 此方法使用 getowner() 方法來傳回線程的名字。

getthreads():當線程正在執行臨界區時,其他線程嘗試進入臨界區就會被放到休眠狀态一直到他們可以繼續執行為止。reentrantlock類保護方法getqueuedthreads() 傳回 正在等待執行臨界區的線程list。此方法傳回 getqueuedthreads() 方法傳回的結果。

我們還使用了 reentrantlock 類裡實作的其他方法:

hasqueuedthreads():此方法傳回 boolean 值表明是否有線程在等待擷取此鎖

getqueuelength(): 此方法傳回等待擷取此鎖的線程數量

islocked(): 此方法傳回 boolean 值表明此鎖是否為某個線程所擁有

isfair(): 此方法傳回 boolean 值表明鎖的 fair 模式是否被激活

更多…

reentrantlock 類還有其他方法也是用來擷取lock對象的資訊的:

getholdcount(): 傳回目前線程擷取鎖的次數

isheldbycurrentthread(): 傳回 boolean 值,表明鎖是否為目前線程所擁有

參見

<a href="http://ifeve.com/basic-thread-synchronization-5/" target="_blank">第二章,基本線程同步: 使用lock同步代碼塊</a>

<a href="http://ifeve.com/customizing-concurrency-classes-9/" target="_blank">第七章,自定義同步類: 實作自定義鎖</a>

繼續閱讀