2017-06-02 34 views
0

USE CASE:使用DB中的最後一個保存的ID(不是從零開始)創建AtomicSequence,並在上次保存在db中的id後生成id。 首先,我們檢查AtomicSequence實例是否存在,如果不是我們從最後保存的id創建AtomicSequence(如果條目在db中)。使用Hazelcast的原子序列

HazelcastAtomicSequenceManager getSequenceGenerator方法是兩步過程。

第1步:getHzInstance()。getAtomicLong(key)。 //如果不存在則創建一個新值爲0的初始值。 第2步:this.sequence.compareAndSet(0,startVal); //如果初始值爲零,則設置值。

現在考慮線程1來檢查並看到給定鍵的AtomicSequence不存在,並執行stpe1仍然沒有執行第2步。 線程2來看看AtomicSequence創建(由於步驟1由線程1執行)並繼續增加到1.由於線程2沒有執行步驟2,因此初始值仍然爲零。 現在線程1將嘗試執行步驟2,但是由於初始值變爲1或不等於零,所以無法執行。所以原子序列會從下一個1生成id,而不是從上次保存id開始,因此我們的測試用例失敗了。 任何方式來解決這個問題

回答

-1

您需要獲得並嘗試compareAndSet在一個循環,直到成功爲止:

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

+0

我認爲這個問題是原子序列應該從開始我認爲它應該支持公共IAtomicLong getAtomicLong(字符串名稱,長initVal,布爾創建) –

+0

我明白你的需要。你的意思是IAtomicLong getAtomicLong(String name,long initVal)。是的,如果可以擴展API以提供初始值,可以討論它。你可以在github回購中爲此打開一個問題。 –

+0

我已經創建了一個issue.Please找到下面的鏈接https://github.com/hazelcast/hazelcast/issues/10696 –