0

私の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 順で実行されるようになると思います。あなたの見解を提案してください。

4

0 に答える 0