AtomicInteger 类提供了int类型的变量,变量可以原子写和读,同时还包括先进的原子操作例如 compareAndSet()。 AtomicInteger 类位于JAVA.util.concurrent.atomic 包中,全名java.util.concurrent.atomic. AtomicInteger 。本文讲述JAVA8中的AtomicBoolean ,但是第一个版本是在Java 5中。
关于AtomicInteger 设计原理可以参考 Compare and Swap。
如下代码创建AtomicInteger:
AtomicInteger atomicInteger = new AtomicInteger();
上述例子创建了初始值为0的AtomicInteger ,如果需要创建指定值的AtomicInteger ,则代码如下:
AtomicInteger atomicInteger = new AtomicInteger(123);
例子中用123作为AtomicInteger 构造函数的参数,意思就是AtomicInteger 实例的初始值为123。
可以通过 AtomicInteger的 get() 方法获取值,下面是代码 AtomicInteger.get():
AtomicInteger atomicInteger = new AtomicInteger(123);
int theValue = atomicInteger.get();
可以通过 AtomicInteger 的set()方法设置值,下面是 AtomicInteger.set()的例子
AtomicInteger atomicInteger = new AtomicInteger(123);
atomicInteger.set(234);
例子中创建了一个初始值为123的 AtomicInteger,然后设置为234.
AtomicInteger类同样有原子的compareAndSet()方法,首先与AtomicInteger 实例值得当前比较,如果相对这设置AtomicInteger 的新值,下面AtomicInteger.compareAndSet()代码:
AtomicInteger atomicInteger = new AtomicInteger(123);
int expectedValue = 123;
int newValue = 234;
atomicInteger.compareAndSet(expectedValue, newValue);
首先创建初始值为123的 AtomicInteger实例,然后当前值与期望值123比较,如果相对则设置值为234.
AtomicInteger类包含了一些增加和获取返回值的方法:
第一个方法 addAndGet() ,增加AtomicInteger 的值同时返回增加后的值,第二个方法 getAndAdd()增加值,但是返回增加之前的值,两个方法的差别看下面代码:
AtomicInteger atomicInteger = new AtomicInteger();
System.out.println(atomicInteger.getAndAdd(10));
System.out.println(atomicInteger.addAndGet(10));
代码例子将大于0和20,首先获取AtomicInteger 增加10之前的值是0,然后再增加值并获取当前值是 20.同样可以通过两个方法增加负值,相当于做减法,getAndIncrement()和 incrementAndGet() 与 getAndAdd()和 addAndGet()的工作原理相似,只不是加1.
AtomicInteger类同样可以原子性的做减法,面是方法:
decrementAndGet()方法减1并返回减后的值,getAndDecrement()同样减1并返回减之前的值 。
参考:http://tutorials.jenkov.com/java-util-concurrent/atomicinteger.html
http://tutorials.jenkov.com/java-concurrency/compare-and-swap.html