2011-11-30 26 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

相关问题