import java.util.concurrent.atomic.AtomicInteger;
/*
* volatile不是原子性的,它只保证变量在多线程中可见,操作时并不是线程安全的
* AtomicInteger 是原子性的
*/
public class sub extends Thread{
public static volatile int a;
private static AtomicInteger A = new AtomicInteger(0);
@Override
public void run() {
adda();
}
private void adda() {
for (int i = 0; i < 10000; i++) {
a++;// 先获取a 然后a+1 再赋值给a 赋值这个过程中可能其他线程也对a赋值了 所有造成加不到2000
A.addAndGet(1);//获取A的值和A+1时在同一个方法中加synchronized了,所以原子性了
}
}
public static void main(String[] args) throws Exception {
sub[] ss=new sub[2];
for (int i=0;i<ss.length;i++) {
ss[i]=new sub();
}
for (sub sub : ss) {
sub.start();
}
Thread.sleep(3000);
System.out.println(sub.a);//16965 结果<=20000
System.out.println(sub.A.get());//20000
}
}
本文通过一个简单的多线程示例对比了volatile与AtomicInteger的区别。volatile仅保证变量的可见性,而AtomicInteger提供了原子性操作,确保了线程安全性。通过运行结果可以看出,在多线程环境下使用AtomicInteger可以避免因并发导致的数据不一致问题。
746

被折叠的 条评论
为什么被折叠?



