今天偶然看到了ConcurrentLinkedQueue的内部类。节点,发现它的两个成员变量item,next被volatile修改了,赋值是由sun的misc包下的UNSAFE类做的。 我很好奇,为什么会有这样的操作?(个人预计是性能考虑)。这里有一个测试。 UNSAFE类的含义:sun.misc.Unsafe是JDK内部使用的工具类。 它将Java的少量“不安全”功能暴露给Java层代码,使JDK可以更多地使用Java代码来实现少量原本与平台相关、只能使用原生语言(如C或C++)才能实现的功能。 这个类不应该在JDK核心类库之外使用。 JVM的实现可以自由选择如何实现Java对象的“布局”,即Java对象的所有部分都放在内存的什么地方,包括对象的实例字段和少量元数据。 sun.misc.Unsafe中访问对象字段的方法给出了对象布局的大致轮廓。它提供了objectFieldOffset()方法来获取一个字段相对于Java对象“起始地址”的偏移量,还提供了getInt、getLong、getObject等方法,可以通过使用前面获取的偏移量来访问Java对象的一个字段。 Oracle/Sun HotSpot VM使用的不安全对象可以参考本博客:http://mishadoff . com/blog/Java-magic-part-4-Sun-dot-misc-dot-Unsafe/experiment:1。unsafe.putObject(this,ItemOffset,item)直接在对象的itemOffset位置设置item的引用(超过访问权限)2。unsafe.putorderobject (this,next offset,val)将item的引用设置在对象的item偏移量位置,但是,该方法的可见性比直接使用putObject方法稍低,其他线程需要一段时间才能看到putOrderedObject使用了store-store barrier。而且putObject也会用到存储加载屏障(如果你不了解Java中的指令屏障,可以直接参考Java并发编程的艺术)。我参考了ConcurrentLinkedQueue类的内部类写了一个类似的类,如下:class unsafe node 我愉快地运行了测试用例,结果立即报告了一个错误...have_no_choice.png //不安全赋值性能测试simple date format SDF = new simple date format(" yyyy-mm-DD HH:mm:ss ");system . out . println(SDF . format(new Date()));for(int I = 0;我& lt整数。MAX _ VALUEi++){ UnsafeNode & lt;整数& gtnode = new UnsafeNode & lt& gt㈠;} system . out . println(SDF . format(new Date()));Unsafe_Fail.png嗯,觉得我不安全.....正如Unsafe类的注释中所写的:尽管该类和所有方法都是公共的,但该类的使用是有限的,因为只有受信任的代码才能获得它的实例。我只能通过反射做到:field the unsafe instance = unsafe . class . getdeclaredfield(" the unsafe ");theunsafeinstance . set accessible(true);sun . misc . UNSAFE UNSAFE =(UNSAFE)theunsafeinstance . get(UNSAFE . class);测试节点,非节点代码更改如下:类不安全节点 Unsafe_Success.png我会用普通的赋值方法来完成volatile变量的赋值。新的数据结构节点类如下:ClassNormalNode 下次,我会告诉你魔法发生的来源。 Sun.misc.Unsafe类,做不安全文章详解。