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