当前位置: 首页 > 面试题库 >

在Java4和Java5中使用volatile关键字

许明朗
2023-03-14
问题内容

volatile keyword从java4和java5开始使用时有什么区别?

与此相关的是

当非原子变量(长/双)被声明为volatile时,它们的读/写操作是原子的。

这对于Java4 还是 正确的, 或者 从Java5开始有效????


问题答案:

人们回答了我回答第一部分的问题时提供了好的观点和参考。

具体到问题的第二部分,我在某个论坛上阅读过:

volatile声明的long是原子的(也是Java
5之前的版本),在某种意义上说,它保证(对于所有JVM实现)直接对主内存(而不是两个32位寄存器)进行读取或写入。

在Java 5之前的版本中,volatile认为
可以提供长久的保证。但是,在实践中事​​情并没有以这种方式解决,并且实现经常违反此保证。我记得这个问题似乎已经在JDK
1.4上解决了,但是由于他们仍在处理整个内存模型,因此直到JDK 5宣布新规则和内存时,他们才真正发表任何明确的声明。保证实际上意味着什么。

这是来自 Java语言规范第二版的

17.4双原子和长原子的非原子处理

即使变量的类型是double或long,对volatile变量的加载,存储,读取和写入操作也是原子的。



 类似资料:
  • 问题内容: 我读过“ 何时在Java中使用’volatile’? ”,但我仍然感到困惑。我怎么知道何时应该将变量标记为volatile?如果我弄错了,或者在需要的东西上省略了挥发物,或者在不需要的东西上放置了挥发物,该怎么办?确定多线程代码中哪些变量应该是易变的,有什么经验法则? 问题答案: 当你想让一个多线程访问一个成员变量但不需要复合原子性(不确定这是否是正确的术语)时,基本上就可以使用它。

  • 本文向大家介绍Java中的volatile关键字,包括了Java中的volatile关键字的使用技巧和注意事项,需要的朋友参考一下 volatile修饰符用于让JVM知道访问该变量的线程必须始终将其自身的变量私有副本与内存中的主副本合并。 访问易失性变量将同步所有在主存储器中缓存的变量副本。可变变量只能应用于对象类型或私有类型的实例变量。易失性对象引用可以为null。 示例

  • 一、Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的。 Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量(这些变量是从主内存中拷贝而来)。线程对变量的所有操作(读取,赋值)都必须在工作内存中进行。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通

  • 我知道关于volatile有很多问题,但我只是被讨论搞糊涂了:Java:volatile如何保证这段代码中“数据”的可见性? 我读过的每个网站都说可以在缓存中存储一个变量(使这个值对于其他线程不可见),我甚至发现了这个例子https://dzone.com/articles/java-volatile-keyword-0 所以我的第一个问题是:Java是否在缓存中存储变量值(在哪个缓存中?l1 l

  • 本文向大家介绍解析java中volatile关键字,包括了解析java中volatile关键字的使用技巧和注意事项,需要的朋友参考一下 在java多线程编程中经常volatile,有时候这个关键字和synchronized 或者lock经常有人混淆,具体解析如下: 在多线程的环境中会存在成员变量可见性问题: java的每个线程都存在一个线程栈的内存空间,该内存空间保存了该线程运行时的变量信息,当线

  • 问题内容: 今天的工作中,我遇到了volatileJava中的关键字。不太熟悉,我找到了这种解释。 鉴于该文章详细解释了所讨论的关键字,您是否曾经使用过它,或者是否曾见过可以正确使用此关键字的情况? 问题答案: volatile具有内存可见性的语义。基本上,volatile字段的值对所有读取器(尤其是其他线程)可见,在该字段上完成写操作之后。没有volatile,读者可能会看到一些未更新的值。 要