Java常见技术分享-17-多线程安全-并发编程的核心问题的解决方案

可见性的解决方案

  • volatile 关键字(只能修饰变量)。 他的作用是 告诉JVM 这个变量不允许被缓存, 每次读写必须直接操作主内存。 这样 就能保证 没有缓存一致性的问题。
  • synchronized 关键字。 在进入代码块的时候 ,线程会读取主内存的变量值到自己的工作内存, 在执行完操作后, 又会写到主内存中,这样其他的线程就能立即看到。

原子性的解决方案

  • synchronized关键字, 把需要执行原子操作的代码块锁住, 就行了, 因为这个关键字 本身是互斥锁。
  • 使用AtomicInteger 原子类,这个类是靠CPU 的CAS指令 来确保原子性的,即乐观锁(核心思想 先尝试,失败了再重试)的底层实现,且实现方式是自旋锁, 所以在竞争激烈的时候,线程一直占用着CPU资源, 很耗费CPU资源, 不如用synchronized

有序性的解决方案

  • volatile 关键字。 他的作用是 禁止 编译器和CPU的指令排序优化,给多线程协作加上了顺序保障。
  • synchronized关键字, 因为同一个代码块只能被一个线程占用, 所以对于同一个代码块 不会有多线程协作, 也就不会有有序性的问题。 能确保指令重排后, 执行后的结果如预期一样。
相关推荐
码智社1 小时前
JSON 零基础到资深全体系教程
java·json
峥嵘life1 小时前
Android WiFi 热点 Channel 信道 和 Frequency 频率 转换总结
android·开发语言
wgego2 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-8超速判断(C++语言实现)
开发语言·数据结构·c++·算法
机建狂魔3 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
山峰哥3 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
乐观的Terry3 小时前
11、发布系统-用户认证与权限体系
java·spring boot·spring·spring cloud·mybatis
前端开发张小七3 小时前
Java 学习笔记 · 第二课:面向对象核心(封装、继承、多态)及接口与异常
java·后端·程序员
wangjialelele3 小时前
Selenium4 + Java Web自动化测试入门指南:从环境搭建到常用操作详解
java·开发语言·前端·测试工具·自动化
Awna3 小时前
Golang 大小写可见性规范
开发语言·后端·golang