gpt4 book ai didi

JavacompareAndSet 以原子方式更新 BST 中的引用

转载 作者:行者123 更新时间:2023-11-30 15:43:58 25 4
gpt4 key购买 nike

在二叉树中,我试图以原子方式将父节点的左子节点替换为新节点。在下面的方法中,pnode.left指向node,我正在尝试更改它到replaceNode

在第 1 行中,childPtr 指向 pnode.left
在第2行中,oldChildPtr指向pnode.left
在第 3 行中,childPtr 从指向 pnode.left 原子更改为 replaceNode

但是pnode.left没有改变。我知道这就是java中的工作原理。但如何修改此代码,以便将 pnode.left 自动替换为 replaceNode

atomicReplaceLeftChild(node,pnode,replaceNode)
{
AtomicReference<Node> childPtr = new AtomicReference<Node>(pnode.left);
Node oldChildPtr = childPtr.get();
childPtr.compareAndSet(oldChildPtr, replaceNode);
}

最佳答案

您的问题(以及它同时带有 javac 标记的事实)表明您有 C 背景。这没有什么问题,但我相信你在 Java 意义上的“原子”概念并不是你想象的那样。 java.util.concurrent 包中的 Atomic* 类使用内部锁定机制来确保其中的值在另一个线程访问它们之前不能部分完成。仅仅因为您在代码中使用 Atomic* 类并不意味着您的代码执行原子操作。

您的三行代码很“奇怪”,并且似乎并不代表真实的用例。我这样说是因为代码没有任何事情。它创建一个 AtomicReference 实例,并与引用的值混淆,但它不会改变 pnode 上的任何内容,这正是我认为您想要做的......

因此,在某些时候您需要 pnode.left = ReplaceNode。您可能希望 pnode.left 实际上是一个 AtomicReference 本身,在这种情况下它将是: pnode.left.compareAndSet(oldChildPtr, ReplaceNode)

在当前状态下,您的代码没有做任何重要的事情,并且肯定不会做您所描述的应该做的事情。

希望这不会让您灰心......假设您是 Java 新手,我并不羡慕您必须从原子和并发开始......还有更容易开始的地方。

关于JavacompareAndSet 以原子方式更新 BST 中的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19673156/

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