【问题标题】:Is there a way i can get the java.util.concurrent.locks.ReentrantReadWriteLock object from java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock有没有办法我可以从 java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock 获取 java.util.concurrent.locks.ReentrantReadWriteLock 对象
【发布时间】:2011-11-30 10:14:58
【问题描述】:

我使用

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

然后我传递给Lock接口的方法

method(Lock lock)

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

我无法再次将其转换为 ReentrantReadWriteLock 。我应该怎么办?我怎样才能得到这个计数?

【问题讨论】:

    标签: java multithreading locking


    【解决方案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(); }
    }
    

    【讨论】:

    • 不,我想检查当前线程获取了多少读锁。我该怎么做?
    • 你能描述我如何调用同步字段吗?我不明白。
    • 私人最终同步同步;是私人的所以我不能得到它
    • 这就是你必须使用 Reflections 库的原因。我用它来提取持有锁的线程。
    • 我自己的。您可以自己写出线程的名称和堆栈跟踪。 ;)
    【解决方案2】:

    使用 ReentrantLock,您可以使用以下方法了解有多少线程正在等待此锁:

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

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

    问候, 提比略

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2014-04-19
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多