【问题标题】:Are AtomicInteger synchronization primitives?AtomicInteger 是同步原语吗?
【发布时间】:2016-11-01 17:49:34
【问题描述】:

AtomicIntegers 是被认为是同步原语,还是只是 Java 提供的方法(wait()、notify() 等)。

我对原语的定义感到困惑,因为原子整数可以在 int 上操作并提供无锁线程圣人编程。没有使用同步。

【问题讨论】:

  • AtomicIntegers 不是原始的。
  • @DejaVuSansMono 我已经读过,但对我来说不是很清楚。具体来说,“通常使用较低级别的机制(例如原子操作、内存屏障、自旋锁、上下文切换等)构建。 "这就是说它们可以使用原子操作来构建。
  • @DejaVuSansMono 另外,“互斥量、事件、条件变量和信号量都是同步原语”。如果我错了,请纠正我,不是信号量、互斥体、条件、监视器、有界缓冲区等只是概念。喜欢实现线程安全编程时要遵循的模型和概念

标签: java multithreading


【解决方案1】:

AtomicInteger 是一个类。它的方法是……嗯,方法。这些都不会被视为同步原语。

compareAndSet 方法也被 incrementAndGet 和其他此类方法使用,使用 Unsafe.compareAndSwapInt(在 OpenJDK 7 上,这是我方便的)。这是一种本机方法——所以它很可能被认为是一种原始方法。事实上,在现代 CPU 上,它会转换为 CAS 指令,因此它一直是硬件级别的原语。

该类还依赖于volatile 的内存可见性,这也是一个同步原语。

【讨论】:

  • 在随机数生成器的情况下,我已经阅读了很多示例,其中大多数使用原子整数和种子而不使用同步。这些实际上并没有使用同步原语,而是使用原子原语?
  • “同步”本身就是一个重载的术语。有关键字synchronized(及其相关语义),还有同步一个又一个动作的概念——这是一个更抽象的概念,像volatile 关键字这样的东西给了你。例如,JLS 17.4.4 谈到后一种意义上的“同步顺序”。所以即使是后续问题也有点模糊。
【解决方案2】:

我觉得这个问题有点“含糊”;但我认为“语言原语”通常是指作为语言核心一部分的语言元素。

换句话说:关键字和相关的语义。从这个意义上说;我认为 synchronized (有两种含义)和 volatile 关键字是关于多线程的唯一“原始”。

当然是Object等类;因此,它的所有方法,如 wait()、notify() ...也是 Java 的重要组成部分(一开始就无法避免)。当然,Thread 类也是如此。

长话短说:您可以区分作为语言关键字存在的概念(因此由编译器处理);和作为“普通”类出现的“顶级”概念。正如 yshavit 的回答很好地描述的那样,AtomicInteger 的某些方面可以直接映射到事物的“本机”方面。因此,真正的答案可能是,如前所述,“原始”一词在描述/区分有关 Java 多线程主题的概念方面没有多大帮助。

【讨论】:

    【解决方案3】:

    关于您的第一个查询:

    AtomicIntegers 是被认为是同步原语,还是只是 Java 提供的方法(wait()、notify() 等)。

    没有。 AtomicInteger 既不是方法也不是同步原语。

    AtomicInteger 是一个带有方法的类。查看atomic packages上的 oracle 文档页面

    一个小的类工具包,支持对单个变量进行无锁线程安全编程。本质上,此包中的类将 volatile 值、字段和数组元素的概念扩展到还提供以下形式的原子条件更新操作的类:

    boolean compareAndSet(expectedValue, updateValue);
    

    此包中的类还包含获取和无条件设置值的方法,以及较弱的条件原子更新操作weakCompareAndSet

    关于您的第二个查询:

    我对原语的定义感到困惑,因为原子整数可以在 int 上操作并提供无锁线程圣人编程。不使用同步。

    一个重点:

    AtomicIntegerAtomicXXX 变量相比,synchronized 的范围本质上更广泛。使用synchronized 方法或块,您可以保护代码的关键部分,其中包含许多语句。

    compareAndSet 方法不是锁定的一般替代品。它仅适用于对象的关键更新仅限于单个变量时。

    原子类不是java.lang.Integer 和相关类的通用替代品。但是,AtomicInteger 扩展了 Number 以允许处理基于数字的类的工具和实用程序进行统一访问。

    【讨论】:

    • java.util.conncurent 中的 CountdownLatch 怎么样?本文中建议的同步原语是否正确link
    猜你喜欢
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多