论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
数据库
›
Oracle
›
JavaEE 线程安全
JavaEE 线程安全
知者何南
金牌会员
|
2024-11-22 11:25:58
|
显示全部楼层
|
阅读模式
楼主
主题
818
|
帖子
818
|
积分
2454
JavaEE 线程安全
近来重新开始复习多线程的知识,故此将线程安全这块重点单拎出来做文章记录,方便后续回想
1. 概念
什么是线程安全题目?很直观的说,就是一段代码,在单线程的环境下没有题目,但是在多线程的环境下却出现了题目,我们则可称这段代码存在
线程安全题目
。
我们用代码举例:
我如今有两个线程,我希望通过这两个线程来对一个变量count举行加法运算,每个线程各加50_0000,末了在主线程输出count
代码如下:
public class Test1 {
private static int count = 0;
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
for (int i = 1;i <= 500000;i++) {
count++;
}
});
Thread t2 = new Thread(() -> {
for (int i = 1;i <= 500000;i++) {
count++;
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("count = " + count);
}
}
复制代码
正常在单线程环境下,举行上述的代码操纵,末了得到的count会等于100_0000,但是在多线程的环境下,上述操纵得到的结果却不是我们所意推测的结果:
为什么相差这么多?且每次运行的结果都不一样!
根本原因便是线程之间的调度是
无序的
,
随机调度
的,也称
抢占式执行
正因如此,在上述代码中,两个线程对count这个对象的修改操纵会产生很多种情况:
注:count++这个操纵本质上是由三条CPU指令构成的:
load:把内存中的数据加载到寄存器中;
add:将寄存器中的数据举行加1运算;
save:将寄存器中的数据写回到内存中;
合理的情况:
不合理的情况:
上述的不合理情况还有多种,这里举最典型的情况,如上图,可以看到在多线程的环境下,
线程的随机调度导致无法保证操纵的原子性
,导致t1线程值还没修改完,t2线程就对count举行了修改,末了仍旧被t1线程修改后的旧值所覆盖,这也是我们上述代码得到结果不准确且不唯一的原因!
对此也得出一个结论:导致线程安全题目标
根本原因
是线程的
随机调度
,同时在代码结构上也与
多个线程同时对同一个对象
举行修改有关;
那么既然题目出现了,我们就要想办法解决它!
2. 如何解决线程安全题目
对于线程安全题目,我们常规的解决方案便是-
加锁
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
知者何南
金牌会员
这个人很懒什么都没写!
楼主热帖
开源二三事|ShardingSphere 与 Databa ...
SQLServer数据库基础教程
Sqlserver创建用户并授权
华为再次登上央视!鸿蒙系统3.0今年上 ...
这个简单的小功能,半年为我们产研团队 ...
「笔记」某移动SRE运维体系交流 ...
Oracle调度器Scheduler
编程体验1
ESP32-C3 学习测试 蓝牙 篇(六、添加 ...
C++面试八股文:C++中,函数的参数应该 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表