首先上代码:开启10个线程,每个线程对i自增100次
package demo1;
public class demo1 {
private static volatile int i=0; //volatile保证线程可见性
public static void iIncrease(){
i++;
}
public static void main(String a[]){
for (int i = 0;i<10;i++){ //启动十个线程
new Thread(()->{
for (int j=0;j<100;j++) //每个线程对变量i增加一百下
iIncrease();
}).start();
}
try {
Thread.sleep(1000L); //等所有线程操作完成再查看i的值
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(i);
}
}
发现i最后的值不是1000而是960。
在控制台用javac命令编译此Java文件得到字节码,再用javap命令查看字节码可以看到iIncrease()方法中i++对应的JVM指令<