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()
谢谢!
答案 0 :(得分:4)
是的,确实如此。它使用基于内部ask类Unsafe
答案 1 :(得分:2)
不仅AtomicInteger
和AtomicLong
,atomic包类是线程安全的。
java.util.concurrent.atomic
一个小型工具包,支持对单个变量进行无锁线程安全编程。
本质上,此包中的类将volatile值,字段和数组元素的概念扩展为也提供形式的原子条件更新操作的那些:
boolean compareAndSet(expectedValue, updateValue);
类AtomicBoolean
,AtomicInteger
,AtomicLong
和AtomicReference
的实例均提供对相应类型的单个变量的访问和更新。每个类还为该类型提供适当的实用方法。例如,类AtomicLong
和AtomicInteger
提供原子增量方法。
答案 2 :(得分:1)
YES!它是java.util.concurrent包的一部分。
答案 3 :(得分:1)
是。实际上,这是one of the stated goals of implementing AtomicLong
:
AtomicLong
用于诸如原子递增序列号的应用程序
同时访问incrementAndGet
的多个线程中的每一个都将获得唯一的编号。