一道非常棘手的 Java 面试题:i++ 是线程安全的吗?

news2025/7/2 11:02:32

i++ 是线程安全的吗?

相信很多中高级的 Java 面试者都遇到过这个问题,很多对这个不是很清楚的肯定是一脸蒙逼。内心肯定还在质疑,i++ 居然还有线程安全问题?只能说自己了解得不够多,自己的水平有限。

先来看下面的示例来验证下 i++ 到底是不是线程安全的。

1000个线程,每个线程对共享变量 count 进行 1000 次 ++ 操作。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

上面的例子我们所期望的结果应该是 1000000,但运行 N 遍,你会发现总是不是 1000000,至少你现在知道了 i++ 操作它不是线程安全的了。

先来看 JMM 模型中对共享变量的读写原理吧。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

每个线程都有自己的工作内存,每个线程需要对共享变量操作时必须先把共享变量从主内存 load 到自己的工作内存,等完成对共享变量的操作时再 save 到主内存。

问题就出在这了,如果一个线程运算完后还没刷到主内存,此时这个共享变量的值被另外一个线程从主内存读取到了,这个时候读取的数据就是脏数据了,它会覆盖其他线程计算完的值。。。

这也是经典的内存不可见问题,那么把 count 加上 volatile 让内存可见是否能解决这个问题呢?答案是:不能。因为 volatile 只能保证可见性,不能保证原子性。多个线程同时读取这个共享变量的值,就算保证其他线程修改的可见性,也不能保证线程之间读取到同样的值然后相互覆盖对方的值的情况。

解决方案

说了这么多,对于 i++ 这种线程不安全问题有没有其他解决方案呢?当然有,请参考以下几种解决方案。

1、对 i++ 操作的方法加同步锁,同时只能有一个线程执行 i++ 操作;

2、使用支持原子性操作的类,如 java.util.concurrent.atomic.AtomicInteger,它使用的是 CAS 算法,效率优于第 1 种;

如果对你有帮助,点个赞分享下给个鼓励吧!

                          资源获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻

 精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻

每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cache 缓存

缓存原理 测试样例 验证码 获取验证码 验证 验证码是否正确 idea 启动缓存 手机验证码 idea 手机 获得验证码 ehchace 数据淘汰策略 使用redis 然后启动 redis 服务器 redis-server.exe redis.windows.conf 启动redis 客户端redis-cli.exe time-to-live 最大活动时间 缓…

jsp+ssm计算机毕业设计职业中介信息管理系统【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

【蓝牙依赖】微信小程序 + uni通用,自用蓝牙依赖文件总结

引言 今年相较去年相比,做的比较多的是,蓝牙方面的对接工作。 因此,我整理了大半年来,对接蓝牙的经验,编写了蓝牙依赖文件。 这样可以有效的提升我的开发效率,以及合理增加我快乐的摸鱼时间 ~ 正文 废话…

ubuntu 安装supervisord

ubuntu 系统安装命令如下 sudo apt update && sudo apt install supervisor Supervisor服务在安装后自动运行(这点从安装后创建的symlink到systemd的自启动服务可以看出)。检查其状态: sudo systemctl status supervisor 如下安装…

基于SPRINGBOOT的高校羽毛球馆信息管理系统的设计与实现

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字):基于springboot的高校羽毛球馆信息管理系统的设计与实现 模块划分:通知类型、通知信息、用户信息、用户充值、…

成功转行Python工程师,年薪30W+,经验总结都在这!

这是给转行做Python的小白的参考,无论是从零开始,或者是转行的朋友来说,这都是值得一看的,也是可以作为一种借鉴。 而且我决定转行IT(互联网)行业(已转好几年),其实理由…

基于Java+Swing+mysql游泳馆会员管理系统

基于JavaSwingmysql游泳馆会员管理系统一、系统介绍二、功能展示1.管理员登陆2.主页面3.添加会员卡4.存款管理5.消费管理6.会员资料查询7.会员资料修改7.会员卡禁用、挂失三、系统实现1.StudentFrame .java四、其它1.其他系统实现一、系统介绍 该系统实现了管理员系统登陆、售…

