b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

链表 结构 解读 Java 并发队列 BlockingQueue(4)

电脑杂谈  发布时间:2018-02-21 23:42:01  来源:网络整理

if (e == null) throw new NullPointerException();

// 如果你纠结这里为什么是 -1,可以看看 offer 方法。这就是个标识成功、失败的标志而已。

int c = -1;

Node<E> node = new Node(e);

final ReentrantLock putLock = this.putLock;

final AtomicInteger count = this.count;

// 必须要获取到 putLock 才可以进行插入操作

putLock.lockInterruptibly();

try {

// 如果队列满,等待 notFull 的条件满足。

while (count.get() == capacity) {

notFull.await();

}

// 入队

enqueue(node);

// count 原子加 1,c 还是加 1 前的值

c = count.getAndIncrement();

// 如果这个元素入队后,还有至少一个槽可以使用,调用 notFull.signal() 唤醒等待线程。

// 哪些线程会等待在 notFull 这个 Condition 上呢?

if (c + 1 < capacity)

notFull.signal();

} finally {

// 入队后,释放掉 putLock

putLock.unlock();

}

// 如果 c == 0,那么代表队列在这个元素入队前是空的(不包括head空节点),

// 那么所有的读线程都在等待 notEmpty 这个条件,等待唤醒,这里做一次唤醒操作

if (c == 0)

signalNotEmpty();

}

// 入队的代码非常简单,就是将 last 属性指向这个新元素,并且让原队尾的 next 指向这个元素

// 这里入队没有并发问题,因为只有获取到 putLock 独占锁以后,才可以进行此操作

private void enqueue(Node<E> node) {

// assert putLock.isHeldByCurrentThread();

// assert last.next == null;

last = last.next = node;

}

// 元素入队后,如果需要,调用这个方法唤醒读线程来读

private void signalNotEmpty() {

final ReentrantLock takeLock = this.takeLock;

takeLock.lock();

try {

notEmpty.signal();

} finally {

takeLock.unlock();

}

}

我们再看看 take 方法:

public E take() throws InterruptedException {

E x;

int c = -1;

final AtomicInteger count = this.count;

final ReentrantLock takeLock = this.takeLock;

// 首先,需要获取到 takeLock 才能进行出队操作

takeLock.lockInterruptibly();

try {

// 如果队列为空,等待 notEmpty 这个条件满足再继续执行

while (count.get() == 0) {

notEmpty.await();

}

// 出队


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-87792-4.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 南斗星
      南斗星

      去年买盒感康13今年18

    • 符卫红
      符卫红

      一定能达到德艺双馨的境界

    热点图片
    拼命载入中...