一、cache line概念
在计算机的内部,数据的存储基本都是有三级缓存的。最靠近CPU的存储组件是寄存器,cpu需要的数据以及指令集都是暂时放在寄存器中。当需要磁盘中的数据时就会通过缓存,一级一级的访问,而访问的最小单元就是cache line,cache line的大小是64字节。也就是说cache每次运输数据,会运输64个字节大小的数据。
二、测试
当只有一个属性x时,两个线程操作的数据(X,Y)会放在同一个cache line里面,而关键字volatile又是线程可见,当其中一个线程改变了值,另一个线程会同步这个改变的值(保证缓存一致性),频繁的进行拉取数据,导致效率不高。
当有多个属性时达到64字节的时候,两个线程操作的数据不会放在同一个cache line,不需要互相的同步。效率就很高了。
public class CacheLineD {
private static class T{
// long的数据类型占有8个字节
//private long x1,x2,x3,x4,x5,x6,x7;
public volatile long x = 0;
}
public static T[] arr = new T[2];
static {
arr[0] = new T();
arr[1] = new T();
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
for(long i = 0; i< 1000_0000L; i++) {
arr[0].x = i;
}
});
Thread t2 = new Thread(() -> {
for(long i = 0; i< 1000_0000L; i++) {
arr[1].x = i;
}
});
long start = System.currentTimeMillis();
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(System.currentTimeMillis() -start);
}
}
三、结果
在同一个cache line里面执行的时间是220毫秒。
不在一个cache line里面执行的时间是90毫秒。