volatile怎么读(volatile)

导读 你们好,最近小活发现有诸多的小伙伴们对于volatile怎么读,volatile这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。1

你们好,最近小活发现有诸多的小伙伴们对于volatile怎么读,volatile这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。

1、 volatile原理:

2、 由关键字volatile修改的变量将被编译器和运行时注意到该变量是共享的,因此对该变量的操作将不会与其他内存操作一起重新排序。

3、 volatile的变量不会缓存在寄存器或者其他处理器看不到的地方,所以在读取volatile类型的变量时,总是会返回最新写入的值。

4、 当访问volatile变量时,不会执行锁定操作,所以执行线程不会被阻塞。因此volatile变量是一种比sychronized关键字更简单的同步机制。

5、 当读写非volatile变量时,每个线程首先将变量从内存复制到CPU缓存。如果计算机有多个CPU,每个线程可能在不同的CPU上处理。

6、 这意味着每个线程都可以复制到不同的CPU缓存中。

7、 声明的变量是volatile,JVM保证每次读取变量都是从内存中读取,跳过了CPU缓存这一步。

8、 volatile常用于Java并发编程中,以保持内存可见性,防止指令重新排序。

9、 内存可见性:所有线程都能看到共享内存的最新状态;防止指令重排:在基于偏序关系的先发生后存储模型中,指令重排技术大大提高了程序执行的效率。

10、 但也引入了一些问题。

11、 能见度:

12、 volatile维护内存可见性的特殊规则:读取、加载和使用动作必须连续出现;分配、存储和写入动作必须连续出现;每次读取前,必须从主存储器中刷新最新值;每次写入后,它必须立即同步回主存储器。

13、 换句话说,被关键字volatile修改的变量总是看到自己的最新值。线程1中变量v的最新修改对线程2是可见的。

14、 记忆障碍:

15、 volatile防止指令重排的策略:在每个volatile写操作前插入一个StoreStore屏障;在每个volatile写操作后插入一个StoreLoad屏障;在每次读取操作后插入一个负载负载屏障;在每个volatile读取操作后插入一个加载存储屏障。

16、 volatile性能:

17、 volatile的读性能消耗和普通变量差不多,但是写操作稍微慢一点,因为需要在本地代码中插入很多内存屏障指令来保证处理器不乱序执行。

以上就是volatile这篇文章的一些介绍,希望对大家有所帮助。

标签:

免责声明:本文由用户上传,如有侵权请联系删除!