我理解通知编译器值可能会被更改,但是为了完成这个功能,编译器是否需要引入一个内存栅栏来使其工作呢? 从我的理解来看,对易失性对象的操作顺序是不能重新排序的,必须保留。这似乎暗示了一些记忆栅栏是必要的,实际上没有办法绕过这一点。我这样说对吗? 在这个相关的问题上有一个有趣的讨论 乔纳森·韦克利写道: ...对不同volatile变量的访问不能由编译器重新排序,只要它们出现在单独的完整表达式中...没
我目前正试图研究并发性,特别是“volatile”关键字。 通过声明计数器变量为volatile,所有对计数器变量的写入都将立即写回主存。此外,计数器变量的所有读取都将直接从主存中读取。下面是计数器变量的volatile声明的外观 和 当线程写入易失性变量时,不仅易失性变量本身会被写入主内存。此外,线程在写入易失性变量之前更改的所有其他变量也会刷新到主内存中。当一个线程读取一个易失性变量时,它还将
按照标准,哪个编译器是正确的?
首先,我知道volatile不会使多个操作(如)成为原子操作。这个问题是关于单个读或写操作的。 我最初的理解是,volatile只是执行了一个内存屏障(即其他线程将能够看到更新的值)。 现在我已经注意到JLS第17.7节说volatile还提供了一个读取或写入原子。例如,给定两个线程,两个线程都将不同的值写入,那么x最终将恰好表示其中一个值。 我很好奇这怎么可能。在一个32位系统上,如果两个线程并
如果有一个写入线程和一个读取线程,我们仍然可以有一个具有易失性变量的竞争条件。就像下面的代码一样,在一种情况下,编写线程检查x值为零,没有发生上下文切换,读取线程也看到x值为0。在一种情况下,写入线程检查x的值为零,递增1,将其刷新到主存储器(因为x是易失性的),发生上下文切换,读取线程将x的值视为1。我只是想知道在这个用例中,挥发性是否足够,或者我们需要使用同步来避免竞争条件 我试过执行下面的代
Joe Albahari有一个很棒的多线程系列,这是必读的,任何做C#多线程的人都应该熟记于心。 然而,在第4部分中,他提到了volatile的问题: 请注意,应用volatile并不能阻止先写后读的交换,这可能会产生脑筋急转弯。Joe Duffy用下面的例子很好地说明了这个问题:如果Test1和Test2同时在不同的线程上运行,那么a和b的值都可能为0(尽管在x和y上都使用volatile) 然
我一直在浏览JCIP,作者说。。 线程限制的一种特殊情况适用于可变变量。对共享的易失性变量执行读-修改-写操作是安全的,只要您确保该易失性变量仅从单个线程写入 例如,实例计数被认为是一个复合操作(读取值,向其添加一个值,并更新值),声明计数为易失性不会使此操作原子化,因此线程安全在这里得不到保证!!我说得对吗??但是在这里,作者说如果我们确保只从单个线程写入易失性变量,我们就可以修复它。我不明白这
我试图理解Java的关键字,关于在具有CPU缓存的多线程程序中写入易失性原子变量。 我已经阅读了一些教程和Java语言规范,特别是关于“订购前发生”的第17.4.5节。我的理解是,当一个线程将一个新值写入一个可变变量时,更新后的值必须对读取该变量的其他线程可见。对我来说,这些语义可以通过以下两种方式之一实现: > 线程可以在CPU缓存中缓存易失性变量,但对缓存中变量的写入必须立即刷新到主内存。换句
实现原子操作,因为java volatile保证发生在关系之前? 我之前读过关于volatile的报道: 如果线程A写入一个易挥发变量,线程B随后读取相同的易挥发变量,那么线程A在写入易挥发变量之前可见的所有变量,在线程B读取易挥发变量后也将可见。 现在,我有两个变量: 现在我有两个线程,一个只写给他们,先写给m_x,再写给m_y;另一个,只从他们那里读,先读m_y,然后,m_x。 我的问题是:写
根据: http://www.ibm.com/developerworks/library/j-jtp03304/ 在新的内存模型下,当线程A写入易失性变量V,线程B从V读取时,在写入V时对A可见的任何变量值现在都保证对B可见 互联网上的许多地方声明以下代码永远不应该打印“错误”: 当为1时,所有线程的应为1。 然而,我有时会打印“错误”。这怎么可能呢?
我有一个关于规则之前发生的波动的问题,同样的问题也符合监控规则。根据volatile规则,volatile写入发生在任何后续读取之前。 下面是一个易失性写入和正常后续读取的示例。据我所知,这种易失性写操作应该有一个store-store内存屏障,可以刷新正常的存储到内存,以便其他进程可以看到它(根据DougLea关于JSR-133内存模型的烹饪书)。 所以我的问题是:是否还有一个额外的发生在规则之
我正在尝试实现LZ77的快速版本,我有一个关于并发编程的问题要问你。 现在我有一个和一个,两者的长度相同。该程序执行以下操作: > 主线程写入所有缓冲区,然后通知线程并等待它们完成。 单个工作线程处理缓冲区的一部分,并将结果保存在结果保持器的同一部分中。工人部分是排他性的。之后,主线程会收到通知,工作人员会暂停。 当所有的工作都暂停时,主线程读取结果持有器中的数据并更新缓冲区,然后(如果需要)过程
我有一个Spring bean类,看起来类似于以下内容: ConfigFileLoader.loadConfigFromFile()从文件中读取配置并返回一个新的Config对象。 有两种类型的线程: 更新程序线程: 只有一个 它定期调用updateConfig(当它检测到配置文件上的更改时) 多个线程正在使用Config对象调用getConfig以执行 只要最终读卡器线程开始获取最新的配置对象,
我在一个并发编程课上有一个考试。这门课结构相当好,但我觉得我对“易失性”关键词的理解一定没有我想象的那么好。我已经通读了其他关于它是如何工作的帖子,这似乎是有意义的,但是我对Java整体的理解限制了我。这些是练习题,有人介意回答它们并解释为什么它们是真的或假的吗?我已经把我最好的猜测和解释 A.____Anint变量计数在几个线程之间共享,其中计数的唯一操作是读取其值并将其递增。将计数标记为易挥发
我想写一个简单的线程安全类,可以用来设置或获取整数值。 最简单的方法是使用synchronized关键字: 我也可以尝试使用挥发性: 带有易失性关键字线程安全的类吗? 考虑下面的事件顺序: 线程A将该值设置为5 根据Java语言规范 “1”发生在“3”之前 但我不明白“1”怎么会出现在“2”之前,所以我怀疑“1”不会出现在“2”之前。 我怀疑线程C的读数可能是7或5。我认为带有volatile关键