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

并发编程的核心问题

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

问题出现的主要原因

可见性
  • CPU缓存架构(共享变量的值 存在 主存 和 线程自己的工作内存(备份), 线程读写变量优先操作工作内存, 而不是主存)
  • JVM内存模型优化(比如指令重排 , JVM会把 线程 修改共享变量同步主存 的操作 延迟进行, 导致其他线程查看这个共享变量就有问题)
原子性
  • 线程切换机制 (一个线程执行一个包含多个动作的操作 , 在完成所有动作期间, 线程被切换,CPU被其他的线程占用了,如果这个线程也会修改共享变量, 那就会出问题)
  • 非原子操作的拆分执行
有序性
  • 编译器优化 + CPU指令重排优化
相关推荐
We....2 小时前
Java SPI 机制
java·开发语言
Macbethad2 小时前
区块链技术在分布式系统中的应用实践技术报告
开发语言·c#
海南java第二人2 小时前
Java无锁并发编程:volatile+CAS原子类深度解析
java·cas·volatile
毕设源码-邱学长2 小时前
【开题答辩全过程】以 人才培养方案调查系统为例,包含答辩的问题和答案
java·eclipse
零雲2 小时前
Java面试:@Component和@Bean的区别是什么
java·开发语言·面试
Jerry404_NotFound3 小时前
工厂方法模式
java·开发语言·jvm·工厂方法模式
一起养小猫3 小时前
【探索实战】Kurator统一流量治理深度实践:基于Istio的跨集群服务网格
java·云原生·istio
微风欲寻竹影3 小时前
深入理解Java中的String
java·开发语言
Coder_Boy_3 小时前
基于SpringAI的智能平台基座开发-(二)
java·人工智能·springboot·aiops·langchain4j