False Sharing问题(2)

如果避免频繁的false sharing造成的性能损耗:

PaddedLong

1
2
3
public static class PaddedLong {
public long value = 0, p1, p2, p3, p4, p5, p6;
}

PaddedAtomicLong

1
2
3
4
5
6
7
8
9
10
11
public class PaddedAtomicLong extends AtomicLong {
public PaddedAtomicLong() {
super();
}
public PaddedAtomicLong(final long initialValue) {
super(initialValue);
}
public volatile long p1, p2, p3, p4, p5, p6 = 7;
}

为何是插入7个long

一般而言cache line是64byte,而每个Java对象都有一个2word(2*4byte)的对象头,而long本身是8byte。

PaddedLong的应用

一般是用在频繁读写的情况下,可以参考之后的OneToOne队列的优化文章