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有一个内存地址发生了变化,所以这里是谁发生了变化?怎么变化的?