因为i++是属于分段成
temp = i;
temp2 = i+1;
i=temp2;
如果线程1在执行第一条代码的时候,线程2访问i变量,这个时候,i的值还没有变化,还是原来的值,所以是不安全的。
代码表示
public class TestSafe implements Runnable{
private static int i=0;
public static void insert(){
for(int j =0; j<1000;j++){
i++;
}
}
public static void main(String[] args) {
ExecutorService executors = Executors.newFixedThreadPool(3);
for(int j=0; j<3; j++) {
executors.execute(new TestSafe());
}
executors.shutdown();
while (true){
if (executors.isTerminated()) {
System.out.println(i);
break;
}
}
}
@Override
public void run() {
insert();
}
}
运行这段代码时,i的值一直不是3000,只有当insert方法加上synchronized的时候,值才是3000,由此可以看出,i++不是线程安全的,++i也是如此