美文网首页
Java之 多线程调用同一个变量可能导致的问题

Java之 多线程调用同一个变量可能导致的问题

作者: Jowney | 来源:发表于2018-05-11 01:32 被阅读52次

问题:i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?(答案是200和2)

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

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

2、CPU寄存器的值+1

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

如果是单线程操作,i++毫无问题;但是在多核处理器上,用多线程来做i++会有什么问题呢?

=========分析=======

(下面是我复制过来的)

假设两个线程的执行步骤如下:

  1. 线程A执行第一次i++,取出内存中的i,值为0,存放到寄存器后执行加1,此时CPU1的寄存器中值为1,内存中为0;

  2. 线程B执行第一次i++,取出内存中的i,值为0,存放到寄存器后执行加1,此时CPU2的寄存器中值为1,内存中为0;

  3. 线程A继续执行完成第99次i++,并把值放回内存,此时CPU1中寄存器的值为99,内存中为99;

  4. 线程B继续执行第一次i++,将其值放回内存,此时CPU2中的寄存器值为1,内存中为1;

  5. 线程A执行第100次i++,将内存中的值取回CPU1的寄存器,并执行加1,此时CPU1的寄存器中的值为2,内存中为1;

  6. 线程B执行完所有操作,并将其放回内存,此时CPU2的寄存器值为100,内存中为100;

  7. 线程A执行100次操作的最后一部分,将CPU1中的寄存器值放回内存,内存中值为2;

相关文章

  • Java之 多线程调用同一个变量可能导致的问题

    问题:i++在两个线程里边分别执行100次,能得到的最大值和最小值分别是多少?(答案是200和2) i++不是原子...

  • Java自学-多线程 同步synchronized

    Java 多线程同步 synchronized 多线程的同步问题指的是多个线程同时修改一个数据的时候,可能导致的问...

  • java中的Atomic类

    java中的Atomic类 问题背景 在多线程环境中,我们最常遇到的问题就是变量的值进行同步。因为变量需要在多线程...

  • ThreadLocal

    Thread 同一个变量在多线程访问的环境下,可能出现线程安全的问题。ThreadLocal通过创建线程副本的方式...

  • ArrayList多线程调用add()可能出现的问题

    ArrayList多线程调用add()可能出现的问题 一 ArrayList在多线程调用Add()添加元素时的下...

  • python的多线程类变量共享

    问题说明 在同一个类中启动多线程的方法,和多线程执行的方法如果都在同一个类中,启动多线程时 通过self调用方法名...

  • Java多线程是如何解决同步的?

    同步资源 同步资源,是对资源(类、方法、代码块、变量)进行同步控制。在java中的多线程操作(修改)同一个共享变量...

  • 使用JDK自带的工具jstack找出造成运行程序死锁的原因

    Java多线程编程也是Java面试中经常考察的内容。刚接触Java多线程编程的朋友们,可能会不慎写出一些会导致死锁...

  • ThreadLocal

        ThreadLocal不是JUC并发包下工具,它在java.lang包下面。多线程访问同一个共享变量的时候...

  • java 多线程死锁

    java经典问题多线程死锁问题。因为多个线程都在等待根本不可能被释放的锁,从而导致所有的任务都无法继续运行下去。 ...

网友评论

      本文标题:Java之 多线程调用同一个变量可能导致的问题

      本文链接:https://www.haomeiwen.com/subject/chsxdftx.html