日期:2014-05-20  浏览次数:20959 次

i++会被线程影响吗?
用i++,会执行到一半,就被线程中断吗?
比如刚返回了i,还未自增。或者刚自增,还未返回自增前的i


------解决方案--------------------
把i作为共享变量时可以被影响的
------解决方案--------------------
i++不是原子操作,一般分为加载,更新和保存三部,所以多线程共享该变量需要进行同步,连一些CPU指令码都可能被打断,更别说i++了。。。
------解决方案--------------------
应该说是可以被中断 ,但是,还得看你怎么定义的i,共享变量就会被打断, 私有的就不会了。
------解决方案--------------------
即使是原子操作,也需要进行内存的同步,涉及到java多线程内存模型的,你上网搜搜相关资料就知道了
------解决方案--------------------
当然会的,不管是否是共享的,线程是在抢到 CUP 后才能执行,是吧,如果是是私有的,CPU 也有切换的时候,也就是说LZ说的过程,执行到一半就死了,只能说,一般情况下,是不变。
------解决方案--------------------
会;
i++有两步操作i+1;i=i+1;
主要执行过程 从主存里面拿1.i副本2.修改i 3.更新主存。
假如两个线程A,B
A,B同时看到的都是0
然后在+1,刷新主存,即使两个线程总共执行了两次++操作,实际上只是+了一次,当然这只是其中的情况。
------解决方案--------------------
非原子操作
有这种可能
------解决方案--------------------
当然会的,不管是否是共享的,线程是在抢到 CUP 后才能执行,如果是是私有的,CPU 也有切换的时候,也就是说LZ说的过程,执行到一半就死了,只能说,一般情况下,是不变的。
------解决方案--------------------
会的.

可以用javap查看JVM指令:

getfield    
iconst_1    
iadd
putfield

i++分成了如上显示的四步
------解决方案--------------------
这个会被影响的 不是原子操作