首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将ReentrantReadWriteLock.readLock或ReentrantReadWriteLock.writeLock转换为我的类对象

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

Stack Overflow用户
提问于 2011-11-30 20:20:51
回答 1查看 333关注 0票数 1

我写了一个包装器,但是我的问题是ReadLock()方法返回的是ReentrantReadWriteLock.WriteLock,所以我没有多余的getThreadReadLockCount afterwards.What我想要的是readLock()方法返回我,这样我就可以有多余的东西给count方法。有什么想法吗?

代码语言:javascript
复制
   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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-30 20:54:48

你的代码只计算线程请求读锁的次数,如果它在锁和释放之间被缓存,这将给出不同的结果:

代码语言:javascript
复制
Lock rl = var.readLock();
rl.lock();
try{
    //...
}finally{
    rl.unlock();
}

vs

代码语言:javascript
复制
var.readLock().lock();
try{
    //...
}finally{
    var.readLock().unlock();
}

将产生不同的结果

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

代码语言:javascript
复制
@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();
        }

     }
} 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8325864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档