Java原子操作和volatile优化

系统总线

在介绍Java原子操作是如何实现之前,先来看下计算机组成中的系统总线。
https://blog.csdn.net/liujiuxiaoshitou/article/details/72800991

这里写图片描述

上面这张图描述的是单总线结构,这也是最简单的一种总线结构,我们发现CPU、主存、设备接口、都接在一根总线上面,这就导致,一个设备占用总线之后,其他设备无法在总线进行数据传输。

这里写图片描述

这张图是多总线结构,由于分了多条总线,这就使得一条总线上的设备在传输信号,不一定会干扰到另一条总线上的设备进行信号传输,提高了系统的效率。

总线锁

当多个处理同时对同享变量进行读写改操作的时候,那么这个时候可以通过总线锁,只让一个处理器对该资源进行修改,在没有总线锁的情况下,比如i++操作,先获取到i的值,然后再对i+1,这个时候,可能多个处理器获取到同一个i,然后i++,当回写的时候,多次写程对同一个i+1,这就导致执行完n次i++之后,比预期的结果要小。

缓存锁

通过缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时由两个以上处理器修改缓存内存区域数据。通过对缓存行的锁定,也能保证原子操作。
参考:https://www.cnblogs.com/mengheng/p/3491092.html

volatile使用优化

对于经常要写入缓存的操作,考虑到缓存锁会影响写入的效率,我们采用如下办法对其进行优化。对于i7,酷睿等处理器,高速缓存行是64字节,不支持部分填充缓存行,这也就意味着,当队列大小不足64字节的时候(引用结点),这个时候,有可能会把头结点和尾结点读取到同一个缓存行中,那么当一个处理器锁定缓存行之后,其他处理器进行入队和出队操作的时候,就必须排队等待,这就影响了程序的执行效率,这个时候,就有人将队列的结点增加空属性来修改成64字节。这就可以使得你在操作某个结点的时候,其他处理器不需要排队等待缓存锁的释放。

猜你喜欢

转载自blog.csdn.net/qq_25956141/article/details/81807280
今日推荐