Java 是原子整数同步原语吗?

Java 是原子整数同步原语吗?,java,multithreading,Java,Multithreading,原子整数被认为是同步原语,还是仅仅是Java提供的方法(wait()、notify()等) 我对原语的定义感到困惑,因为原子整数可以对int进行操作,并提供无锁线程编程。没有使用同步 原子整数是一个类。其方法是。。。嗯,方法。其中任何一个都不会被认为是灵长类动物 compareAndSet方法也被incrementAndGet和其他类似方法使用,它使用了Unsafe.compareAndSwapInt(在OpenJDK 7上,这是我手边的)。这是一种本地方法,因此可以很好地将其视为原始方法。事实

原子整数被认为是同步原语,还是仅仅是Java提供的方法(wait()、notify()等)


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

原子整数是一个类。其方法是。。。嗯,方法。其中任何一个都不会被认为是灵长类动物

compareAndSet
方法也被
incrementAndGet
和其他类似方法使用,它使用了
Unsafe.compareAndSwapInt
(在OpenJDK 7上,这是我手边的)。这是一种本地方法,因此可以很好地将其视为原始方法。事实上,在现代CPU上,它被转换成CAS指令,所以它是一种基本指令,一直到硬件级别


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

AtomicInteger是一个类。其方法是。。。嗯,方法。其中任何一个都不会被认为是灵长类动物

compareAndSet
方法也被
incrementAndGet
和其他类似方法使用,它使用了
Unsafe.compareAndSwapInt
(在OpenJDK 7上,这是我手边的)。这是一种本地方法,因此可以很好地将其视为原始方法。事实上,在现代CPU上,它被转换成CAS指令,所以它是一种基本指令,一直到硬件级别


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

我认为这个问题有点“模糊”;但我认为“语言原语”通常指的是属于语言核心的语言元素

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

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


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

我认为这个问题有点“模糊”;但我认为“语言原语”通常指的是属于语言核心的语言元素

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

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


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

关于您的第一个查询:

原子整数被认为是同步原语,还是仅仅是Java提供的方法(wait()、notify()等)

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

AtomicInteger是一个包含方法的类。查看上的oracle文档页面

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

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

关于你的第二个问题:

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

一个关键注意事项:

与或
AtomicXXX
变量相比,
synchronized
的范围在本质上是广泛的。使用
synchronized
方法或块,您可以保护代码的关键部分,因为它包含许多语句

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


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

关于您的第一个查询:

原子整数被认为是同步原语,还是仅仅是Java提供的方法(wait()、notify()等)

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

原子整数是
boolean compareAndSet(expectedValue, updateValue);