私のCHMにはすでに次のデータが含まれています - >
1 りんご
2 バナナ
3 猫
4 犬
1,2,3,4 がキーで、Apple、バナナ... が対応するキーです。
3 つのスレッド t1、t2、t3 が同じ既存のレコードを変更したい場合 [3 Cat] 。この書き込みは FIFO 順で必要です。[その後、いくつかの操作が実行されます。Ex 値の変化パターンを記録するログ] 既存のソース コードを確認したところ、FIFO 書き込みが保証されていません。ソース コード ロックはセグメントに対して実行されます。以下はCHMクラスのソースコードです
static final class Segment<K,V> extends ReentrantLock implements Serializable {
Segment(float lf, int threshold, HashEntry<K,V>[] tab) {
this.loadFactor = lf;
this.threshold = threshold;
this.table = tab;
}
// .... Rest of Code
}
セグメント クラスは、公平なロック メカニズムを提供しない ReentrantLock の Default コンストラクターを呼び出します。
public ReentrantLock() {
sync = new NonfairSync();
}
新しい CHM クラスを作成し、次の変更を加えた場合
Segment(float lf, int threshold, HashEntry<K,V>[] tab) {
super(true);
this.loadFactor = lf;
this.threshold = threshold;
this.table = tab;
}
super(true) は、次の ReEntrantLock のコンストラクターを呼び出します
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
これにより、サグメント ロック操作が公平になり、書き込み操作が FIFO 順で実行されるようになると思います。あなたの見解を提案してください。