请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师你好,能具体描述一下i++为什么不是线程安全的吗?

老师你好,能具体描述一下i++为什么不是线程安全的吗?

正在回答

2回答

muffinfeng 你好:

    其实这个 i++ 或者 ++i 不是线程安全的问题也是面试常见的一个问题。我在此详细的解释下这个问题。

    i++不是原子操作,也就是说,它不是单独一条指令,而是3条指令(3条汇编指令):

        1. 从内存中把i的值取出来放到CPU的寄存器中

        2. CPU寄存器的值+1

        3. 把CPU寄存器的值写回内存

    由于线程共享栈区,不共享堆区和全局区,所以当且仅当 i 位于栈上是安全的,反之不安全(++i 也同理).   因为如果是全局变量的话,同一进程中的不同线程都有可能访问到。对于读值,+1,写值这三步操作,在这三步任何之间都可能会有 CPU 调度产生,造成 i 的值被修改,造成脏读脏写。

    其实,最核心的就是这个 +1 的过程不是原子的,任何一个线程都可以打断这个过程,一旦打断,其他线程看到的值可能是落后的了。

    那么,对于 value-- 或者 --value 也就是一个道理了。-1 的过程不是原子的,多线程的调度不可预知,那么,线程在操作的过程中看到的值不是最新的,所以,就会存在一直减到负值的情况了。


    我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!


2 回复 有任何疑惑可以回复我~
  • 提问者 muffinfeng #1
    非常感谢一哥!
    回复 有任何疑惑可以回复我~ 2020-09-10 11:10:47
  • 那怎么解决呢?
    回复 有任何疑惑可以回复我~ 2020-09-11 08:50:20
  • 一哥,我有疑问: 由于线程共享栈区,不共享堆区和全局区,所以当且仅当 i 位于栈上是安全的,反之不安全(++i 也同理).    这句话是不是说的有问题,应该是线程不共享栈区,共享堆区和全局区,所以当且仅当 i 位于栈上是安全的,反之不安全(++i 也同理).
    回复 有任何疑惑可以回复我~ 2021-03-12 15:46:20
提问者 muffinfeng 2020-09-08 17:27:43

还有的话就是我不明白为什么这里value--之后会返回负数呢

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信