【发布时间】:2013-12-12 07:00:47
【问题描述】:
如何从一个地址中窃取 2 个 MSB 来执行原子操作?我正在尝试做一个单词的CAS
一个例子
public class Node
{
long key;
long value;
Node lchild; // format is flag1,flag2,address
Node rchild; // format is flag1,flag2,address
}
public void createNode()
{
Node n1 = new Node(); //this should create a node with format 0,0,address1
}
public void setFlag1(Node n1)
{
Now the new address should be in format 1,0,address1
}
public void setFlag2(Node n1)
{
Now the new address should be in format 0,1,address1
}
如果我只需要一个额外的标志,可以使用AtomicReference。
AtomicStampedReference 可以使用,但效率不高,因为它会创建一个包含时间戳和引用的额外框。
在 C 中讨论了一个类似的问题 stealing bits from a pointer
【问题讨论】:
-
如果指针是字对齐的,你想窃取两个 LSB 而不是两个 MSB。大多数指针都是字对齐的。不过,我不知道如何在 Java 中获得指针的位表示。
-
为什么
java.util.concurrent.AtomicReference不适合你? -
当我调用
Node n1 = new Node()时,操作系统是否总是会分配一个字对齐的空格?我试图窃取 MSB 以避免compareAndSwap可能发生的 ABA 问题。您能否解释一下为什么从 LSB 中窃取效率更高? -
@JimGarrison:我希望我可以使用 AtomicReference。但我需要偷两个位。我认为 AtomicReference 只使用了一个额外的位。如果我错了,请纠正我
-
除非您编写一些
native代码,否则无法访问引用的位。
标签: java c java.util.concurrent concurrent-programming compare-and-swap