结果截图如下:
原因分析:
因为非原子性的自增一共包括3个原子性操作(步骤1:取i的值 步骤 2:i+1 步骤3:把新的值赋予i),当多个线程对其进行操作时,如一个线程在步骤1取i 的值结束后,还没有来得及进行步骤2,另一个线程就对还没完成自增的i进行自增了,导致i的值经过这两个线程的自增操作后i的值只加1。
源代码如下:
public class Test1_5 {
private static int value1=0;
public static void main(String[] args) {
AtomicInteger value2=new AtomicInteger();
Thread[] thread1s=new Thread[10000];
for(int i=0;i<10000;i++) {
thread1s[i]=new Thread() {
public void run() {
value1++;
}
};
thread1s[i].start();
}
for(Thread thread:thread1s) {
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Thread[] thread2s=new Thread[10000];
for(int i=0;i<10000;i++) {
thread2s[i]=new Thread() {
public void run() {
value2.incrementAndGet();
}
};
thread2s[i].start();
}
for(Thread thread:thread2s) {
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("非原子性的自增一万次得出的结果为:"+value1);
System.out.println("原子性的自增一万次得出的结果为:"+value2);
}
}
注意:
源代码中的value1必须定义为类的变量,而不能定义在main函数中,不然不能进行自增操作,会提示
Local variable value defined in an enclosing scope must be final or effectively final