Atomic Integer incrementAndGet() 线程安全吗?

Is Atomic Integer incrementAndGet() thread safe?

Atomic Integer incrementAndGet() 方法线程安全吗?我没有看到其中有任何 synchronized 关键字的使用。我正在使用以下代码生成唯一 ID:

public enum UniqueIdGenerator {
    INSTANCE;

    private AtomicLong instance = new AtomicLong(System.currentTimeMillis());

    public long incrementAndGet() {
        return instance.incrementAndGet();
    }
}

我想知道调用方法生成唯一 ID 的多个线程是否会导致任何问题。

UniqueIdGenerator.INSTANCE.incrementAndGet()

谢谢!

是的!它是 java.util.concurrent 包的一部分。

是的。其实这是one of the stated goals of implementing AtomicLong:

An AtomicLong is used in applications such as atomically incremented sequence numbers

同时访问 incrementAndGet 的多个线程中的每一个都将获得一个唯一的编号。

是的,是的。它使用基于内部 JDK class 命名为 Unsafe

的其他而非同步的更高效的线程安全机制

不仅AtomicIntegerAtomicLongatomic包class也是线程安全的。

java.util.concurrent.atomic

A small toolkit of classes that support lock-free thread-safe programming on single variables.

本质上,这个包中的 classes 将易失性值、字段和数组元素的概念扩展到那些还提供表单[=的原子条件更新操作的那些29=]:

boolean compareAndSet(expectedValue, updateValue);

classes AtomicBooleanAtomicIntegerAtomicLongAtomicReference 的实例每个都提供对相应类型的单个变量的访问和更新.每个 class 还为该类型提供适当的实用方法。例如,classes AtomicLongAtomicInteger 提供原子增量方法。