美文网首页js css html
volatile原理知道吗?

volatile原理知道吗?

作者: 嘘寒问暖 | 来源:发表于2022-04-16 21:43 被阅读0次

相⽐synchronized的加锁⽅式来解决共享变量的内存可⻅性问题,volatile就是更轻量的选择,他没有上

下⽂切换的额外开销成本。使⽤volatile声明的变量,可以确保值被更新的时候对其他线程⽴刻可⻅。

volatile使⽤内存屏障来保证不会发⽣指令重排,解决了内存可⻅性的问题。

我们知道,线程都是从主内存中读取共享变量到⼯作内存来操作,完成之后再把结果写会主内存,但是

这样就会带来可⻅性问题。举个例⼦,假设现在我们是两级缓存的双核CPU架构,包含L1、L2两级缓

存。

1. 线程A⾸先获取变量X的值,由于最初两级缓存都是空,所以直接从主内存中读取X,假设X初始值为

0,线程A读取之后把X值都修改为1,同时写回主内存。这时候缓存和主内存的情况如下图。

线程A读取数据

2. 线程B也同样读取变量X的值,由于L2缓存已经有缓存X=1,所以直接从L2缓存读取,之后线程B把X

修改为2,同时写回L2和主内存。这时候的X值⼊下图所示。

那么线程A如果再想获取变量X的值,因为L1缓存已经有x=1了,所以这时候变量内存不可⻅问题就

产⽣了,B修改为2的值对A来说没有感知。

线程B读取数

那么,如果X变量⽤volatile修饰的话,当线程A再次读取变量X的话,CPU就会根据缓存⼀致性协议强制

线程A重新从主内存加载最新的值到⾃⼰的⼯作内存,⽽不是直接⽤缓存中的值。

再来说内存屏障的问题,volatile修饰之后会加⼊不同的内存屏障来保证可⻅性的问题能正确执⾏。这⾥

写的屏障基于书中提供的内容,但是实际上由于CPU架构不同,重排序的策略不同,提供的内存屏障也

不⼀样,⽐如x86平台上,只有StoreLoad⼀种内存屏障。

1. StoreStore屏障,保证上⾯的普通写不和volatile写发⽣重排序

2. StoreLoad屏障,保证volatile写与后⾯可能的volatile读写不发⽣重排序

3. LoadLoad屏障,禁⽌volatile读与后⾯的普通读重排序

4. LoadStore屏障,禁⽌volatile读和后⾯的普通写重排序

相关文章

  • volatile原理知道吗?

    相⽐synchronized的加锁⽅式来解决共享变量的内存可⻅性问题,volatile就是更轻量的选择,他没有上 ...

  • 互联网JAVA面试常问问题(三)

    一、volatile原理和使用场景 volatile 原理 volatile变量进行写操作时,JVM会向处理器发送...

  • volatile学习

    目录:1.volatile是什么2.volatile的作用3.volatile的原理4.volatile与sync...

  • Java并发机制底层实现原理-volatile

    章节目录 volatile的实现原理与应用 1.volatile的实现原理与应用 Java source code...

  • 并发编程艺术-2

    本篇文章主要介绍并发的底层实现原理:volatile , synchronized, 原子操作。 volatile...

  • volatile与synchronized的区别

    一、volatile volatile的原理在java中,被volatile声明的关键字,jvm会在翻译的时候在c...

  • java并发(二):深入分析volatile实现原理

    volatile的原理实现可以看这篇文章,真的是从硬件层面上说明了volatile怎样保证可见性。volatile...

  • JAVA线程安全之volatile

    volatile volatile原理是基于CPU内存屏障(Memory Barrier)指令实现的; 如果一个变...

  • volatile原理

    计算机内存模型 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由...

  • volatile原理

    通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volat...

网友评论

    本文标题:volatile原理知道吗?

    本文链接:https://www.haomeiwen.com/subject/sfzhertx.html