AtomicInteger源码

一、概念

AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。

AtomicInteger的关键域只有一下3个:

 1     // setup to use Unsafe.compareAndSwapInt for updates
 2     private static final Unsafe unsafe = Unsafe.getUnsafe();
 3     private static final long valueOffset;
 4 
 5     static {
 6         try {
 7             valueOffset = unsafe.objectFieldOffset
 8                 (AtomicInteger.class.getDeclaredField("value"));
 9         } catch (Exception ex) { throw new Error(ex); }
10     }
11 
12     private volatile int value;

这里Unsafe是底层操作,valueOffset,value是volatile,

关于Unsafe和CAS可参考该博文:http://www.cnblogs.com/xrq730/p/4976007.html

二、属性

核心方法 compareAndSet (int expect, int update) ,调用了Unsafe的compareAndSwapInt,其实就是CAS。而java.util.concurrent包就是建立在CAS上。

 1     /**
 2      * Atomically sets the value to the given updated value
 3      * if the current value {@code ==} the expected value.
 4      *
 5      * @param expect the expected value
 6      * @param update the new value
 7      * @return {@code true} if successful. False return indicates that
 8      * the actual value was not equal to the expected value.
 9      */
10     public final boolean compareAndSet(int expect, int update) {
11         return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
12     }

AtomicInteger类下所有的方法都与之有关,比如 getAndIncrement()

1     /**
2      * Atomically increments by one the current value.
3      *
4      * @return the previous value
5      */
6     public final int getAndIncrement() {
7         return unsafe.getAndAddInt(this, valueOffset, 1);
8     }

点进去发现其实也是调用的 compareAndSwapInt 方法

1     public final int getAndAddInt(Object var1, long var2, int var4) {
2         int var5;
3         do {
4             var5 = this.getIntVolatile(var1, var2);
5         } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
6 
7         return var5;
8     }

 

---------------------------------------------------多做多解决多总结------------------------------------------------

posted @ 2019-03-08 17:22  java白丁  阅读(202)  评论(0编辑  收藏  举报