如何从一个地址窃取 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
最佳答案
你或许可以使用 sun.misc.Unsafe 来实现它
除其他外,它有许多 compareAndSwap
方法,可以处理任何对象中的任意二进制数据。
话虽如此,如果您要实现二叉搜索树,我建议您查看不可变的 persistent data structures .这些的优点包括:
- 由于不变性,它们根据定义是线程安全的
- 他们不需要锁
- 一旦你开始做更复杂的事情(例如子树的快照),进行结构共享的能力将是一个巨大的性能胜利 - 基本上你避免了采取防御性副本的需要。
关于java - 从引用中窃取位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20537011/