BlockingQueue为什么读写都加互斥锁,而没有用读写锁分离

面试题分类: JavaBlockingQueue为什么读写都加互斥锁,而没有用读写锁分离
匿名用户 asked 1年 ago

linkedBlockQueue 如队列源码:
public
boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException {
        if (e == null) throw new NullPointerException();
        long nanos = unit.toNanos(timeout);
        int c = -1;
        final ReentrantLock putLock = this.putLock;
        final AtomicInteger count = this.count;
        putLock.lockInterruptibly();
        try {
            while (count.get() == capacity) {
                if (nanos <= 0)
                    return false;
                nanos = notFull.awaitNanos(nanos);
            }
            enqueue(new Node<E>(e));
            c = count.getAndIncrement();
            if (c + 1 < capacity)
                notFull.signal();
        } finally {
            putLock.unlock();
        }
        if (c == 0)
            signalNotEmpty();
        return true;
    }
 
出队列代码:
public E poll(long timeout, TimeUnit unit) throws InterruptedException {
        E x = null;
        int c = -1;
        long nanos = unit.toNanos(timeout);
        final AtomicInteger count = this.count;
        final ReentrantLock takeLock = this.takeLock;
        takeLock.lockInterruptibly();
        try {
            while (count.get() == 0) {
                if (nanos <= 0)
                    return null;
                nanos = notEmpty.awaitNanos(nanos);
            }
            x = dequeue();
            c = count.getAndDecrement();
            if (c > 1)
                notEmpty.signal();
        } finally {
            takeLock.unlock();
        }
        if (c == capacity)
            signalNotFull();
        return x;
    }
 
这里为什么不用读写所分离呢,ReentrantReadWriteLock呢,


FavoriteLoading添加本文到我的收藏
1 Answers
ashitaka 管理员 answered 1年 ago

新手答一下,BlockingQueue 这两段代码好像不是“读写”吧。
我们说的“读”要保证不对所读的对象的内容有任何的更改,比如读一个文件,linux上读文件只会改变这个文件的accessTime,其他的都不变,而写文件则可能改变很多东西:内容、atime、权限等。
BlockingQueue 的入队和出队都会改变队列里的内容,所有这两个步骤都是:写


FavoriteLoading添加本文到我的收藏

return top