如何分析Volatile变量

50次阅读
没有评论

共计 1217 个字符,预计需要花费 4 分钟才能阅读完成。

今天就跟大家聊聊有关如何分析 Volatile 变量,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

    在程序设计中,尤其是在 C 语言、C++、C# 和 Java 语言中,使用 volatile 关键字声明的变量或对象通常拥有和优化和(或)多线程相关的特殊属性。通常,volatile 关键字用来阻止(伪)编译器对那些它认为变量的值不能“被代码本身”改变的代码上执行任何优化。在 C 环境中,volatile 关键字的真实定义和适用范围经常被误解,加之 C ++、C# 和 Java 都从 C 中神秘地“继承”了 volatile,在这些编程语言中,因此这些语言中 volatile 的用法和语义大相径庭。

    Java 也支持 volatile 关键字,但它被用于其他不同的用途。当 volatile 用于一个作用域时,Java 保证如下:

   1.(适用于 Java 所有版本)读和写一个 volatile 变量有全局的排序。也就是说每个线程访问一个 volatile 作用域时会在继续执行之前读取它的当前值,而不是(可能)使用一个缓存的值,直接从主存中读取,避免编译器优化。(但是并不保证经常读写 volatile 作用域时读和写的相对顺序,也就是说通常这并不是有用的线程构建)。

   2.(适用于 Java5 及其之后的版本)volatile 的读和写建立了一个 happens-before 关系,类似于申请和释放一个互斥锁。

      这时,联想到的另一个关键词便是 synchronized. 可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这个段代码。当两个并发线程访问同一个对象 object 中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问 object 的一个加锁代码块时,另一个线程仍然可以访问该 object 中的非加锁代码块。

    因此,两个关键词的区别如下:

1.volatile 本质是在告诉 jvm 当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized 则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

2.volatile 仅能使用在变量级别;synchronized 则可以使用在变量、方法、和类级别的。

3.volatile 仅能实现变量的修改可见性,并能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。

4.volatile 不会造成线程的阻塞;synchronized 可能会造成线程的阻塞。 

5.volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化。

看完上述内容,你们对如何分析 Volatile 变量有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计1217字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)