volatile原理知道吗?

程序员 2024-9-14 09:47:40 79 0 来自 中国
相⽐synchronized的加锁⽅式来办理共享变量的内存可⻅性题目,volatile就是更轻量的选择,他没有上
下⽂切换的额外开销本钱。使⽤volatile声明的变量,可以确保值被更新的时间对其他线程⽴刻可⻅。
volatile使⽤内存屏蔽来包管不会发⽣指令重排,办理了内存可⻅性的题目。
我们知道,线程都是从主内存中读取共享变量到⼯作内存来操纵,完成之后再把效果写会主内存,但是
如许就会带来可⻅性题目。举个例⼦,假设现在我们是两级缓存的双核CPU架构,包罗L1、L2两级缓
存。
1. 线程A⾸先获取变量X的值,由于最初两级缓存都是空,以是直接从主内存中读取X,假设X初始值为
0,线程A读取之后把X值都修改为1,同时写回主内存。这时间缓存和主内存的环境如下图。
1.png 2. 线程B也同样读取变量X的值,由于L2缓存已经有缓存X=1,以是直接从L2缓存读取,之后线程B把X
修改为2,同时写回L2和主内存。这时间的X值⼊下图所示。
那么线程A如果再想获取变量X的值,由于L1缓存已经有x=1了,以是这时间变量内存不可⻅题目就
产⽣了,B修改为2的值对A来说没有感知。
那么,如果X变量⽤volatile修饰的话,当线程A再次读取变量X的话,CPU就会根据缓存⼀致性协议逼迫
线程A重新从主内存加载最新的值到⾃⼰的⼯作内存,⽽不是直接⽤缓存中的值。
再来说内存屏蔽的题目,volatile修饰之后会加⼊差异的内存屏蔽来包管可⻅性的题目能精确执⾏。这⾥
写的屏蔽基于书中提供的内容,但是现实上由于CPU架构差异,重排序的战略差异,提供的内存屏蔽也
不⼀样,⽐如x86平台上,只有StoreLoad⼀种内存屏蔽。
1. StoreStore屏蔽,包管上⾯的平凡写反面volatile写发⽣重排序
2. StoreLoad屏蔽,包管volatile写与后⾯大概的volatile读写不发⽣重排序
3. LoadLoad屏蔽,禁⽌volatile读与后⾯的平凡读重排序
4. LoadStore屏蔽,禁⽌volatile读和后⾯的平凡写重排序
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 02:27, Processed in 0.182392 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表