Java面试时,线程为什么不安全?

作为一名资深程序员,以小编个人经验来看,在Java面试中,锁与并发编程是面试者的重灾区。不论是底层 synchronized 的原理,还是上层 JUC 包的使用,都是面试官喜欢重点深挖的领域。

线程为什么不安全?举个线程不安全的例子,讲解它的原理。

答:线程修改变量时,会将变量拷贝到本地内存,修改完成后,再写回主内存。这个过程中,如果多个线程同时访问并修改同一个数据,就会出现线程安全问题。

举个例子,主内存中的值为 0,线程 A 和线程 B 同时将这个值拷贝到本地内存。线程 A 对其 +1,线程 B 对其 -1。然后线程 A 将 1 写回主内存,线程 B 再将 -1 写回主内存。这时就出现了问题。对一个数据 +1 -1 之后得到的结果竟不是 0,而是 -1。

类似地,如果 B 线程先将 -1 写回主内存,A 线程再将 1 写回主内存。这时就可能得出错误结果 1。但大多数情况下不会出问题,只要一个线程操作完之后,第二个线程再进行操作。就能得出正确的结果 0。

相关推荐
jianqiang.xue12 分钟前
如何做好IT类的技术面试?
面试·职场和发展
ba_pi21 分钟前
springAI2.0接入mcp读取mysql
java·agent·spring ai
宸津-代码粉碎机28 分钟前
Java面试核心:JVM三大GC垃圾回收算法原理与生产场景落地分析
java·大数据·人工智能·python·spring
Ivanqhz30 分钟前
BPE(Byte Pair Encoding) 算法
java·服务器·网络·深度学习·神经网络
愛芳芳33 分钟前
Swagger2 多环境动态配置实战指南
java·后端·maven·springboot·swagger
huaweichenai37 分钟前
spring boot实现任务异步处理(队列)
java·spring boot
MZA66641 分钟前
实战:基于 XXL-JOB + 策略模式 + Nacos 配置化的 CSV 导出任务系统设计
java·spring boot·mybatis
邪修king1 小时前
Re:Linux 系统篇(二十九):动静态库Chapter2:动态库深度辨析 —— 核心本质、制作流程、双阶段查找模型与排错指南
android·java·linux·开发语言
泡海椒1 小时前
告别 iText 繁杂配置:jquick-pdf 极简 PDF 生成实战(零基础上手)
java·开发语言·pdf
Bs_MoneyMagnet5 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计