-
RAM(Random Access Memory):(redis是在这一层做的
随机存储器,俗称内存,我们常说的电脑内存8g,指的就是这个(也不完全正确)。RAM要求每时每刻都不断地供电,否则数据会丢失。它由半导体材料制作,是计算机的工作场所。 -
ROM(Read Only Memory):
只读存储器,应用于硬盘存储。一般由磁性材料制作,用来存放暂时不用的信息,只有加载到内存(RAM)中才能被CPU处理。即CPU与硬盘不发生直接的数据交换。 -
Cache (高速缓冲存储器)
Cache介于CPU与RAM之间,是一个读写速度比RAM更快的存储器。当CPU向RAM中写入或读出数据时会同步存储进Cache中,当CPU再次需要这些数据时,CPU就从Cache读取数据,而不是访问较慢的内存,如需要的数据在Cache中没有,CPU会再去读取Cache中的数据。
访问速度
Cache>>RAM>>ROM
知识关联(volatile)
Java中的关键字volatile,在多线程中,具有可见性,但不具备原子性,就与Cache和RAM有关(其实共享变量都有关)。
假如同时有两个线程对同一字段进行读写,有时候读的是Cache中的,有的时候读的是RAM中的,两者未能完全同步,如下面代码:
三个线程对同一字段执行增加操作,最后的值应该是3000。
public class ThreadTest implements Runnable {
public static volatile int sum = 0;
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
new Thread (new ThreadTest (),"线程:"+i).start ();
}
}
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
sum++;
}
System.out.println (Thread.currentThread ().getName ()+":"+sum);
}
}
执行结果:
最后的结果小于30000,这就是因为三个线程在获取sum的值得时候,本应该去Cache中获取的,但是Cache非常小,马上就消失了,需要去RAM中获取,这时两者未能完成同步就造成了这种小于30000的情况。