Java常见技术分享-16-多线程安全-并发编程的核心问题

并发编程的核心问题

可见性
  • 它指的是当一个线程修改了共享变量的值, 其他线程能立即看到这个修改。 常见的一个场景是 你更新一个文档, 别人可能得刷新后才能看到, 而如果没刷新 就看不到新值, 保障可见性 就是 确保 线程 就算"没刷新" 也能立即 看到更新后的值。
原子性
  • 它是指一个包含多个动作的操作, 要么 全部成功, 要么 完全不做, 不会被中途打断。 比如转账, 扣钱和加钱必须一起成功, 不能只扣不加。
有序性
  • 它是指 程序执行的顺序 与 程序代码编写 的顺序 一致。

问题出现的主要原因

可见性
  • CPU缓存架构(共享变量的值 存在 主存 和 线程自己的工作内存(备份), 线程读写变量优先操作工作内存, 而不是主存)
  • JVM内存模型优化(比如指令重排 , JVM会把 线程 修改共享变量同步主存 的操作 延迟进行, 导致其他线程查看这个共享变量就有问题)
原子性
  • 线程切换机制 (一个线程执行一个包含多个动作的操作 , 在完成所有动作期间, 线程被切换,CPU被其他的线程占用了,如果这个线程也会修改共享变量, 那就会出问题)
  • 非原子操作的拆分执行
有序性
  • 编译器优化 + CPU指令重排优化
相关推荐
nice_lcj5202 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河662 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
SL_staff3 小时前
从配置失效到逻辑复用:JVS-Logic 如何构建可治理的业务编排中枢
java·spring·产品
特立独行的猫A3 小时前
一份 Markdown 发十个平台:cspub 一稿多投
java·后端·python
文丑颜不良啊4 小时前
LeetCode1961~1980题目解析
java·leetcode
文丑颜不良啊4 小时前
LeetCode2001~2020题目解析
java·leetcode
用户3721574261355 小时前
Java 批量提取 Word 文档中的图片并保存到本地
java
SL_staff5 小时前
BI项目失败率90%?JVS如何用三阶闭环构建可落地的数据生产力平台
java·开源·全栈
nice_lcj5206 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐7 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang