首页 > 其他分享 >假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时执行下面的代码,最终 a 的结果不可能是()

假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时执行下面的代码,最终 a 的结果不可能是()

时间:2023-09-22 19:11:39浏览次数:46  
标签:全局变量 ThreadA 结果 递增 初始值 线程 递减 加载

假设 a 是一个由线程 1 和线程 2 共享的初始值为 0 的全局变量,则线程 1 和线程 2 同时执行下面的代码,最终 a 的结果不可能是()

boolean isOdd = false;
for(int i=1;i<=2;++i){
    if(i%2==1)isOdd = true;
    else isOdd = false;
    a+=i*(isOdd?1:-1);
}

A:-1
B:-2
C:0
D:1

答案是D。


解释:

两个线程都有+1 ,-2的操作,但是关键是在保存a的值上,ThreadA对a+1,ThreadB也对a+1,ThreadB保存结果,此时a结果为1。虽然ThreadA对a+1但是并没有保存a,所以ThreadA保存a的值为1。
可以注意到虽然两个线程都进行了+1的操作,但是结果是错的。正是因为ThreadA将ThreadB的结果给覆盖了,而不是不执行+1。
知道这个道理之后就好办了
ThreadA的+1和-2操作都可以覆盖ThreadB的+1,-2。
一共有以下几种情况(可能不全):
蓝色框代表不会保存结果,因为黄色框数字将蓝色框数字覆盖了
image
原题链接:https://www.nowcoder.com/questionTerminal/2be86af464c04b9c9d7895d62dd46732?toCommentId=17308211
来源:牛客网

如果不理解多线程如何覆盖的可以看下面的解释:

下面是文章 https://zhuanlan.zhihu.com/p/639751407 来解释多线程如何覆盖

下表展示了递增线程再递减线程开始之前结束的结果,假设初值是1。

线程1(递增) 线程2(递减
加载值(值=1)
递增值(值=2)
存储值(值=2)
加载值(值=2)
递减值(值=1)
存储值(值=1)

存储在内存中的最终值是1。当递减线程在递增线程开始之前完成时,最终值也是1,如下表所示:

线程1(递增) 线程2(递减
加载值(值=1)
递减值(值=0)
存储值(值=0)
加载值(值=0)
递增值(值=1)
存储值(值=1)

然而,当指令交错执行时,结果是不同的,如下表所示:

线程1(递增) 线程2(递减
加载值(值=1)
递增值(值=2)
加载值(值=1)
递减值(值=0)
存储值(值=2)
存储值(值=0)

这种情况下,最终结果是0。换句话说,递增操作的结果丢失了。这是一个争用条件。

标签:全局变量,ThreadA,结果,递增,初始值,线程,递减,加载
From: https://www.cnblogs.com/xiuer211/p/17723185.html

相关文章

  • 微信小程序全局变量(globalData)和缓存(StorageSync)的区别和用法
    globalData和storage的区别一、app.globalData是全局变量,下次进入的时候,就要重新获取,一般用于:1、保存一些可能涉及安全类的数据,例如资源类,每次需要很准确的,就建议用全局变量。2、全局变量每次关闭小程序重新打开的时候,都会进行初始化更新。二、缓存(StorageSync)本地存储,storage......
  • C# 指定物理目录下载文件,Response.End导致“正在中止线程”异常的问题
    https://blog.51cto.com/u_15116285/5964873https://blog.csdn.net/phphot/article/details/4211921https://www.codenong.com/20988445/https://www.dbmng.com/art-2500.html现象:通过浏览器下载pdf文件,下载可以正常下载,可是却会抛出异常,提示正在中止线程。查了资料,能看懂的......
  • 记一个多线程调用同一个函数引发的数据冲突问题
    main.py负责接收请求,异步起线程调用高度离散的B(a、b、c...).py类文件,B(a、b、c...).py类文件在执行结束后会统一调用C.py文件中的一个函数规范处理结果,C.py本来的用途是解耦提高代码复用,但在高并发情况下出现了数据冲突的问题。即只有B(a).py才会产生的结果给写进了只会调用B(b).......
  • 深入浅出线程池 | 京东云技术团队
    一、线程1、什么是线程线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。2、如何创建线程2.1、JAVA中创建线程/***继承Thread......
  • 支付宝一面:多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!
    背景介绍1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。2,在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行......
  • multiprocessing:Python像线程一样管理进程
    前言multiprocessing库是基于threadingAPI,它可以把工作划分为多个进程。有些情况下,multiprocessing可以作为临时替换取代threading来利用多个CPU内核,相应地避免Python全局解释器锁所带来的计算瓶颈。下面,我们来看看multiprocessing库创建进程与threading库有多像。创建一个进......
  • 进程和线程
    1.并行和并发并发:指两个或多个事件在同一个时间段内发生(交替执行)并行:指两个或多个事件在同一个时刻发生(同时发生)2.进程的概念3.线程的概念(一个进程包括多个线程)4.线程调用分时调度:所有线程轮流使用cpu的使用权,平均分配每个线程占用cpu的时间抢占式调用:优先让优先级高的线程使用cp......
  • 线程安全和通信
    1.线程安全问题概述2.模拟卖票代码//创建一个Runnable接口的实现类publicclassRunnableImplimplementsRunnable{//在实现类中重写Runnable接口的run方法,设置线程任务。//定义一个多线程共享的资源privateintticket=100;//创建一个锁对象Object......
  • 《探索C++多线程》:condition_variable源码(一)
    https://blog.csdn.net/hujingshuang/article/details/70596630    现在接着学习关于多线程编程的特征,在这一节,将会了解到多线程中的condition_variable(条件变量)的相关知识。     在头文件<condition_variable>中有两种条件变量的类声明与定义:condition_varia......
  • 查看mysql资源占用高的线程及其详细信息
    结合操作系统线程查看mysql中的sql资源 消耗 ( 5.7 才可以,5.7时   performance_schema.threads表 才加入的  thread_os_id 系统线程字段 1--1、top-H查看具体线程的CPU消耗2[root@hostmysql80mysql]#top-H345--2、iotop-umysql查看具体......