JMM
JMM对共享内存的操作做出了如下两条规定:
- 线程对共享内存的所有操作都必须在自己的工作内存中进行,不能直接从主内存中读写;
- 不同线程无法直接访问其他线程工作内存中的变量,因此共享变量的值传递需要通过主内存完成。
可见性问题
在多线程应用程序中,线程对非易失性变量(non-volatile variables)进行操作,出于性能原因,每个线程在处理变量时会将变量从主内存复制到CPU缓存中。如果您的计算机包含多个CPU,每个线程可能运行在不同的CPU上。这意味着,每个线程可以将变量复制到不同CPU的CPU缓存中。
假设两个或多个线程访问一个共享对象,该对象包含如下声明的计数器变量:
public class SharedObject {
public int counter = 0;
}