当前位置: 代码迷 >> J2SE >> 有哥哥可以解释一下这个操作吗解决方法
  详细解决方案

有哥哥可以解释一下这个操作吗解决方法

热度:60   发布时间:2016-04-23 21:04:43.0
有哥哥可以解释一下这个操作吗

public int ineed=0;
     void method() {
           ineed++;通过代码表示此为非原子操作
}

如果描述呢 
 sos
------解决方案--------------------
应该是个计数器,记录method运行次数。
------解决方案--------------------
原子操作是不可分割的,在执行完毕不会被任何其它任务或事件中断,分为两种情况(两种都应该满足)

     (1) 在单线程中, 能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间。

      (2) 在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。
  
ineed++只需要执行一条指令,并不能保证多个线程ineed++,操作同一个ineed,可以得到正确的结果。因为还有寄存器的因素,多个cpu对应多个寄存器。每次要先把ineed从内存复制到寄存器,然后++,然后再把ineed复制到内存中,这需要至少3步。从这个意义上讲,说ineed++是非原子操作
------解决方案--------------------
你在代码里起个上千个线程都指向同一整数引用的i++,如果最终输出的结果i值不等于你起的线程个数,那么中间i++操作一定被分解了.但这玩意是理论的,实际不一定能这么巧出来这个结果.
  相关解决方案