在new ConcurrentLinkedQueue时
head = tail = new Node(null);
然后第一次调用offer方法时:
不知道大家用intellij idea 做debug ConcurrentLinkedQueue的offer方法时,在p.casNext(null, newNode)后是不是得到的信息是:
1、tail.next 指向了tail本身
2、head 指向了newNode
3、p.next 也指向了tail本身
但实际上却是:
1、tail.next指向的是newNode
2、head还是指向tail的
3、p.next 指向的也是newNode, 本来p就是等于tail的。
那么怎么做验证呢?
我们可以把ConcurrentLinkedQueue的代码copy一份到我们自己的包中
然后把原来源码中的
UNSAFE = sun.misc.Unsafe.getUnsafe();
改成
UNSAFE = getUnsafe();
并添加
public static Unsafe getUnsafe() {
try {
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
return (Unsafe)f.get(null);
} catch (Exception e) {
return null;
}
}
这样就可以做测试了,大家可以先debug这个类,看看是不是发现与java.util.concurrent.ConcurrentLinkedQueue中的时候一样是得到的错误的情况呢?
然后大家使用run跑代码,并在offer方法中加入输出日志,就会发现两者的结果不一样,是不是很坑爹...
在看这个类的时候,真的在这个地方纠结了很久。
我怀疑是idea在debug模式时在原来的class中加入了一些自己的代码,导致unsafe在获取内存地址的时候发生了偏差。
如果有大神知道具体原因望告知。