当前位置:网站首页>多线程 里面 使用AtomicInteger类,保证线程安全
多线程 里面 使用AtomicInteger类,保证线程安全
2022-08-03 17:41:00 【一天不写程序难受】
目录
1 什么叫做线程安全
假设我们的网站要统计用户人数,我们需要通过变量的自增来实现:count++; 这个操作存在线程安全问题:
最后统计的人数是少的;
2 问题分析
count++的操作分为三步:
读取count的值
计算count+1的值
把新值存入count
假设count值为100,两个线程A和B都执行了操作1,
再同时执行操作2,A先进行操作3,这时count值为101,
B再执行操作3,之前B读取的值是100,执行完操作3后B
的结果还是101,这样数据出现了问题。因为上面的操作
不是原子的,可以分开执行。3 解决
AtomicInteger出现解决了上面的问题,使用它来执行统计:
static AtomicInteger at = new AtomicInteger(0);
public static void main(String[] args) {
for(int i = 0;i < 10000;i++){
new Thread(()->{at.incrementAndGet();}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("count = " + at.get());
}AtomicInteger 源码里面有关键字volatile; 它确保对volatile字段的更新以可预见的方式告知其他的线程。简而言之volatile 的作用是当一个线程修改了变量时,另一个线程可以读取到这个修改后的值。
4 总结
AtomicInteger能够实现整型数据的原子操作,在多线程并发的环境下能保证数据安全,而且内部使用乐观锁实现,比使用锁机制的并发性能高;
volatile保证了一个线程修改数据时,其它线程也能看到数据的修改 CAS操作保证了数据修改的安全性
5 线程统计失败个数
多个线程执行一段逻辑,统计有多少个线程失败了
ConcurrentMap<Integer, AtomicInteger> jobTimeoutCountMap = new ConcurrentHashMap<>();
//分10个线程,每个线程自增2000次
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 2000; i++) {
AtomicInteger timeoutCount = jobTimeoutCountMap.putIfAbsent(22, new AtomicInteger(1));
if (timeoutCount != null) {
// 记录慢任务慢的次数
timeoutCount.incrementAndGet();
}
}
}
}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(jobTimeoutCountMap.get(22));边栏推荐
猜你喜欢
随机推荐
酷开科技 × StarRocks:统一 OLAP 分析引擎,全面打造数字化的 OTT 模式
使用o.execute_sql 查询很很很小的表, 要7/8秒钟, 这个怎么解决
软件测试<进阶篇-->测试分类>
每周推荐短视频:为了填补学习资源的空缺,作者专门写了本书?
【JS】利用JS给删除按钮添加提示框
双指针/滑动窗口问题
多表查询最值
102. 最佳牛围栏
Crack: WebKitX ActiveX and WebKitX VHX
新“妖股”13个交易日暴涨320倍,市值3100亿美元超阿里
深度学习跟踪DLT (deep learning tracker)
Map和Set
融云「音视频架构实践」技术专场【内含完整PPT】
【用户运营】用这4个最佳客户服务策略,减少客户流失率
【数据库数据恢复】SqlServer数据库无法读取的数据恢复案例
【Deliberately practice the view of the back tube】deliberately practice
401. Binary Watch
USD 能统一元宇宙吗?
【技术白皮书】第二章:OCR智能文字识别回顾——自然语言文本发展历程
图像质量指标:PSNR、SSIM、MSE









