当前位置: 首页 > 知识库问答 >
问题:

volatile在Java中的确切含义和作用?[重复]

阎鹏
2023-03-14

问题来源于BufferedInputStream为什么要将字段复制到局部变量,而不是直接使用该字段。

其中一个ansers提到了“volatile”关键字:

“此外,它被声明为volatile,这意味着如果任何线程更改变量的值,此更改将立即反映在所有其他线程中。”

这似乎表明,如果一个变量没有被声明为volatile,那么“更改将立即反映在所有其他线程中”或“变量的更改将只在以后反映”的情况就不会发生。

问题:

(a) 这种理解正确吗?(b) 如果是这样的话,那么更改何时应用/暴露于其他线程?

共有1个答案

江育
2023-03-14

Java易失性关键字用于将变量/字段标记为存储在主存储器中,更准确地说,每次访问变量时,都会将其读写到主存储器中,而不是从/到CPU缓存。

在一个典型的多线程应用程序中,当许多线程启动时,它们可能会将一个非可选变量从主存复制到CPU缓存,因此每个线程都有自己的变量副本,这主要是出于性能原因。考虑到这一点,无法保证JVM将从主内存读回或写回非易失性变量状态。

volatile关键字保证用此修饰符标记的变量将被写入计算机主存。

 类似资料:
  • 问题内容: 我是JAVA的新手,因此遇到了这个词。“在方法内部创建的类,在Java中称为本地内部类。如果要调用本地内部类的方法,则必须在方法内部 实例化 该类”。粗体字。任何人都可以帮我解决这个问题。我知道这很尴尬,我应该做更多的研究,但我只是不明白。谢谢。 问题答案: 首先 声明的意思是 : 实例化的 简单含义 是从class创建一个对象 。 什么是物体? 类的实例。从一个类中,我们可以创建许多

  • 所以我得到了我想理解的代码,但我不知道这个操作符的含义: 如果你们能告诉我就太棒了谢谢

  • 我是Java的初学者,简单的东西对我来说是新的。除我的水平外,谷歌不想搜索这样的关键词,比如“- 我在这里找到的。所以我认为这个代码是正确的。 请帮助我理解这个表达是什么意思?

  • 问题内容: 我想在同一类对象的各种实例之间共享一个对象。 从概念上讲,在我的程序运行时,类A的所有对象都访问类B的相同对象。 我已经看到这是系统范围的,不鼓励使用它。这是否意味着如果我在实例化类A的对象的同一JVM上运行另一个程序,则这些对象可能会访问与先前程序中访问的对象相同的B对象? 使用静态字段的一般缺陷是什么? 是否有其他选择(不需要大量的实施工作)? 问题答案: 静态不是完全意味着“由所

  • (...)当您在非托管环境中使用JmsTemplate时,您可以通过使用属性SessionTransact和SessionAccountingEmode来指定这些值(事务和确认模式)。 当您将PlatformTransactionManager与JmsTemplate一起使用时,模板总是被赋予一个事务性JMS会话。(..) (顺便说一句,这是真的--会话是事务性的) 我调试了它不正确的原因,发现:

  • 这两天我一直在和Git Bash合作。我现在知道了诸如、、、和等基本操作。但我还是不知道Git Bash本身到底是什么! 我已经搜索了很多关于Git Bash的内容,但是我看到的所有站点都集中在它的命令的功能上。我仍然没有为我的问题找到一个好的答案。现在,我想,我在正确的地方得到这个答案!