java - 我如何将 ReentrantReadWriteLock.readLock 或 ReentrantReadWriteLock.writeLock 转换为我的类对象

标签 java multithreading locking reentrantreadwritelock

我想做的是获取当前线程一次保存的readcounts数量。我为此编写了一个包装器,但我的问题是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;
}

最佳答案

您的代码仅计算线程请求读锁的次数,如果在锁定和释放之间缓存它,则会给出不同的结果:

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

对比

var.readLock().lock();
try{
    //...
}finally{
    var.readLock().unlock();
}

会给出不同的结果

你可以像这样包装返回的锁

@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();
        }

     }
} 

关于java - 我如何将 ReentrantReadWriteLock.readLock 或 ReentrantReadWriteLock.writeLock 转换为我的类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8325864/

相关文章:

java - Android JSON 解析(Jackson)

java - 如何在MapReduce中比较不同文件的信息?

android - Cordova 插件阻塞线程

multithreading - 在 QThread 中的 run() 方法内部声明与在 QThread 中声明为局部变量

android - 如何锁定对象/成为监视器的所有者 (Android)

SQL 原子增量和锁定策略 - 这安全吗?

java - 正确设计 Java 类

java - 如何从java保存到Cassandra?

c - x 向服务器发送数据以在 GUI 上显示输出的线程数

java - 简单的基于 Java 名称的锁?