JAVA并发编程(3):并发编程中的内存可见性问题
内存可见性问题
常见的CPU架构如图所示,当一个线程操作共享变量时,首先将该变量从主内存中读取到自己的工作内存(L1,L2 Cache),处理完之后,再将变量写回到主内存中。
现在假设有一个共享变量X,值为0,线程A首先获取变量X的值,由于L1,L2 Cache都没有命中,将从主内存中加载变量X到L2,L1 Cache中,然后将变量X的值改写为1,并写入到L1,L2 Cache以及主内存中,到目前为止,都没有问题,
然后线程B也获取变量X的值,B的L1 Cache没有命中,但在L2 Cache中命中了(A写入的),并将X加载到B的L1 Cache,B将X改写为2,并将X写回到L1,L2 Cache以及主内存中,到目前为止仍然没有问题,
随后,A又需要修改X的值,其在L1缓存中命中了X,但X=1,这时问题出现了,B线程已将X修改为2,但线程A获取的仍然是1,这就是多线程并发中的内存不可见问题,即一个线程写入的值对其他线程不可见。
java中的volatile关键字就是为了解决共享变量的内存不可见问题,当一个变量被声明为volatile时,线程在写入该变量时,不会将该变量缓存在寄存器或缓存中,而是会直接写入到主内存中;线程在读取该变量时,会直接从主内存获取值,而不是从缓存中,这样就保证了一个线程写入volatile变量,其他线程能够获取到最新值,从而解决内存不可见问题。