AtomicInteger
AtomicInteger(AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference(引用对像))系列使用synchronized结合volatile,和CAS算法实现了标记变量在多线程中的安全。
CAS(compare-and-swap)算法 保证了原子性。
其中CAS算法的原理就是里面包含三个值:内存值A 预估值V 更新值 B 当且仅当 V == A 时,V = B; 否则,不会执行任何操作。
1,代码块的线程安全(synchronized,lock)
2,变量的线程安全:普通值的线程安全(volatile,atomic*),数据结构的线程安全(concurrenthashmap,threadlocal,copyonwriterarraylist,blockingqueue)
AtomicInteger类保证线程安全的用法
J2SE 5.0提供了一组atomic class来帮助我们简化同步处理。基本工作原理是使用了同步synchronized的方法实现了对一个long, integer, 对象的增、减、赋值(更新)操作. 比如对于++运算符AtomicInteger可以将它持有的integer 能够atomic 地递增。在需要访问两个或两个以上 atomic变量的程序代码(或者是对单一的atomic变量执行两个或两个以上的操作)通常都需要被synchronize以便两者的操作能够被当作是一个atomic的单元。
class
Counter {
private
volatile
int
count =
0
;
public
synchronized
void
increment() {
count++;
//若要线程安全执行执行count++,需要加锁
}
public
int
getCount() {
return
count;
}
}
class
Counter {
private
AtomicInteger count =
new
AtomicInteger();
public
void
increment() {
count.incrementAndGet();
}
//使用AtomicInteger之后,不需要加锁,也可以实现线程安全。
public
int
getCount() {
return
count.get();
}
}
另外其底层就是volatile和CAS 共同作用的结果:
1.首先使用了volatile 保证了内存可见性。
2.然后使用了CAS(compare-and-swap)算法 保证了原子性。
其中CAS算法的原理就是里面包含三个值:内存值A 预估值V 更新值 B 当且仅当 V == A 时,V = B; 否则,不会执行任何操作。