2011-11-30 62 views
1

我創建了一個java.util.concurrent.locks.ReentrantReadWriteLock使用

new java.util.concurrent.locks.ReentrantReadWriteLock().readLock() 

,然後我傳給作爲Lock接口的方法

method(Lock lock) 

現在我想找到多少readlocks由當前線程擁有。我怎樣才能做到這一點?

我無法再將它轉換爲ReentrantReadWriteLock。我該怎麼辦?我怎麼能得到這個數字?

+1

是什麼「擁有」是什麼意思? – Jesper

回答

1

要獲取有關的ReentrantReadWriteLock讀鎖定計數,您需要調用lock.getReadHoldCount()

獨自從ReadLock得到這個,你需要得到「同步」字段,並呼籲「getReadHoldCount() 「通過反思。


使用反射訪問鎖的示例如下。

static void printOwner(ReentrantLock lock) { 
    try { 
     Field syncField = lock.getClass().getDeclaredField("sync"); 
     syncField.setAccessible(true); 
     Object sync = syncField.get(lock); 
     Field exclusiveOwnerThreadField = AbstractOwnableSynchronizer.class.getDeclaredField("exclusiveOwnerThread"); 
     exclusiveOwnerThreadField.setAccessible(true); 
     Thread t = (Thread) exclusiveOwnerThreadField.get(sync); 
     if (t == null) { 
      System.err.println("No waiter?"); 
     } else { 
      CharSequence sb = Threads.asString(t); 
      synchronized (System.out) { 
       System.out.println(sb); 
      } 
     } 
    } catch (NoSuchFieldException e) { 
     throw new AssertionError(e); 
    } catch (IllegalAccessException e) { 
     throw new AssertionError(e); 
    } 
} 

你可以做的是創建一個包裝。

class MyLock implements Lock { 
    private final ReentrantReadWriteLock underlying; // set in constructor 

    public ReentrantReadWriteLock underlying() { return underlying; } 
    public void lock() { underlying.readLock().lock(); } 
} 
+0

不,我想檢查當前線程獲得了多少讀鎖。我怎樣才能做到這一點? – user882196

+0

你能否描述我怎樣稱呼同步字段?我不明白。 – user882196

+0

私人最終同步同步;是私人所以我不能得到它 – user882196

0

隨着的ReentrantLock你能找出多少線程在等待這個鎖,通過使用:

ReentrantLock lock = new ReentrantLock(); 
lock.getQueueLength(); 
lock.getWaitQueueLength(condition); 

但要知道有多少讀鎖由當前線程舉行,讓我想知道爲什麼你需要這種東西? 它沒有太大的意義給你檢查你多少個鎖持有.. 一般來說,你應該被允許獲得幾個讀鎖,安全地使用他們..

問候, Tiberiu

相關問題