i++和++i的区别,及其线程安全问题

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的线程安全分为两种状况:方法

一、若是i是局部变量(在方法里定义的),那么是线程安全的。由于局部变量是线程私有的,别的线程访问不到,其实也能够说没有线程安不安全之说,由于别的线程对他造不成影响。线程安全

二、若是i是全局变量(类的成员变量),那么是线程不安全的。由于若是是全局变量的话,同一进程中的不一样线程都有可能访问到。安全性

若是有大量线程同时执行i++操做,i变量的副本拷贝到每一个线程的线程栈,当同时有两个线程栈以上的线程读取线程变量,假如此时是1的话,那么同时执行i++操做,再写入到全局变量,最后两个线程执行完,i会等于3而不会是2,因此,出现不安全性。

相关文章
相关标签/搜索