有没有办法从java.util.concurrent.locks.ReentrantReadWriteLock $ ReadLock获取java.util.concurrent.locks.ReentrantReadWriteLock对象

时间:2011-11-30 10:14:58

标签: java multithreading locking

我使用

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

然后我传递给Lock接口

的方法
method(Lock lock)

现在我想找到当前线程拥有多少个读锁定。我怎样才能做到这一点?

我无法将其再次投射到ReentrantReadWriteLock中。我该怎么办?我怎么能得到这个数字?

2 个答案:

答案 0 :(得分:1)

要在ReentrantReadWriteLock上获取读锁定计数,您需要调用lock.getReadHoldCount()

要单独从ReadLock获取此信息,您需要获取“sync”字段并通过反射调用“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(); }
}

答案 1 :(得分:0)

使用 ReentrantLock ,您可以使用以下命令查看等待此锁定的线程数:

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

但要知道当前线程持有多少个读锁,让我想知道你为什么需要这样的东西? 检查你持有多少锁是没有多大意义的。 通常,您应该被允许获取几个读锁并安全地使用它们。

此致 Tiberiu