其实,Atomic用起来十分简单,先来看两个例子
class Counter{
private int count = 0 ;
pulbic synchronized void increment(){
count ++ ;
}
pulbic synchronized int getCount(){
return count ;
}
}
与
class Counter{
private AtomicInteger count = new AtomticInteger() ;
pulbic void increment(){
count.incrementAndGet() ;
}
pulbic synchronized int getCount(){
return count.get() ;
}
}
这两个类的效果是一样的,只是性能上Atomic更好些,Atomic是基于CPU的CompareAndSwap(CAS)指令。其实,AtomicInteger就是线程安全的Integer。
再来看一段源码:
/**
* Atomically sets to the given value and returns the old value.
*
* @param newValue the new value
* @return the previous value
*/
public final int getAndSet(int newValue) {
for (;;) {
int current = get();
if (compareAndSet(current, newValue))
return current;
}
}
/**
* Atomically sets the value to the given updated value
* if the current value {@code ==} the expected value.
*
* @param expect the expected value
* @param update the new value
* @return true if successful. False return indicates that
* the actual value was not equal to the expected value.
*/
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
这里的方法的命令挺有意思的:看其方法名就能知道其方法实现的功能。getAndSet() 先get再set,有点类似i++,先取到i再i加1。源码还是比较清晰的。主要来看compareAndSet(int expect ,int update)这个方法,这个方法是说如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。如果成功就返回true,否则返回false,并且不修改当前值。 这其实也就是CAS的原理。