对于非挥发性VAR的顺序线程运行,可以保证可见性



我已经阅读了以下参考文献:

http://tutorials.jenkov.com/java-concurrency/volatile.html

https://www.geeksforgeeks.org/volatile-keyword-in-java/

https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

但是,我仍然不清楚以下情况下的预期行为是什么:

  1. 我有一个线程池,将线程重复使用。
  2. 我有一个非挥发性var,该var是由线程池的不同线程访问的。
  3. 线程是按顺序运行的。(是的,它们可以在一个线程中运行。但是,仅针对这种情况。

我不清楚的部分。我是否仍然需要挥发性来确保下一个线程执行可见上一个线程中所做的更改。

喜欢Java Flash线程在每次执行后是否将本地缓存到内存?

,线程是否在每个执行之前重新加载本地缓存?

它一直抱怨有未引用的代码部分。所以,我必须这样做。请帮助修复。

Java内存模型设计可以回答您的问题:在Java存储器模型中,一个挥发性字段在写入后插入了一个商店屏障,并且在读取它之前插入了负载屏障。班级合格的最终字段在初始化后插入了商店屏障,以确保在对象引用时构造函数完成后可见这些字段。

请参阅https://dzone.com/articles/memory-barriersfences

换句话说:当线程试图从挥发性var jmm读取时,所有CPU都拥有该内存区域,以从本地CPU的缓存中回到内存中。然后,如果需要,CPU将其值加载到本地缓存。

我不清楚的部分。我是否仍然需要挥发性来确保下一个线程执行可见上一个线程中所做的更改。

是,否。挥发性关键字仅用于使其他线程可见的可变值。但是,如果您目前只需要一个线程读写= =您需要同步。如果您需要仅提供可见度=挥发性关键字就足够了。

如果您不使用挥发性关键字,而是通过线程共享值,则可能不会是最新的甚至损坏的。对于长型Java,Do 2用32bits写作,它们不是原子。假设另一个线程可以读取这两个写入之间的值。

螺纹是否依次运行,如果您不使用挥发性关键字,则没有可见性保证。这意味着不能保证其他线程会看到最新的副本,因为该线程可能会从寄存器中读取值。

最新更新