Java多线程 结果错误:a++会让加的次数减少
发布日期:2021-06-30 13:12:04
浏览次数:2
分类:技术文章
本文共 1128 字,大约阅读时间需要 3 分钟。
文章目录
a++会让加的次数减少
如下的代码演示了, 原本期望是20000的结果, 却由于线程不安全, 导致了结果不符合预期.
创建了两个线程, 都去调用run方法的共享变量的i++的操作.
并且使用了join让主线程等待子线程. 主线程等待子线程执行完毕之后, 再打印执行的结果./** * 类名称:MultiThreadsError * 类描述: 第一种:运行结果出错。 演示计数不准确(减少),找出具体出错的位置。 * * @author: https://javaweixin6.blog.csdn.net/ * 创建时间:2020/8/31 19:18 * Version 1.0 */public class MultiThreadsError implements Runnable{ static MultiThreadsError instance = new MultiThreadsError(); int index = 0; public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(instance); Thread thread2 = new Thread(instance); thread1.start(); thread2.start(); //主线程 等待子线程 thread1.join(); thread2.join(); //打印结果 System.out.println(instance.index); } @Override public void run() { for (int i = 0; i < 10000; i++) { index++; } }}
运行两次程序 可以看到分别打印如下. 结果是不一致的, 这就出现了线程不安全的现象.
加的次数减少原因分析
主要的原因是i++的操作, 看似是一条语句, 但其实是3条语句,
先要获取i的值, 再加1 ,最后再把加好的值,赋值给i. 那么就可能出现, 在线程1 执行了加1操作的时候, 还没把最新的值赋值给i , cpu调度就把执行权给了线程2 , 导致原本此时应该是i是2的,但是却获取到的是1的值. 这样就导致了加的值变小了. 如下图的的箭头执行流程,转载地址:https://javaweixin6.blog.csdn.net/article/details/108327742 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月07日 12时43分17秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Python 2大限来了!113天后自生自灭,官方不再维护更新
2019-05-01
GitHub 热榜第一的 Python 抢票神器!节假日能用上
2019-05-01
1.6w 星开源项目,但作者月薪却不到 5K
2019-05-01
Python解惑之:整数比较
2019-05-01
Python解惑之:True与False
2019-05-01
你要的微信小程序终于来了
2019-05-01
我的2016书单
2019-05-01
冷眼看小程序
2021-07-04
为什么执行 x in range(y) 如此快?
2021-07-04
看完这篇文章你还不理解 Python 装饰器,只有一种可能...
2021-07-04
Python干货:表达式 i += x 与 i = i + x 等价吗?
2019-05-01
有了这些 Chrome 插件,效率提升10倍(建议收藏)
2019-05-01
Python 编码错误的本质原因
2019-05-01
Python 开发者都会遇到的错误:UnboundLocalError
2019-05-01
用 Python 送“爱心”
2019-05-01
理解HTTPS为什么安全前,先看看这些东西
2019-05-01
代码这样写不止于优雅(Python版)
2019-05-01
一份来自掘金社区的开发者报告
2019-05-01
只有1%的程序员搞懂过浮点数陷阱
2019-05-01
Erlang 之父 Joe Armstrong 去世
2019-05-01