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

volatile如何实际起作用?

班展
2023-03-14
问题内容

将变量标记为volatileJava中的变量可确保每个线程都能看到最后写入该变量的值,而不是一些过时的值。我想知道这是如何实现的。JVM是否发出冲洗CPU现金或其他东西的特殊指令


问题答案:

据我了解,它总是看起来好像写后缓存已被刷新,并且总是看起来好像是在读取时直接从内存中进行读取。这样做的结果是,一个线程将始终看到另一个线程的写入结果,并且(根据Java内存模型)永远不会看到缓存的值。但是,实际实现和CPU指令会因一种体系结构而异。

如果您在一个以上的线程中递增变量,或检查其值并采取某些措施,则不能保证正确性,因为显然没有实际的同步。通常,只有仅线程正在写入变量,而其他线程都正在读取时,才可以保证正确执行。

另请注意,可以将64位NON-
volatile变量作为两个32位变量进行读取/写入,因此32位变量在写入时是原子的,而64位变量则不是。可以先写入一半,然后读取的值可以是旧值或新值。

这是我书签中非常有用的页面:

http://www.cs.umd.edu/~pugh/java/memoryModel/



 类似资料:
  • 问题内容: 每当您尝试调用对象时,都会调用Python的magic方法。因此等于。 函数是Python中的一类对象,这意味着它们只是可调用的对象(使用)。但是,它本身是一个函数,因此它也具有,又具有自己的功能,又具有自己的功能。 因此,因此等于并再次等于等,依此类推。 这个无限循环如何结束?实际如何执行代码? 问题答案: 在幕后,Python中的所有调用都使用相同的机制,并且几乎所有调用都在CPy

  • 问题内容: 我想知道如何在JavaScript中处理国际化。我用谷歌搜索,但没有得到令人信服的答案: JavaScript是否具有对国际化的本地支持? JavaScript中的i18n是什么? 如何处理日历,货币,日期等? 我已经阅读过JavaScript中的Internationalization。 问题答案: 旧版浏览器中的本地化支持很差。最初,这是由于ECMAScript语言规范中的短语如下

  • 问题内容: 编译器或OS如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是原子的?两者都使用的程序具有相同的汇编代码。如何特别注意使操作原子化? 问题答案: 不是原子数据类型。仅仅是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。因此最好将其名称理解为“相对于信号处理而言是原子的”。 为了保证与信号处理程序之间的通信,仅需要原子数据类型的属性之一,即读取和更新将始终看

  • 问题内容: 我有一个Applet,它使用URLConnection通过HTTP连接加载图像。我正在为所有连接设置setUseCaches(true),但仍然看不到任何缓存行为。我图像的HTTP标头具有合理的缓存设置。如果您查看错误4528599,则有一个相当神秘的陈述: Java插件的当前版本(1.3.1)仅检查浏览器缓存中名称以.jar或.class结尾的文件。我被告知,对于Java Plug-

  • 问题内容: 例如,当我有这样的字符串时: 当我像这样使用SQL时: 服务器到达JDK时会发生什么?它会停止并执行SQL,还是遍历字符串的其余部分然后执行SQL? 当我在与OR连接的SQL语句中有多个LIKE子句时,还会发生什么情况?它可能时会在第一个LIKE子句处停止吗? 编辑:我有这样的SQL。这可能是矫kill过正,但值得一提…每个变量都包含一个表列的LIKE子句循环。它们之间有“或”。我是否

  • 问题内容: 首先,我要说我知道它是什么,做什么以及如何使用它。这个问题关系到它在引擎盖下的工作方式,我不希望出现“这就是如何用” 循环数组”的答案。 很长时间以来,我一直认为该方法可用于数组本身。然后,我发现了很多关于它可以与数组 副本 一起使用的事实的引用,从那时起,我一直以为这是故事的结尾。但是我最近对此事进行了讨论,经过一番实验后发现这实际上并非100%正确。 让我表明我的意思。对于以下测试