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
}
}