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

可见性的解决方案

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

原子性的解决方案

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

有序性的解决方案

  • volatile 关键字。 他的作用是 禁止 编译器和CPU的指令排序优化,给多线程协作加上了顺序保障。
  • synchronized关键字, 因为同一个代码块只能被一个线程占用, 所以对于同一个代码块 不会有多线程协作, 也就不会有有序性的问题。 能确保指令重排后, 执行后的结果如预期一样。
相关推荐
Refrain_zc10 小时前
Android 音视频通话核心 —— 音频编码(AAC)完整解析
java
xiaoshuaishuai810 小时前
C# AvaloniaUI 资源找不到报错
java·服务器·前端·windows·c#
Xin_ye1008610 小时前
C# 零基础到精通教程 - 第十八章:部署与发布——让应用上线
开发语言·c#
我是唐青枫11 小时前
Java JdbcTemplate 实战指南:用 Spring 轻量完成数据库增删改查
java·数据库·spring
思麟呀11 小时前
C++11并发编程:call_once一次性执行+atomic原子类型+CAS无锁编程+自旋锁
linux·开发语言·jvm·c++·windows
Lumbrologist11 小时前
【C++】零基础入门 · 第 13 节:类与对象基础
java·c++·算法
码不停蹄的玄黓11 小时前
Java 生产者-消费者模型详解
java·开发语言·python
爱讲故事的11 小时前
操作系统第一讲复习:为什么学习操作系统,以及操作系统到底在做什么?
linux·开发语言·windows·学习·ubuntu·c#
笨蛋不要掉眼泪11 小时前
Java并发编程:Executors框架类深度解析
java·开发语言·并发
南极企鹅11 小时前
深入理解 MVCC:数据库并发控制的基石
java·数据库·mysql