public AtomicInteger(int initialValue) 创建具有给定初始值的新 AtomicInteger。
方法
int incrementAndGet() 以原子方式将当前值加 1。
int getAndIncrement() 以原子方式将当前值加 1。
int decrementAndGet() 以原子方式将当前值减 1。
int getAndIncrement() 以原子方式将当前值减 1。
int getAndAdd(int delta) 以原子方式将给定值与当前值相加。
int addAndGet(int delta) 以原子方式将给定值与当前值相加。
int get() 获取当前值。
*/
public class Test02 {
public static void main(String[] args) {
AtomicInteger ai = new AtomicInteger(1);
ai.incrementAndGet(); //++ai 2
ai.getAndIncrement(); //ai++ 3
System.out.println(ai.get());// 3
System.out.println(ai.getAndIncrement()); // 3
System.out.println(ai.get()); // 4
System.out.println(ai.incrementAndGet()); // 5
System.out.println(ai.get()); //5
}
}
复制代码
CAS无锁机制
CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。当多条线程尝试使用CAS同时更新同一个变量时,只有其中一条线程能更新变量的值,而其他线程都失败,失败的线程并不会被挂起,而是告知这次竞争失败,并可以再次尝试. CAS的缺点:
CAS虽然很高效的解决了原子操作问题,但是CAS仍然存在三大问题。
循环时间长开销很大。
CAS 通常是配合无限循环一起使用的,如果 CAS 失败,会一直进行尝试。如果 CAS 长时间一直不成功,可能会给 CPU 带来很大的开销。
复制代码
只能保证一个变量的原子操作。
当对一个变量执行操作时,我们可以使用循环 CAS 的方式来保证原子操作,但是对多个变量操作时,CAS 目前无法直接保证操作的原子性。