使用Hazelcast的原子序列

时间:2017-06-02 14:18:38

标签: multithreading hazelcast

USE CASE:使用DB中最后保存的id创建AtomicSequence(不是从零开始)并在db中最后保存的id之后生成id。        首先,我们检查是否存在AtomicSequence实例,否则我们从上次保存的id创建AtomicSequence(如果条目在db中)。

在HazelcastAtomicSequenceManager中,getSequenceGenerator方法是两步过程。

步骤1:getHzInstance()。getAtomicLong(key)。 //如果不存在则会创建一个初始值为0的新的。 第2步:this.sequence.compareAndSet(0,startVal); //如果初始值为零,则设置值。

现在考虑线程1来检查并看到给定键的AtomicSequence不存在并且执行stpe1仍然没有执行步骤2。 线程2来看看AtomicSequence是否已创建(由第1步由thread1执行)并继续并将其递增为1.由于线程2未执行步骤2,因此初始值仍为零。 现在,线程1将尝试执行step2,但由于初始值变为1或不等于零,因此无法执行。因此,原子序列将从1开始生成id,而不应该从最后一个save id开始,因此我们的测试用例失败了。 任何解决此问题的方法

1 个答案:

答案 0 :(得分:-1)

你需要在循环中获取并尝试compareAndSet,直到成功为止:



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