是《实战Java高并发程序设计》第4章的几点。html
若是你对技术有着不折不挠的追求,应该还会特别在乎incrementAndGet() 方法中compareAndSet()的实现。如今,就让咱们更进一步看一下它把!java
public final boolean compareAndSet(int expect, int update){ returnunsafe.compareAndSwapInt(this, valueOffset, expect, update); }
在这里,咱们看到一个特殊的变量unsafe。它是sun.misc.Unsafe类型。从名字看,这个类应该是封装了一些不安全的操做。那什么操做是不安全的呢?学习过C或者C++的话,你们应该知道,指针是不安全的。这也是在Java中把指针去除的重要缘由。若是指针指错了位置,或者计算指针偏移量时出错,结果多是灾难性的,你颇有可能会覆盖别人的内存,致使系统奔溃。安全
而这里的Unsafe就是封装了一些相似指针的操做。compareAndSwapInt()方法是一个navtive方法。它的几个参数含义以下:并发
public final native boolean compareAndSwapInt(Object o,long offset,int expected,int x);
第一个参数o为给定的对象,offset为对象内的偏移量(其实就是一个字段到对象头部的偏移量,经过这个偏移量能够快速定位字段),expected表示指望值,x表示要设置的值。若是指定的字段的值等于expected,那么就会把它设置为x。函数
不难看出,compareAndSwapInt()方法的内部,必然是使用CAS原子指令来完成的。此外,Unsafe类还提供了一些方法,主要有如下几个(以Int操做为例,其余数据类型是相似的):高并发
//得到给定对象偏移量上的int值 public native int getInt(Object o, long offset); //设置给定对象偏移量上的int值 public native void putInt(Object o, long offset, int x); //得到字段在对象中的偏移量 public native long objectFieldOffset(Field f); //设置给定对象的int值,使用volatile语义 public native void putIntVolatile(Object o, long offset,int x); //得到给定对象对象的int值,使用volatile语义 public native int getIntVolatile(Object o, long offset); //和putIntVolatile()同样,可是它要求被操做字段就是volatile类型的 public native void putOrderedInt(Object o, long offset, intx);
若是你们还记得“3.3.4 深度剖析ConcurrentLinkedQueue”一节中的描述的ConcurrentLinkedQueue实现,应该对ConcurrentLinkedQueue中的Node还有些印象。Node一些CAS操做也都是使用Unsafe类来实现的。你们能够回顾一下,以加深对Unsafe类的印象。学习
这里就能够看到,虽然Java抛弃了指针。可是在关键时刻,相似指针的技术仍是必不可少的。这里底层的Unsafe实现就是最好的例子。可是很不幸,JDK的开发人员并不但愿你们使用这个类。得到Unsafe实例的方法是调动其工厂方法getUnsafe()。可是,它的实现倒是这样:this
public static Unsafe getUnsafe() { Class cc =Reflection.getCallerClass(); if(cc.getClassLoader() != null) throw newSecurityException("Unsafe"); return theUnsafe; }
注意加粗部分的代码,它会检查调用getUnsafe()函数的类,若是这个类的ClassLoader不为null,就直接抛出异常,拒绝工做。所以,这也使得咱们本身的应用程序没法直接使用Unsafe类。它是一个JDK内部使用的专属类。spa
注意:根据Java 类加载器的工做原理,应用程序的类由AppLoader加载。而系统核心类,如rt.jar中的类由Bootstrap类加载器加载。Bootstrap加载器没有Java对象的对象,所以试图得到这个类加载器会返回null。因此,当一个类的类加载器为null时,说明它是由Bootstrap加载的,而这个类也极有多是rt.jar中的类。设计
这本书: