(在单CPU的情况下)为了理解volatile——我知道volatile强制线程使用主内存,并且不会将副本保留在其本地内存中。
在一篇StackOverFlow帖子中,我看到java线程使用CPU缓存,而使用volatile则会强制使用主内存
线程缓存和Java内存模型。
如果是这种情况,那么应该没有内存可见性的问题,因为一个线程可以看到其他线程写的值(假设在单个核心CPU上,我们将有单个缓存)。
首先,易失性不会强制线程使用主存。它会强制线程表现得好像它们被迫使用主存一样。这很重要,因为实际使用主存会让现代系统的运行速度慢到爬行状态。幸运的是,这绝对不会发生。
其次,CPU实际拥有多少核并不重要。单核CPU可以完美地模拟双核CPU,如果JVM实现愿意,它可以自由地这样做。执行某种形式的同步是Java语言的要求,与硬件无关——Java的一个要点是,您不必担心这一点。
所有的中断函数都能正常工作,但是过程函数却让我很生气。 我会感激任何我没注意的把戏。
在阅读了这个问题和这个(尤其是第二个答案)之后,我对volatile及其关于记忆障碍的语义感到非常困惑。 在上面的例子中,我们写入一个易失性变量,这会导致一个mitch,这反过来会将所有挂起的存储缓冲区/加载缓冲区刷新到主缓存,使其他缓存行无效。 然而,非易失性字段可以优化并存储在寄存器中,例如?那么,我们如何才能确保给定一个写入易失性变量之前的所有状态变化都是可见的呢?如果我们有1000件东西呢
我已经阅读了许多相互矛盾的信息(msdn,SO等),关于易失性和VoletleRead(ReadAcquireFence)。 我理解这些限制的内存访问重新排序含义——我仍然完全搞不清楚的是新鲜度保证——这对我来说非常重要。 msdn doc用于挥发性提及: (…)这样可以确保字段中始终存在最新的值。 挥发性字段的msdn文档提到: 对易失性字段的读取称为易失性读取。易失性读取具有“获取语义”;也就
来自C/C++,我对Java中的volatile对象行为有点困惑。 null faik,volatile意味着b引用的“book对象”应该在主内存中。编译器可能在内部实现引用作为指针,因此b指针可能位于缓存中。我的理解是,volatile是对象的限定符,而不是引用/指针的限定符。 问题是:在使用方法中,本地引用不是易失性的。这个“本地”引用会不会把底层的Book对象从主存带到缓存中,实质上使对象不
问题内容: 如何使数组易失?因为正如我所了解的那样,使数组易失是不安全的吗? 问题答案: 将数组声明为volatile并 不能 对其字段进行volatile访问。您是在声明引用本身是可变的,而不是元素。 换句话说,你声明 挥发性组 的元素,而不是一个 集易挥发元素 。 解决方案是在要使用整数的情况下使用。另一种方法(但有点难看)是每次您编辑字段时都将对数组的引用重写。 您可以这样做: (就像我说的
谢谢,伊利亚