i++ 和 ++i 都是 i=i+1 的意思, 但是过程有些许区别:
i++: 先赋值再自加.(例如: i=1;a=1+i++; 结果为 a=1+1=2, 语句执行完后 i 再进行自加为 2)
++i: 先自加再赋值.(例如: i=1;a=1+++i; 结果为 a=1+(1+1)=3,i 先自加为 2 再进行运算)
但是在单独使用时没有区别: 如 for(int i=0;i<10;i++){ } 和 for(int i=0;i<10;++i) { } 没有区别.
i++ 和 ++i 的线程安全分为两种情况:
1, 如果 i 是局部变量 (在方法里定义的), 那么是线程安全的. 因为局部变量是线程私有的, 别的线程访问不到, 其实也可以说没有线程安不安全之说, 因为别的线程对他造不成影响.
2, 如果 i 是全局变量 (类的成员变量), 那么是线程不安全的. 因为如果是全局变量的话, 同一进程中的不同线程都有可能访问到.
如果有大量线程同时执行 i++ 操作, i 变量的副本拷贝到每个线程的线程栈, 当同时有两个线程栈以上的线程读取线程变量, 假如此时是 1 的话, 那么同时执行 i++ 操作, 再写入到全局变量, 最后两个线程执行完, i 会等于 3 而不会是 2, 所以, 出现不安全性.
来源: http://www.bubuko.com/infodetail-2986737.html