gpt4 book ai didi

java - 队列的同步

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:31:23 26 4
gpt4 key购买 nike

我一直在阅读 Doug Lea 的“Java 并发编程”一书。您可能知道,Doug 最初编写了 Java 并发 API。但是,有些事情让我有些困惑,我希望就这个小难题获得一些意见!

从 Doug Lea 的排队示例中获取以下代码...

class LinkedQueue {
protected Node head = new Node(null);
protected Node last = head;

protected final Object pollLock = new Object();
protected final Object putLock = new Object();

public void put(Object x) {
Node node = new Node(x);
synchronized (putLock) { // insert at end of list
synchronized (last) {
last.next = node; // extend list
last = node;
}
}
}

public Object poll() { // returns null if empty
synchronized (pollLock) {
synchronized (head) {
Object x = null;
Node first = head.next; // get to first real node
if (first != null) {
x = first.object;
first.object = null; // forget old object
head = first; // first becomes new head
}
return x;
}
}
}

static class Node { // local node class for queue
Object object;
Node next = null;

Node(Object x) { object = x; }
}
}

这是一个非常好的队列。它使用两个监视器,因此生产者和消费者可以同时访问队列。好的!但是,“last”和“head”的同步在这里让我感到困惑。该书指出,对于 Queue 当前或即将具有 0 个条目的情况,这是必需的。好的,很公平,这是有道理的。

不过,后来我看了一下Java Concurrency LinkedBlockingQueue。 original Queue 的版本不在头部或尾部同步(我还想发布另一个链接到现代版本,它也遇到同样的问题,但我不能这样做,因为我是新手)。我想知道为什么不呢?我在这里错过了什么吗?我是否遗漏了 Java 内存模型的某些特殊性质?出于可见性目的,我会想到需要这种同步吗?我会很感激一些专家的意见!

最佳答案

在您提供链接的版本以及最新 JRE 中的版本中,Node 类中的项目是易变的,它强制读取和写入对所有其他线程可见,这里有更深入的解释 http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile

关于java - 队列的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2347231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com