實現(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類,不斷調用該類的