JAVA内存模型与线程
导读
本文主要介绍JMM的工作原理,通过本文你可以了解到java中是如何使用JMM来协调线程工作的,然后作者会介绍关于线程的一些内容,在本文中不会对如何解决线程安全问题及锁进行过多介绍,这部分内容留到下一章节进行介绍。
一、计算机硬件工作原理
首先我们先来思考几个问题:
- 为什么现代计算机都往多任务处理去发展?
我们都知道,CPU的运算速度远大于其他的存储设备和通讯子系统,如果计算机仅仅是单任务工作,那么当一个任务在进行大量的IO操作时,此时CPU只能等着不能干别的事情,如果有多任务,CPU将不会等待,直接切换到其它任务上去工作,从而提高的计算机的工作效率。 - 计算机是如何解决CPU与内存速度上的差异?
我们都知道计算机可以有多个CPU核心,但是主内存只有一个(逻辑上一块),解决CPU和内存的速度差异,需要在CPU于主内存之间加入高速缓存,这种缓存的速度与CPU的运算速度相当,下面笔者通过一张图来描述一个数据是如何从内存中读到CPU中计算,和CPU中计算后的数据如何写到内存中。
从图中可以看到,使用高速缓存虽然解决了CPU与内存之间速度上的差异问题,但是使用缓存难免会带来数据一致性的问题,那么计算机是如何解决高数换的数据一致性问题呢?接下来跑出第三个思考 - 计算机是如何解决缓存一致性问题?
我们一起思考一下,如果上图中第一颗cpu计算结果20没有从高速缓存中同步到主内存时,第二颗cpu从主存中加载到的a这个变量仍然是10,这样就很不合理,计算机在高速缓存和内存之间的通讯需要遵循一定的协议