http://preshing.com/20120913/acquire-and-release-semantics/
在现代多核多级缓存的处理器架构下,当一个cpu修改了其缓存的一个数据单元,主内存是如何感知,其他cpu又是如何感知的呢?
目标,cpu内存模型最主要分两种内存模型
强内存模型和弱内存模型,两者的主要区别在于是否允许cpu对主内存的修改即时可见,以及是否允许编译器内存访问指令重排序,目前大多cpu架构采 用弱模型,非即时可见,允许内存访问指令重排序。
如下图:
线程对共享变量的访问,并非直接访问共享内存,而是访问共享内存的一份copy,这份copy我们称它为工作内存(工作内存是概念上的区域,可以是寄存器上、cpu缓存、或者主内存,看具体的虚拟机实现及运行时优化)。
l working memory
线程访问实例变量、静态变量、数据对象元素(除局部变量和参数之外)都通过访问各自工作内存copy
线程的工作内存之间是不可见
线程之间变量的传递通过主内存
既然在多线程下的内存模型类似于cpu->cpu缓存->主内存的三级模型,那么同样也存在上面内存共享的问题。换句话说同样存在以下问题:
ü 一个线程在操作一个共享变量时,不受其它线程干扰(原子性)
ü 一个线程改变了一个共享变量,其它线程如何及时看到(可见性)
ü 如何保证多个线程有序地去操作共享变量(有序性)