Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java volatile是否阻止或涉及上下文切换?_Java_Multithreading_Concurrency - Fatal编程技术网

Java volatile是否阻止或涉及上下文切换?

Java volatile是否阻止或涉及上下文切换?,java,multithreading,concurrency,Java,Multithreading,Concurrency,起初我认为volatile变量比synchronized关键字好,因为它不涉及阻塞或上下文切换。但我现在对阅读感到困惑 volatile是否使用低级别原子锁以非阻塞方式实现?确实,volatile不会导致阻塞 然而,声明 volatile变量比synchronized关键字好,因为它没有 包括阻塞或上下文切换 这是一个很有争议的问题,很大程度上取决于你想做什么volatile不等同于锁,声明变量volatile不能保证涉及该变量的操作的原子性,例如增量 volatile的作用是防止编译器和/或C

起初我认为volatile变量比synchronized关键字好,因为它不涉及阻塞或上下文切换。但我现在对阅读感到困惑


volatile是否使用低级别原子锁以非阻塞方式实现?

确实,
volatile
不会导致阻塞

然而,声明

volatile变量比synchronized关键字好,因为它没有 包括阻塞或上下文切换

这是一个很有争议的问题,很大程度上取决于你想做什么
volatile
不等同于锁,声明变量volatile不能保证涉及该变量的操作的原子性,例如增量

volatile
的作用是防止编译器和/或CPU对特定变量执行指令重新排序或缓存。这就是所谓的记忆栅栏。需要这种令人讨厌的小机制来确保在多线程环境中,所有读取特定变量的线程都有其值的最新视图。这称为可见性,不同于原子性

在一般情况下,只能通过使用锁(
synchronized
)或原子原语来保证原子性

然而,令人困惑的是,使用同步机制也会产生隐式内存隔离,因此如果只在
synchronized
块中读/写变量volatile,那么声明变量volatile是多余的

volatile是使用低级别原子锁以非阻塞方式实现的还是没有

Volatile的实现在每个处理器之间有所不同,但它是一个非阻塞字段加载/存储-它通常通过内存围栏实现,但也可以通过缓存一致性协议进行管理

我刚读了那篇文章。这张海报在他对Volatile和Synchronized flow的解释中实际上是不正确的,有人将他更正为评论。Volatile不会持有锁,您可能会看到Volatile存储类似于同步释放,Volatile负载类似于同步获取,但这只涉及内存可见性,而不是实际的实现细节

volatile是使用低级别原子锁以非阻塞方式实现的还是没有


使用
volatile
会在相关字段周围建立一个内存屏障。这不会导致线程进入“阻塞”状态。但是,当访问
volatile
字段时,程序必须刷新对中央内存的更改并更新高速缓存,这需要周期。它可能会导致上下文切换,但不一定会导致上下文切换。

Volatile
是一种java语言修饰符,它如何提供保证取决于
JVM
实现。简单地说,如果您将一个基本字段设置为volatile,则可以保证无论哪个线程读取该字段,它都将读取最新的值。它基本上禁止任何JVM幕后优化,并强制所有线程跨越内存屏障来读取volatile原语。

阻塞意味着线程在读取相同的
volatile
变量时不会互相等待,而不会相互排斥。但是,它们会触发在硬件级别设置围栏,以观察“之前发生”语义(无内存重新排序)

为了更清楚地说明这一点,
volatile
变量是非阻塞的,因为每当多个线程同时读取它时,绑定到它们的线程的CPU核都会直接与主内存通信,或者通过CPU缓存一致性(取决于硬件/JVM实现)进行通信,并且没有锁定机制

上下文切换
volatile关键字不会从其语义触发上下文切换本身,但它是可能的,并且取决于较低级别的实现。

我要问的是实现细节,JVM默认实现中的幕后情况。我已经知道了什么。:)JVM附带了一个规范,有很多实现:。您可以查看Hotspot JVM的C代码,但您真的想这样做吗?这些保证对你来说还不够吗?jdk库中的任何本机方法也是如此,我从来没有看过我安装的Hotspot JVM上的c代码,但我知道它可以/不能为我做什么,这在大多数情况下都有很好的文档记录。我没有阅读那篇文章中的注释。最好的错误答案必须在那里编辑。:)吸取的教训:不要把StackOverflow作为最后一个词。@chrisapotek是的,有时候很不幸,OP是唯一能回答正确或不正确问题的人。公众压力导致这家伙转向更好的答案。这就是说,在适当的上下文中给出答案总是一个好主意。谢谢约翰,@chrisapotek。可能需要编辑您的问题以指出这一点。