【问题标题】:Is Atomic Integer incrementAndGet() thread safe?Atomic Integer incrementAndGet() 线程安全吗?
【发布时间】:2017-10-18 14:17:18
【问题描述】:

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

谢谢!

【问题讨论】:

  • 是的。 AtomicLong 也是。
  • docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/…。这与 AtomicInteger 的 javadoc 的第一句有关。它说:支持对单个变量进行无锁线程安全编程的类的小型工具包
  • 它不仅是线程安全的,而且事实上它的线程安全是使用它的唯一原因(与普通的int 不同)。

标签: java multithreading atomicinteger


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    java.util.concurrent.atomic
    

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

    本质上,这个包中的类将易失性值、字段和数组元素的概念扩展到那些还提供原子条件更新操作的形式

    boolean compareAndSet(expectedValue, updateValue);
    

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-01-24
          • 1970-01-01
          • 1970-01-01
          • 2015-12-18
          • 2015-11-27
          • 2020-04-15
          • 2021-08-13
          • 2011-07-04
          • 2014-04-26
          相关资源
          最近更新 更多