在作爲JSR166的一部分引入的類中,作者使用所謂的填充來填充Striped64.Cell類的單個值字段。爲什麼jsr166e.Striped64.Cell類中值域的額外填充值?
這裏是一個類的摘錄:
/**
* Padded variant of AtomicLong supporting only raw accesses plus CAS. The value field is placed
* between pads, hoping that the JVM doesn't reorder them.
* <p/>
* JVM intrinsics note: It would be possible to use a release-only form of CAS here, if it were
* provided.
*/
static final class Cell {
volatile long p0, p1, p2, p3, p4, p5, p6;
volatile long value;
volatile long q0, q1, q2, q3, q4, q5, q6;
...
筆者然後使用CAS原子地修改值。
在Striped64類中,作者還使用不安全來訪問兩個其他字段,但不應用任何此類填充。
我的問題是:爲什麼需要做這樣的事情,引入14個冗餘字段填充單個值字段?
感謝您的回答。我認爲這是正確的,但爲什麼額外的q0 ... q6作爲p0..p6 +值的總體大小已經是64字節,這在我的理解中完全適合單個緩存行?是否容納實現更長緩存行的其他體系結構? – silkentrance
@silkentrance它將使用2個緩存行。如果你只有p0,p1,p6的值,那麼你最終可能會在一個高速緩存行上使用p0-p6,其他數據和另一行上的值以及其他數據。 – assylias