线程1: i++; i++; 线程2: i+=2; 的问题 (2013年某公司笔试题目)
来源:互联网 发布:c语言void什么意思 编辑:程序博客网 时间:2024/03/29 13:17
题目:
全局的int i = 0;
线程1: i++; i++;
线程2: i+=2;
问: 最后i的取值可能是()
a. 1 b. 2. c 3 d 4
首先我们就可以断定, a肯定不对, 无论线程怎么走, 总会执行 i+=2, 怎么可能加着加着就成了1呢, 那不是变少了么?
我们先看程序:
- #include <stdio.h>
- int main()
- {
- int i = 0;
- i++;
- return 0;
- }
我们看到, i++其实并不是原子操作, 而是要经历3个步骤, 这三个步骤都是可以被线程打断的。 有的朋友可能不太熟悉汇编, 没关系, 我来解释一下, 上面三个语句的作用分别是:
1. 把内存i的值放到寄存器eax中;
2. eax中的值加1
3. 然后把eax的值又返回到内存i中
下面, 我们来做做这个题目:
假设先执行完线程1, 再执行线程2, 那结果必然是4, 这个很简单吧。
假设先执行线程1的i++; 那么此时i的值就是1了, 然后再执行i+=2, 别忘了, i+=2需要分三个步骤, 假设在执行这三个步骤的过程中被线程1打断(此时, 线程2的eax是3, 但还没有返回给i), 那么线程1会继续执行i++, 执行完后i的值是2, 随后, 线程2的eax中的3返回给i (把线程1产生的2这个值给覆盖掉了), 所以, 随后i的值为3.
假设线程2先执行, 在执行i+=2的时候, 被线程1打断(此时, i的值是0, 线程2的eax的值是2, 但还没有来得及返回给i), 然后线程1执行i++和i++后, i的值是2, 随后, 线程2的eax中的2返回给i, 所以, i的值为2.
所以, 该题目选bcd.
- 线程1: i++; i++; 线程2: i+=2; 的问题 (2013年某公司笔试题目)
- 线程1: i++; i++; 线程2: i+=2; 的问题 (2013年某公司笔试题目)
- i++和++i的线程安全性问题
- java面试题inti=2;i+=i-=i*i的值以及关于i++;++i;i=i+1;i+=1 的效率问题
- i++ ,++i,i=i++的问题
- i++ ,++i,i=i++的问题
- i++的线程安全性
- i++的线程安全性
- i++的线程安全性
- i++的线程安全性
- i++的线程安全性
- 2012腾讯 实习生笔试题目b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];
- i=i++的问题
- i=i++的问题
- 线程安全性---面试题--i++的线程安全性问题
- i++ 、++i 、i-- 、--i 的效率问题
- Java并发(1) i++的线程安全问题
- AtomicInteger线程安全的i++
- AVAudioRecorder录音和AVAudioPlayer播放
- android 5.0新特性CardView教程
- 排序算法(五):冒泡排序
- 基于PhalApi的DB集群拓展 V0.1bate
- 百度echarts后台Java封装小实例
- 线程1: i++; i++; 线程2: i+=2; 的问题 (2013年某公司笔试题目)
- 给你的JAVA程序配置参数(Properties的使用)
- Content-disposition
- Foundation框架下的结构体
- 单链表的的逆置(带头结点)
- 文件一些常用搜索命令
- poj 3181 Dollar Dayz dp 完全背包
- C#中WebBrowser控件的版本问题
- C语言实现任何文件的加密解密