實(shí)現(xiàn)全局自增id最簡(jiǎn)單有效的方式是什么?java.util.concurrent.atomic
包定義了一些常見類型的原子變量。這些原子變量為我們提供了一種操作單一變量無鎖(lock-free)的線程安全(thread-safe)方式。實(shí)際上該包下面的類為我們提供了類似volatile
變量的特性,同時(shí)還提供了諸如boolean compareAndSet(expectedValue, updateValue)
的功能。不使用鎖實(shí)現(xiàn)線程安全聽起來似乎很不可思議,這其實(shí)是通過CPU的compare and swap指令實(shí)現(xiàn)的,由于硬件指令支持當(dāng)然不需要加鎖了。
先不去討論這些細(xì)節(jié),我們來看一下原子變量的用法。一個(gè)典型的用法是可以使用原子變量輕松實(shí)現(xiàn)全局自增id,就像下面這樣:
// 線程安全的序列id生成器class Sequencer { private final AtomicLong sequenceNumber = new AtomicLong(0); public long next() { return sequenceNumber.getAndIncrement(); } }
上述代碼利用AtomicLong創(chuàng)建了一個(gè)Sequencer類,不斷調(diào)用該類的