zoukankan      html  css  js  c++  java
  • 多线程关于腾讯笔试题

    今天在头条上看到一道据说是腾讯的笔试题,闲来无事,准备验证一下!

    题目如下:

    有一个变量int a=0;两个线程同时进行+1操作,每个线程加100次,不加锁,最后a的值是()?

    根据我的理解答案不唯一,最大是两百,最小是2吧。直接上代码:

    class MyThread implements Runnable {
        static volatile long i = 0;
    
        public void run() {
            for (int m = 0; m < 100; m++) {
                i++;
            }
        }
    };
    
    public class RunnableTest {
        public static void main(String[] args) throws InterruptedException {
            MyThread mt = new MyThread();
    
            Thread t1 = new Thread(mt);
            Thread t2 = new Thread(mt);
            t1.start();
            t2.start();
            Thread.sleep(500);
            System.out.println(MyThread.i);
        }
    }
    结果一脸懵逼,每次都是两百,我都开始有点怀疑人生了。
    考虑之后发现可能是100太小了,样本空间不够(伪学霸),吧100改成10000,奇迹出现了
    果然大部分时候i的值小于20000.
    具体解释一下原因(复制过来的哈哈):

    i++不是原子(就是只由一条指令构成的)操作,也就是说,它不是单独一条指令,而是3条指令:

    
    

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

    
    

    2、CPU寄存器的值+1

    
    

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

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

     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;



  • 相关阅读:
    Working with macro signatures
    Reset and Clear Recent Items and Frequent Places in Windows 10
    git分支演示
    The current .NET SDK does not support targeting .NET Core 2.1. Either target .NET Core 2.0 or lower, or use a version of the .NET SDK that supports .NET Core 2.1.
    Build website project by roslyn through devenv.com
    Configure environment variables for different tools in jenkins
    NUnit Console Command Line
    Code Coverage and Unit Test in SonarQube
    头脑王者 物理化学生物
    头脑王者 常识,饮食
  • 原文地址:https://www.cnblogs.com/sharkli/p/5597148.html
Copyright © 2011-2022 走看看