2017-06-02 7 views
0

使用例:DBに最後に保存されたID(ゼロから始まらない)を使用してAtomicSequenceを作成し、最後に保存したIDの後にidを生成します。 まず、AtomicSequenceインスタンスがあるかどうかをチェックします。エントリがない場合は、最後に保存されたIDからAtomicSequenceを作成します(エントリがdbの場合)。ヘーゼルキャストを使用するアトミックシーケンス

HazelcastAtomicSequenceManagerでは、getSequenceGeneratorメソッドは2段階の処理です。

ステップ1:getHzInstance()。getAtomicLong(key)。 //存在しない場合は取得し、初期値が0の新しいものを作成します。 ステップ2:this.sequence.compareAndSet(0、startVal); //初期値がゼロの場合は値を設定します。

今すぐチェックして、指定されたキーのAtomicSequenceが存在しない参照してstpe1を実行し、まだ来ステップ2. スレッド2を実行していなかったとAtomicSequenceが作成された参照来るスレッド1を考える(ステップ1は、スレッド1で実行されると)スレッド2がステップ2を実行しなかったので、初期値は依然としてゼロです。 スレッド1はステップ2を実行しようとしますが、初期値が1になったり、ゼロに等しくなったりすることができません。したがって、atomicsequenceは1から次のidを生成します。代わりに、最後のsave idから開始する必要があります。このため、テストケースが失敗しています。それが成功するまで 任意の方法は、

答えて

-1

はあなたが取得し、ループ内でのcompareAndSetを試してみる必要がある。この問題を修正するには:

 long current; 
 
     do { 
 
      current = atomicLong.get(); 
 
     } while (!atomicLong.compareAndSet(current, startVal));

+0

私は問題から開始する必要がアトミック・シーケンスだと思います最後に保存されたid.スレッドが0に初期化されている場合、初期値は1に初期化されます。これはpublic IAtomicLong getAtomicLong(String name、long initVal、boolean create)をサポートする必要があると思われます –

+0

私はあなたの必要性を理解しています。あなたはIAtomicLong getAtomicLong(String name、long initVal)を意味しましたか?はい、APIを拡張して初期値を提供できるかどうかについて議論することができます。あなたはgithub repoでこれに関する問題を開くことができます。 –

+0

私は既に1つの問題を作成しました。下記のリンクをご覧ください。https://github.com/hazelcast/hazelcast/issues/10696 –

関連する問題