JavaDriver JavaDriver
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

YoungAnn

西二旗Java老司机一枚 致力于社会主义添砖Java
首页
  • 基础
  • 并发
  • JVM
  • 设计模式
  • 计算机网络
  • 操作系统
  • 数据结构
  • 算法
  • MYSQL
  • REDIS
  • Netty
  • Kafka
系统设计
非技术
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础

  • 并发

    • 线程池是如何实现的?
    • 简述 CAS 原理,什么是 ABA 问题,怎么解决?
    • 简述 Synchronized,Volatile,可重入锁的不同使用场景及优缺点
    • Synchronized 与 Lock 相比优缺点分别是什么?
    • 重入锁是如何实现的?
    • volatile 关键字解决了什么问题,它的实现原理是什么?
      • Java中的内存可见性
      • Volatile 的实现原理
    • 简述 Java 锁升级的机制
    • 简述 Java AQS 的原理以及使用场景
    • 什么是公平锁?什么是非公平锁?
    • Java 的线程有哪些状态,转换关系是怎么样的?
    • Java 是如何实现线程安全的,哪些数据结构是线程安全的?
    • 手写死锁
    • 为什么我们不能直接调用 run() 方法?
    • Java 线程有哪些常用方法?
    • 手写生产者消费者模型
    • ThreadLocal 实现原理是什么?为什么要使用弱引用?
  • JVM

  • 设计模式

  • Java相关
  • 并发
YoungAnn
2022-04-04
目录

volatile 关键字解决了什么问题,它的实现原理是什么?

volatile 能保证 Java 中的内存可见性。 可见性的意思是:当线程A修改共享变量的值后,线程B能立刻读到这个修改后的值。

Volatile 不会引起线程上下文的切换和调度,如果使用的恰当,会比 Synchronized 执行成本更低。

# Java中的内存可见性

  • 可见性:一个线程对共享变量值的修改,能够及时被其他线程看到。

  • 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那这个变量就是这几个线程的共享变量。

  • Java内存的规定:

-线程对共享变量的所有操作都必须在自己的工作内存中进行,不可直接从主内存中读写; -不同线程之间无法直接访问其他线程工作内存中的变量,线程间的变量值的传递需要通过主内存。

# Volatile 的实现原理

如果对用 Volatile 修饰的变量写操作,JVM 会向处理器发出一条 Lock 前缀的指令,Lock 前缀的指令在多核处理器下会引发两件事情:

  1. 将当前处理器缓存行的数据写会到系统内存

  2. 这个写会内存的操作会使其他缓存中的该内存地址的数据无效

编辑 (opens new window)
上次更新: 2022/05/19, 21:26:01
重入锁是如何实现的?
简述 Java 锁升级的机制

← 重入锁是如何实现的? 简述 Java 锁升级的机制→

最近更新
01
电商-商品系统设计
12-17
02
关于如何写OKR
12-09
03
对事不对人 vs 对人不对事
12-09
更多文章>
Theme by Vdoing | Copyright © 2022-2023 YoungAnnn | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式