用户工具


为什么i++并发有问题?

因为在副本中修改,还没有来得及写回堆内存。参考jvm内存结构

为什么不直接在堆内存中做修改操作?

因为jvm的指令模型就是这样

  • 每个线程有自己的数据栈,计数器。这就意味着想执行指令必须先将数据复制到线程内部的私有数据栈。
    • 第2条指令:getfield 将cnt的值复制到线程私有的数据栈
    • 第5条指令:将1压入线程私有数据栈
    • 第6条指令:将cnt + 1的结果写入线程私有栈顶
    • 第7条指令:将栈顶的值更新到 cnt中

如果该线程在执行到第5,第6条指令时,被其他线程抢占了且也执行了这个函数,那就会丢失一次更新