Java 并发可见性
Java concurrency visibility
我对 java 中的可见性有疑问。可见性只有在我们至少有两个线程时才会出现,其中 运行 在至少 2 cpu 个核心上。是吗?每个核心都可以在其寄存器和缓存内存中缓存变量,因此可能会出现可见性问题。但是如果我们有 n 个线程并且它们都 运行 在一个 cpu 核心中怎么办(当然,我们不能确定它们会 运行 只在 1 个核心上,但假设它是有可能实现这一目标),而不是没有办法获得内存可见性?或者这是不对的?
提前致谢。
即使在 1 个核心 运行 多个线程上,您仍然会遇到您所说的这个 "visibility" 问题,因为已将值从内存加载到寄存器的线程会将此值保存到该线程的堆栈,如果线程关闭然后再次打开,将看不到更新除非变量/内存被声明volatile
如果可见性是指共享内存,那么在一个线程中创建或更改的对象可能在另一个线程中可见,那么无论有多少核,可见性都将保持不变。 Java 根据 Java Language Specification, specifically the Java Memory Model 作出承诺,无论有多少核心都必须遵守。
But what if we have n threads and they all run in one cpu core (of couse, we can not be sure that they will run on only 1 core, but assume that it is possible to achieve that), than there is no way to have memory visibility ? Or this is not right ?
是的,如果一个核心上有 n 个线程 运行,可见性(共享内存)仍然存在。但无论有多少核心,都存在一些警告。主要是每个线程都有自己的缓存内存,并且变量在两个线程中可能具有不同的值。如果变量是 volatile
,那么该变量的值将始终在所有线程中更新。
A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable (§17.4).
我建议您阅读更多有关 Java 内存模型的内容。
我对 java 中的可见性有疑问。可见性只有在我们至少有两个线程时才会出现,其中 运行 在至少 2 cpu 个核心上。是吗?每个核心都可以在其寄存器和缓存内存中缓存变量,因此可能会出现可见性问题。但是如果我们有 n 个线程并且它们都 运行 在一个 cpu 核心中怎么办(当然,我们不能确定它们会 运行 只在 1 个核心上,但假设它是有可能实现这一目标),而不是没有办法获得内存可见性?或者这是不对的? 提前致谢。
即使在 1 个核心 运行 多个线程上,您仍然会遇到您所说的这个 "visibility" 问题,因为已将值从内存加载到寄存器的线程会将此值保存到该线程的堆栈,如果线程关闭然后再次打开,将看不到更新除非变量/内存被声明volatile
如果可见性是指共享内存,那么在一个线程中创建或更改的对象可能在另一个线程中可见,那么无论有多少核,可见性都将保持不变。 Java 根据 Java Language Specification, specifically the Java Memory Model 作出承诺,无论有多少核心都必须遵守。
But what if we have n threads and they all run in one cpu core (of couse, we can not be sure that they will run on only 1 core, but assume that it is possible to achieve that), than there is no way to have memory visibility ? Or this is not right ?
是的,如果一个核心上有 n 个线程 运行,可见性(共享内存)仍然存在。但无论有多少核心,都存在一些警告。主要是每个线程都有自己的缓存内存,并且变量在两个线程中可能具有不同的值。如果变量是 volatile
,那么该变量的值将始终在所有线程中更新。
A field may be declared volatile, in which case the Java Memory Model ensures that all threads see a consistent value for the variable (§17.4).
我建议您阅读更多有关 Java 内存模型的内容。