文章详情页
java - 关于i++的一个题目
浏览:271日期:2023-12-13 18:10:01
问题描述
使用2条线程对i=1进行自增(i++),每条线程各自执行100次,请问可能的最大值和最小值是多少?请给出解释
另外问问,++i是否是原子性的?
问题解答
回答1:最小可以是 3,即 +2,最大 201,即 +200 。。。。为什么 i 不从 0 开始。。。
一次循环过程是:
从内存读取数据到寄存器
寄存器值++
写回数据到内存
一个线程可能在这三步中的任意一步被打断。是3的情况是:第一线程读取数据1,然后被挂起,寄存器的值被保存到另一个地方。第二个线程,持续执行了 99 次(此时,内存中的值为 100),然后被挂起。第一个线程被唤醒,恢复寄存器的 1 +1 之后 (=2)被写回内存,该线程被挂起第二个线程从内存读取2到寄存器之后被挂起第一个全部执行完,把值写回内存唤起第二个线程,恢复寄存器中的2,完成最后一次循环+1 之后写回 3
所以最终结果是 3。。。。
还没有想到更小的调度方式。。。
最大值就不用过多解释了。。。。
回答2:最小值为2,最大值为200。2就是两个线程都在CPU缓存修改数据,最终内存只刷新了一次200 就是两个线程交替读取并修改,互相不竞争。都问最大值最小值了,自然不是原子性的。
标签:
java
相关文章:
1. javascript - sublime怎么支持webp的浏览?2. javascript - nginx 反向代理 js跨域问题?3. css3 - img垂直水平居中问题4. python - pig latin问题 总是出现list/string index out of range5. javascript - sublime已经安装了babel插件和sublimelinter-jshint为什么还是显示es6语法错误?6. html5 - 为什么浏览器可以显示HTML文档中未被定义的标签?7. javascript - 图片能在网站显示,但控制台仍旧报错403 (Forbidden)8. javascript - angularJS select标签问题9. 安装mysql,完成时提示的是用户名root,在终端查看版本时显示的不是root,请问这怎么解决10. python - 如何解决程序运行太久之后被操作系统暂停的情况?
排行榜

网公网安备