我使用
创建java.util.concurrent.locks.ReentrantReadWriteLock
new java.util.concurrent.locks.ReentrantReadWriteLock().readLock()
然后我传递给Lock
接口
method(Lock lock)
现在我想找到当前线程拥有多少个读锁定。我怎样才能做到这一点?
我无法将其再次投射到ReentrantReadWriteLock中。我该怎么办?我怎么能得到这个数字?
答案 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