风中残墨. 2022-11-23 21:44
浏览 1
已结题

CAS操作内存地址问题

public class NodeTest {
static Unsafe unsafe = UnsafeFactory.getUnsafe();
volatile Node tail = new Node();
static long tailOffset;

static {
    try {
        tailOffset = unsafe.objectFieldOffset(NodeTest.class.getDeclaredField("tail"));
    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    }
}

@Test
public void testNode() {
    Node t = tail;
    System.out.println("t = " + t);
    System.out.println("tail = " + tail);

    Node node1 = new Node();
    boolean b1 = unsafe.compareAndSwapObject(this, tailOffset, t, node1);
    System.out.println("b1 = " + b1);


    Node node2 = new Node();
    boolean b2 = unsafe.compareAndSwapObject(this, tailOffset, node1, node2);
    System.out.println("b2 = " + b2);

    boolean b3 = unsafe.compareAndSwapObject(this, tailOffset, t, node2);
    System.out.println("b3 = " + b3);

    System.out.println("tail = " + tail);
    System.out.println(t == tail);
}

static class Node {
}

}

原子操作是把内存地址上的值做了修改,那原来的值是否丢了?
如果丢了的话,那么 t 和 tail 是永远相等的?可打印 t 是不等于 tail的
说明 t和tail有一个内存地址发生了变化,所以这里是谁发生了变化?怎么变化的?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 12月1日
    • 创建了问题 11月23日

    悬赏问题

    • ¥15 关于#c语言#的问题,请各位专家解答!
    • ¥15 这个如何解决详细步骤
    • ¥15 在微信h5支付申请中,别人给钱就能用我的软件,这个的所属行业是啥?
    • ¥30 靶向捕获探针设计软件包
    • ¥15 别人给钱就能用我的软件,这个的经营场景是啥?
    • ¥15 react-diff-viewer组件,如何解决数据量过大卡顿问题
    • ¥20 遥感植被物候指数空间分布图制作
    • ¥15 安装了xlrd库但是import不了…
    • ¥20 Github上传代码没有contribution和activity记录
    • ¥20 SNETCracker