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

并发编程的核心问题

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

问题出现的主要原因

可见性
  • CPU缓存架构(共享变量的值 存在 主存 和 线程自己的工作内存(备份), 线程读写变量优先操作工作内存, 而不是主存)
  • JVM内存模型优化(比如指令重排 , JVM会把 线程 修改共享变量同步主存 的操作 延迟进行, 导致其他线程查看这个共享变量就有问题)
原子性
  • 线程切换机制 (一个线程执行一个包含多个动作的操作 , 在完成所有动作期间, 线程被切换,CPU被其他的线程占用了,如果这个线程也会修改共享变量, 那就会出问题)
  • 非原子操作的拆分执行
有序性
  • 编译器优化 + CPU指令重排优化
相关推荐
秋田君3 分钟前
Qt_QMediaPlayer类与QMediaPlaylist类
开发语言·qt
专注仿真4 分钟前
Vapor框架构建及Swift for TensorFlow图像分析
java·其他
逃逸线LOF5 分钟前
Spring的AOP简介
java·后端·spring
统计学小王子9 分钟前
数学建模国赛倒计时6天——《软件工具(R语言精讲)》
开发语言·数学建模·r语言
砚底藏山河10 分钟前
【量化纯GET实战 #21】用 pandas 做分析:把接口数据变成 DataFrame
java·python·金融·maven·pandas
C++ 老炮儿的技术栈11 分钟前
Qt5 使用 QPainter 绘制阿基米德螺线
开发语言·c++·windows·qt·代码化
EasyGBS19 分钟前
从接入到稳定播放:无插件直播H5视频流媒体播放器EasyPlayer.js如何撑起Web端流媒体
开发语言·前端·javascript
FfHUCisI21 分钟前
GMP 调度器:Go 并发的心脏是如何跳动的
开发语言·golang·php
Zzzzmo_24 分钟前
Spring MVC
java·spring·mvc·cookie/session
cfm_291427 分钟前
Spring核心设计模式
java·spring·设计模式