在书“ The Art of Multiprocessor Programming”中,您可以在第84页上找到AtomicMRSWRegister Java类。
在本书的figure 4.13中,作者作了对角书写,如图4.12的32行所示:a_table[i][i] = value;
。
但是在本书的errata中,他们说应该改为a_table [ 0 ][ i ] = value;
,在这种情况下,它不会对角书写。这与figure 4.13中的诊断文字相矛盾。
那是怎么回事?
public class AtomicMRSWRegister<T> implements Register<T> {
ThreadLocal<Long> lastStamp;
private StampedValue<T>[][] a_table; // each entry is SRSW atomic
public AtomicMRSWRegister(T init, int readers) {
lastStamp = new ThreadLocal<Long>() {
protected Long initialValue() { return 0; };
};
a_table = (StampedValue<T>[][]) new StampedValue[readers][readers];
StampedValue<T> value = new StampedValue<T>(init);
for (int i = 0; i < readers; i++) {
for (int j = 0; j < readers; j++) {
a_table[i][j] = value;
}
}
}
public T read() {
int me = ThreadID.get();
StampedValue<T> value = a_table[me][me];
for (int i = 0; i < a_table.length; i++) {
value = StampedValue.max(value, a_table[i][me]);
}
for (int i = 0; i < a_table.length; i++) {
a_table[me][i] = value;
}
return value;
}
public void write(T v) {
long stamp = lastStamp.get() + 1;
lastStamp.set(stamp);
StampedValue<T> value = new StampedValue<T>(stamp, v);
for (int i = 0; i < a_table.length; i++) {
a_table[i][i] = value;
}
}
}
图4.12 AtomicMRSWRegister类:从以下位置构造的原子MRSW寄存器 原子SRSW寄存器。