實現(xiàn)全局自增id最簡單有效的方式是什么?java.util.concurrent.atomic包定義了一些常見類型的原子變量。這些原子變量為我們提供了一種操作單一變量無鎖(lock-free)的線程安全(thread-safe)方式。實際上該包下面的類為我們提供了類似volatile變量的特性,同時還提供了諸如boolean compareAndSet(expectedValue, updateValue)的功能。不使用鎖實現(xiàn)線程安全聽起來似乎很不可思議,這其實是通過CPU的compare and swap指令實現(xiàn)的,由于硬件指令支持當然不需要加鎖了。

先不去討論這些細節(jié),我們來看一下原子變量的用法。一個典型的用法是可以使用原子變量輕松實現(xiàn)全局自增id,就像下面這樣:

// 線程安全的序列id生成器class Sequencer {    private final AtomicLong sequenceNumber = new AtomicLong(0);    public long next() {        return sequenceNumber.getAndIncrement();
    }
}

上述代碼利用AtomicLong創(chuàng)建了一個Sequencer類,不斷調用該類的

網友評論