Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将ReentrantReadWriteLock.readLock或ReentrantReadWriteLock.writeLock转换为类对象_Java_Multithreading_Locking_Reentrantreadwritelock - Fatal编程技术网

Java 如何将ReentrantReadWriteLock.readLock或ReentrantReadWriteLock.writeLock转换为类对象

Java 如何将ReentrantReadWriteLock.readLock或ReentrantReadWriteLock.writeLock转换为类对象,java,multithreading,locking,reentrantreadwritelock,Java,Multithreading,Locking,Reentrantreadwritelock,我试图做的是获取当前线程在同一时间所持有的readcount数。我为此编写了一个包装器,但我的问题是ReadLock()方法返回ReentrantReadWriteLock.WriteLock,因此我没有多余的getThreadReadLockCount。我想要的是ReadLock()方法应该返回我,这样我就可以拥有count方法的多余部分。有什么想法吗 private final ThreadLocal readLocksHeldByThread; private static

我试图做的是获取当前线程在同一时间所持有的readcount数。我为此编写了一个包装器,但我的问题是ReadLock()方法返回ReentrantReadWriteLock.WriteLock,因此我没有多余的getThreadReadLockCount。我想要的是ReadLock()方法应该返回我,这样我就可以拥有count方法的多余部分。有什么想法吗

   private final ThreadLocal    readLocksHeldByThread;

private static class ReadCounts {
    public int  value   = 0;
}

public CustomReentrantReadWriteLock() {
    super(true);
    readLocksHeldByThread = new ThreadLocal() {
        @Override
        public Object initialValue() {
            return new ReadCounts();
        }
    };
}

@Override
public synchronized ReadLock readLock() {
    final ReadCounts myReadLocks = (ReadCounts) readLocksHeldByThread.get();
    ++myReadLocks.value;
    return super.readLock();
}

    public synchronized int getThreadReadLockCount() {
    final ReadCounts currentReadLocks = (ReadCounts) readLocksHeldByThread.get();
    return currentReadLocks.value;
}

您的代码只计算线程请求readlock的次数,如果它在lock和release之间缓存,则会得到不同的结果:

Lock rl = var.readLock();
rl.lock();
try{
    //...
}finally{
    rl.unlock();
}
vs

将产生不同的结果

您可以这样包装返回的锁

@Override public Lock readLock() {
     final ReadCounts myReadLocks = (ReadCounts) readLocksHeldByThread.get();
     return new Lock(){
        Lock l = super.readLock(); 
        public void lock(){
            l.lock();
            ++myReadLocks.value;
        }

        public void lockInterruptibly() throws InterruptedException{
            l.lockInterruptibly();
            ++myReadLocks.value;
        }

        public boolean tryLock(){
            if(l.tryLock()){
                ++myReadLocks.value;
                return true;
            }else return false;
        }

        public boolean tryLock(long time, TimeUnit unit) throws InterruptedException{
            if(l.tryLock(time,unit)){
                ++myReadLocks.value;
                return true;
            }else return false;
        }

        public void unlock(){
            --myReadLocks.value;
            l.unlock();
        }

        public Condition newCondition(){
            return l.newCondition();
        }

     }
} 

您的代码只计算线程请求readlock的次数,如果它在lock和release之间缓存,则会得到不同的结果:

Lock rl = var.readLock();
rl.lock();
try{
    //...
}finally{
    rl.unlock();
}
vs

将产生不同的结果

您可以这样包装返回的锁

@Override public Lock readLock() {
     final ReadCounts myReadLocks = (ReadCounts) readLocksHeldByThread.get();
     return new Lock(){
        Lock l = super.readLock(); 
        public void lock(){
            l.lock();
            ++myReadLocks.value;
        }

        public void lockInterruptibly() throws InterruptedException{
            l.lockInterruptibly();
            ++myReadLocks.value;
        }

        public boolean tryLock(){
            if(l.tryLock()){
                ++myReadLocks.value;
                return true;
            }else return false;
        }

        public boolean tryLock(long time, TimeUnit unit) throws InterruptedException{
            if(l.tryLock(time,unit)){
                ++myReadLocks.value;
                return true;
            }else return false;
        }

        public void unlock(){
            --myReadLocks.value;
            l.unlock();
        }

        public Condition newCondition(){
            return l.newCondition();
        }

     }
} 

我将使用我对上一个问题建议的方法我将使用我对上一个问题建议的方法我得到的Eclipse错误无法从新锁转换为ReentrantReadWriteLock.ReadLock我得到的Eclipse错误无法从新锁转换为ReentrantReadWriteLock.ReadLock