//源码 //Atomically increments by one the current value. 将当前值原子地加1。 //Returns:the updated value 返回:更新后的值 publicfinalintincrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, 1) + 1; }
//Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力。 //Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。 //Unsafe类是"final"的,不允许继承。且构造函数是private的: //Unsafe无法实例化,那么怎么获取Unsafe呢?答案就是通过反射来获取Unsafe public Unsafe getUnsafe()throws IllegalAccessException { FieldunsafeField= Unsafe.class.getDeclaredFields()[0]; unsafeField.setAccessible(true); Unsafeunsafe= (Unsafe) unsafeField.get(null); return unsafe; } //Java中的Unsafe类 publicfinalintgetAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5; } //native C++方法 publicfinalnativebooleancompareAndSwapInt(Object var1, long var2, int var4, int var5); //汇编指令,硬件直接支持 lock cmpxchg