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

并发编程的核心问题

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

问题出现的主要原因

可见性
  • CPU缓存架构(共享变量的值 存在 主存 和 线程自己的工作内存(备份), 线程读写变量优先操作工作内存, 而不是主存)
  • JVM内存模型优化(比如指令重排 , JVM会把 线程 修改共享变量同步主存 的操作 延迟进行, 导致其他线程查看这个共享变量就有问题)
原子性
  • 线程切换机制 (一个线程执行一个包含多个动作的操作 , 在完成所有动作期间, 线程被切换,CPU被其他的线程占用了,如果这个线程也会修改共享变量, 那就会出问题)
  • 非原子操作的拆分执行
有序性
  • 编译器优化 + CPU指令重排优化
相关推荐
程序员黑豆6 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年7 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148118 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
小席是个热心肠8 小时前
AI相关的自我学习
java·人工智能·学习
知无不研10 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
数智化管理手记10 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_291411 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统12 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
C++ 老炮儿的技术栈12 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