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

并发编程的核心问题

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

问题出现的主要原因

可见性
  • CPU缓存架构(共享变量的值 存在 主存 和 线程自己的工作内存(备份), 线程读写变量优先操作工作内存, 而不是主存)
  • JVM内存模型优化(比如指令重排 , JVM会把 线程 修改共享变量同步主存 的操作 延迟进行, 导致其他线程查看这个共享变量就有问题)
原子性
  • 线程切换机制 (一个线程执行一个包含多个动作的操作 , 在完成所有动作期间, 线程被切换,CPU被其他的线程占用了,如果这个线程也会修改共享变量, 那就会出问题)
  • 非原子操作的拆分执行
有序性
  • 编译器优化 + CPU指令重排优化
相关推荐
皮皮林5513 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河3 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程6 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅8 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者8 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺8 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart10 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP11 小时前
MyBatis-mybatis入门与增删改查
java
孟陬14 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端