博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存行 伪共享
阅读量:4166 次
发布时间:2019-05-26

本文共 895 字,大约阅读时间需要 2 分钟。

public class LongAdder extends Striped64 implements Serializable {    private static final long serialVersionUID = 7249069246863182397L;    public LongAdder() {    }    public void add(long x) {        Cell[] as; long b, v; int m; Cell a;        // ...    }

 

@sun.misc.Contended static final class Cell {        volatile long value;        Cell(long x) { value = x; }        final boolean cas(long cmp, long val) {            return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val);        }        // ...}

ConcurrentHashMap中用Contended注解自动对CounterCell来进行填充:每个CounterCell记录了对应Node的键值对数目。这样每次计算size时累加各个CounterCell就可以了

ConcurrentHashMap中CounterCell以数组形式保存,而数组在内存中是连续存储的,CounterCell中只有一个long类型的value属性,这样CPU会缓存CounterCell临近的CounterCell,于是就形成了伪共享。

总结

  1. CPU缓存是以缓存行为单位进行操作的。产生伪共享问题的根源在于不同的核同时操作同一个缓存行。
  2. 可以通过填充来解决伪共享问题,Java8 中引入了@sun.misc.Contended注解来自动填充。
  3. 并不是所有的场景都需要解决伪共享问题,因为CPU缓存是有限的,填充会牺牲掉一部分缓存。

转载地址:http://zwgxi.baihongyu.com/

你可能感兴趣的文章
ps、grep和kill联合使用杀掉进程
查看>>
openfire中的mina框架使用
查看>>
去掉Windows Messager的自动登录
查看>>
dspace可以检索中文了
查看>>
利用Eclipse编辑中文资源,配置文件
查看>>
将中文转为unicode 及转回中文函数
查看>>
《程序员》专访金蝶:是谁不相信国产软件?
查看>>
debian的gnome下的xmms乱码解决方案
查看>>
实习日记
查看>>
ln中符号链接与硬链接的区别
查看>>
solr cloud zk管理
查看>>
使用HBase Indexer建立二级索引(整合最新版本的HBase1.2.6及Solr 7.2.1)
查看>>
CentOS7 安装 VirtualBox5.2.8启动系统是出错
查看>>
SLF4j多个log4j2的实现类导致日志生成不了
查看>>
Quartz定时调度CronExpression配置格式说明与实例
查看>>
UIViewController的生命周期
查看>>
NSDate 使用
查看>>
iPhone数据存储及持久化
查看>>
NSString字符串常用操作
查看>>
IPhone中SQLite3的使用
查看>>