作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)
AtomicInteger
AtomicInteger类是为了解决多线程下并发修改同一个变量的问题,以下例子num的值不会等于30000,总是小于30000的,因为没有做同步操作,多个线程操作同一个变量使得结果不正确。
public class AtomicIntegerDemo extends Thread{
public static Integer num = 0;
public void addNum(){
num++;
}
@Override
public void run() {
for(int i=0;i<10000;i++){
addNum();
}
}
public static void main(String[] args) throws InterruptedException {
AtomicIntegerDemo atomicIntegerDemo1 = new AtomicIntegerDemo();
AtomicIntegerDemo atomicIntegerDemo2 = new AtomicIntegerDemo();
AtomicIntegerDemo atomicIntegerDemo3 = new AtomicIntegerDemo();
atomicIntegerDemo1.start();
atomicIntegerDemo2.start();
atomicIntegerDemo3.start();
Thread.sleep(5000);
System.out.println(num);
}
}
将上面的代码改为
public class AtomicIntegerDemo extends Thread{
//使用AtomicInteger
public static AtomicInteger num = new AtomicInteger(0);
public void addNum(){
//调用incrementAndGet方法来增加num的值
num.incrementAndGet();
}
@Override
public void run() {
for(int i=0;i<10000;i++){
addNum();
}
}
public static void main(String[] args) throws InterruptedException {
AtomicIntegerDemo atomicIntegerDemo1 = new AtomicIntegerDemo();
AtomicIntegerDemo atomicIntegerDemo2 = new AtomicIntegerDemo();
AtomicIntegerDemo atomicIntegerDemo3 = new AtomicIntegerDemo();
atomicIntegerDemo1.start();
atomicIntegerDemo2.start();
atomicIntegerDemo3.start();
Thread.sleep(5000);
System.out.println(num);//30000
}
}
源码
看下AtomicInteger类的新增变量值的方法,该方法中会一直尝试将变量+1赋值给变量,前提是线程改变后的值和期望改变后的值一致,不一致说明这时候有其他线程也在更新变量,所以就会一直尝试,直到没有竞争时才会修改成功。
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
return var5;
}