根据: http://www.ibm.com/developerworks/library/j-jtp03304/ 在新的内存模型下,当线程A写入一个易失性variablesV,并且线程B从V读取时,在写入V时A可见的任何variables值现在保证对B可见 在互联网上的许多地方声明下面的代码不应该打印“错误”: public class Test { volatile static private int a; static private int b; public static void main(String [] args) throws Exception { for (int i = 0; i < 100; i++) { new Thread() { @Override public void run() { int tt = b; // makes the jvm cache the value […]
我知道volatile告诉编译器该值可能会改变,但是为了完成这个function,编译器是否需要引入一个内存栏来使其工作? 根据我的理解,易失性对象的操作顺序不能重新sorting,必须保留。 这似乎意味着一些记忆栅栏是必要的,并没有真正的解决方法。 我说得对吗? 在这个相关的问题上有一个有趣的讨论 乔纳森·Wakely写道 : …对独立的volatilevariables的访问不能被编译器重新sorting,只要它们出现在单独的完整expression式中…正确的说,volatile对于线程安全来说是没有用处的,但不是出于他给出的原因。 这不是因为编译器可能会重新访问易失性对象,而是因为CPU可能会对它们进行重新sorting。 primefaces操作和内存屏障阻止了编译器和CPU重新sorting David Schwartz 在评论中回应: …从C ++标准的angular度来看,编译器在做某些事情和编译器发出的指令之间没有什么区别,这些指令会导致硬件做某些事情。 如果CPU可能将访问重新sorting为挥发性物质,则标准不要求保留其顺序。 … … C ++标准对重新sorting的内容没有任何区别。 而且你不能争辩说,CPU可以重新sorting它们没有可观察到的效果,所以没关系 – C ++标准定义它们的顺序是可观察的。 如果编译器生成的代码使平台达到标准所要求的水平,则编译器在平台上符合C ++标准。 如果标准要求访问挥发性物质不被重新sorting,那么重新sorting的平台不符合标准。 … 我的观点是,如果C ++标准禁止编译器重新sorting访问不同的挥发性物质,理论上这种访问的顺序是程序可观察行为的一部分,那么它也要求编译器发出禁止CPU执行的代码所以。 该标准并没有区分编译器的function和编译器的生成代码使CPU做什么。 这产生了两个问题:他们中的任何一个是“正确的”? 实际的实现真的在做什么?
我读了一些关于volatile关键字的文章,但我无法弄清楚它的正确用法。 你能告诉我应该在C#和Java中使用什么?
AtomicBoolean做了什么,一个易变的布尔无法实现?
阅读JSR-133编译器编写者手册,了解易失性的实现,特别是“与primefaces指令的交互”部分。我假设读取一个易失性variables而不更新它需要一个LoadLoad或一个LoadStore的障碍。 再往下看,LoadLoad和LoadStore在X86 CPU上是无效的。 这是否意味着可以在x86上执行易失性读操作而不显示caching失效,并且像正常variables读取一样快(不考虑volatile的重sorting约束)? 我相信我不明白这一点。 有人能照顾我吗? 编辑:我不知道在多处理器环境中是否有差异。 在单CPU系统上,CPU可能会看它自己的线程caching,正如John V.指出的那样,但是在多CPU系统中,CPU必须有一些configuration选项,这是不够的,主存必须被命中,使得volatile变慢在多CPU系统上,对吗? PS:在我学习更多关于这个的方法中,我偶然发现了以下很棒的文章,因为这个问题可能对别人很有趣,所以我会在这里分享我的链接: Java理论与实践:修复Java存储模型,第1部分和 Java理论与实践:修复Java内存模型,第2部分
所以我正在阅读这本题为“ 实践中的Java并发”的书,我被困在这样一个我不能理解的例子中。 这是引用: 当线程A写入一个易失性variables,然后线程B读取同一个variables时,写入易失性variables之前A对A可见的所有variables的值在读取volatilevariables后对B变得可见。 有人能给我一个反例,说明为什么“在写入易失variables之前A对A可见的所有variables的值在B读完易失variables后变为可见”? 我很困惑,为什么在读取volatilevariables之前,所有其他的非易失性variables都不能被B看到?
在C ++ 11标准中,机器型号从单线程机器变成了multithreading机器。 这是否意味着典型的static int x; void func() { x = 0; while (x == 0) {} } static int x; void func() { x = 0; while (x == 0) {} } static int x; void func() { x = 0; while (x == 0) {} }优化出读的例子将不再发生在C + + 11? 编辑:对于那些不知道这个例子(我很惊讶),请阅读: https : //en.wikipedia.org/wiki/Volatile_variable […]
可能重复: C ++:何时有易变的关键字曾帮助你? 我从来没有使用过,但我想知道为什么人们使用它? 它究竟做了什么? 我search了论坛,我发现它只有C#或Java主题。
volatile关键字有什么作用? 在C ++中,它解决了什么问题? 就我而言,我从来不知道需要它。
如果有两个线程访问一个全局variables,那么很多教程都会说variables是volatile的,以防止编译器将这个variablescaching在一个寄存器中,从而不能正确更新。 然而,两个线程都访问一个共享variables是通过互斥体来保护的东西,不是吗? 但是在这种情况下,在线程locking和释放互斥体之间,代码是在一个只有一个线程可以访问variables的关键部分,在这种情况下,variables不需要是易失性的? 那么在multithreading程序中volatile的用途和用途是什么呢?