java - 从引用中窃取位

标签 java c java.util.concurrent concurrent-programming compare-and-swap

如何从一个地址窃取 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
}
如果我只需要一个额外的标志,则可以使用

AtomicReferenceAtomicStampedReference 可以使用,但效率不高,因为它会创建一个包含时间戳和引用的额外框。

在 C 中讨论了一个类似的问题 stealing bits from a pointer

最佳答案

你或许可以使用 sun.misc.Unsafe 来实现它

除其他外,它有许多 compareAndSwap 方法,可以处理任何对象中的任意二进制数据。

话虽如此,如果您要实现二叉搜索树,我建议您查看不可变的 persistent data structures .这些的优点包括:

  • 由于不变性,它们根据定义是线程安全的
  • 他们不需要锁
  • 一旦你开始做更复杂的事情(例如子树的快照),进行结构共享的能力将是一个巨大的性能胜利 - 基本上你避免了采取防御性副本的需要。

关于java - 从引用中窃取位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20537011/

相关文章:

c - 将内存分配给 3 维字符数组会导致段错误

java - 如何为声明为 ThreadLocal 的变量的多个副本保持一致性?

java - 线程中的异常 "main"org.hibernate.HibernateException : Could not parse configuration: hibernate. cfg.xml

java - WildFly 无法 fork 新的连接进程

java - 字符串反向操作最佳时间复杂度: Is it O(n) or O(n/2)?

c - C 中的文件处理

java - 通过java代码导出oracle数据库数据

c - 从 C 套接字中提取 IP 地址

java - future 任务被 ThreadPoolExecutor 拒绝

java - 如何从监听器委托(delegate)可运行的代码?