5

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()

谢谢!

4

4 回答 4

5

是的。它使用基于内部 JDK 类的其他更有效的线程安全机制,而不是同步Unsafe

于 2017-05-18T16:35:29.703 回答
4

不仅AtomicIntegerand AtomicLong原子包类是线程安全的。

java.util.concurrent.atomic

一个小的类工具包,支持对单个变量进行无锁线程安全编程。

本质上,此包中的类将 volatile 值、字段和数组元素的概念扩展到还提供以下形式的原子条件更新操作的类

boolean compareAndSet(expectedValue, updateValue);

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

于 2017-05-19T05:46:06.323 回答
1

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

于 2017-05-18T16:34:07.437 回答
1

是的。事实上,这是实施的既定目标之一AtomicLong

AnAtomicLong用于原子递增的序列号等应用程序中

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

于 2017-05-18T16:34:18.093 回答