Atomic Integer incrementAndGet()线程安全吗?

时间:2017-05-18 16:30:50

标签: java multithreading atomicinteger

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 个答案:

答案 0 :(得分:4)

是的,确实如此。它使用基于内部ask类Unsafe

的其他,而不是同步的,更有效的线程安全机制

答案 1 :(得分:2)

不仅AtomicIntegerAtomicLongatomic包类是线程安全的。

java.util.concurrent.atomic
  

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

本质上,此包中的类将volatile值,字段和数组元素的概念扩展为也提供形式的原子条件更新操作的那些:

boolean compareAndSet(expectedValue, updateValue);

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

是。实际上,这是one of the stated goals of implementing AtomicLong

  

AtomicLong用于诸如原子递增序列号的应用程序

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