四大领先优势加持,华为云会议服务更省心可靠!

  随着数字化转型的加速,随时随地视频沟通和数据协作的工作方式加速走进各行各业,并衍生出丰富的行业应用场景。云会议融入到了行业的增值和业务创新中,如在线办公,在线教育,远程会诊,金…

T-SQL程序练习01

目录 一、编写T-SQL程序,计算 1 2 − 3 4 − 5 … − 99 100 ? 二、写一个求三个数最大值的函数,输入为三个整数,输出为其中的最大值。 三、写一个T-SQL函数 𝑓𝑎𝑡,利用标准体重计算公式…

华为云桌面,数字化时代便捷、安全的办公选择

在当今效率优先、信息技术高度发展的时代,云桌面作为一种帮助企业实现快速办公上云的云服务,将应用于企业日常办公中,它不仅能够提升工作效率,而且还具有良好的扩展性和可扩展性,因此备受业界关注。 其中,华…

太难了!自学编程转行经历分享

本人坐标武汉,双非机电专业背景出身,求职目标互联网行业。 其实机电专业在整个机械大类里算是好就业一点的了,毕竟会涉及到单片机和PLC,随着物联网以及智能制造的发展,前景比传统的机械专业还是要好很多。&#xff08…

PGP邮件加密软件的使用

一、实验目的及要求 1.熟悉公开密钥密码体制,了解证书的基本原理,熟悉数字签名; 2.熟练使用PGP的基本操作,能对邮件或传输文档进行加密; 二、实验内容 1.创建一私钥和公钥对 使用PGPtray之前,需要用PGPkey…

【架构师(第五十二篇)】 几个前端工具的基本使用

前端截图 html2canvas 基本用法 import html2canvas from html2canvas const screenshot () > {// 获取需要截图的 dom 节点const el document.getElementById(target-id)// 第一个参数是节点,第二个参数是一些配置// 默认是不对跨域资源做处理, 需要添加额外的配置 use…

绿色高效办公,华为云桌面不可或缺

在互联网高速发展的今天,互联网应用已经成为人们日常生活中不可或缺的一部分。随着网络技术的不断成熟,越来越多的人开始使用云桌面作为工作平台来满足自己对高效便捷工作的需求,而其中最为典型的就是企业内部远程协同办公系统。 那么什么是云…

InnoDB详解 (1)

文章目录1 InnoDB详解 (1)1 概念介绍2 页介绍1 页内部结构介绍1 File Header(文件头部)(38字节)2 File Trailer(文件尾部)(8字节)3 Free Space (空闲空间)4 U…

十、51单片机之步进电机

1、什么是步进电机 1.1、外观 1.2、概念 (1)步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此&am…

VSCode调试C/C++项目

最近写完了自己的操作系统,深感有一个方便的调试环境是有多么重要,能够提升不少开发效率。恰好最近在的技术交流群里群友在问如何搭建VSCode调试操作系统的环境,刚考完试,就先把这篇VSCode调试C/C的通用教程发出来,而后…

Hadoop综合项目——二手房统计分析(MapReduce篇)

Hadoop综合项目——二手房统计分析(MapReduce篇) 文章目录Hadoop综合项目——二手房统计分析(MapReduce篇)0、 写在前面1、MapReduce统计分析1.1 统计四大一线城市房价的最值1.2 按照城市分区统计二手房数量1.3 根据二手房信息发布…

全网首发“Java面试考点大全”,20+互联网公司,应有尽有

受疫情影响,今年似乎给人感觉时间比往年还要流逝得更快。显然,春节一过,我们又将迎来面试旺季金三银四。对于程序员来说,秋招的失利更意味着在金三银四要打一场“硬战”,可又有多少人做好了面试的准备呢?对…

Fabric.js 监听元素相交(重叠)

本文简介 点赞 关注 收藏 学会了 fabric.js 提供了一个方法可以检查对象是否与另一个对象相交(也可以叫元素是否重叠)。 这个方法叫 intersectsWithObject()。 本文主要想提一下 fabric.js 存在这么一个方便的方法。 检测元素是否相交有什么用呢&am…