是AtomicInteger同步原语吗?

时间:2016-11-01 17:49:34

标签: java multithreading

AtomicIntegers是否考虑了同步原语,或者它只是Java提供的方法(wait(),notify()等)。

我对原语的定义感到困惑,因为原子统一可以对int进行操作并提供无锁线程sage编程。不使用synchronized。

3 个答案:

答案 0 :(得分:3)

AtomicInteger是一个类。它的方法是......好吧,方法。其中任何一个都不会被认为是同步原型。

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

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

答案 1 :(得分:2)

我认为这个问题有点“模糊”;但我认为“语言原语”通常是指语言元素,它们是语言的核心的一部分。

换句话说:关键字和相关的语义。从这个意义上说;我会看到 synchronized (在其两个含义中)和 volatile 关键字是关于多线程的唯一“原语”。

当然,像Object这样的类;因此它的所有方法,如wait(),notify()...也是Java的一个重要部分(首先你无法避免)。当然,关于Thread类也可以这么说。

长话短说:您可以区分以语言关键字存在的概念(因此由编译器处理);以及作为“正常”类的“on-top”概念。正如yshavit的答案很好地描述的那样,AtomicInteger的某些方面可以直接映射到事物的“本地”方面。所以真正的答案可能是,如上所述,术语“原始”并没有为描述/区分有关Java多线程主题的概念提供太多帮助。

答案 2 :(得分:1)

关于您的第一个查询:

  

AtomicIntegers是否考虑了同步原语,或者只是Java提供的方法(wait(),notify()等)。

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

AtomicInteger是一个带方法的类。查看atomic packages

上的oracle文档页面
  

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

boolean compareAndSet(expectedValue, updateValue);

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

关于你的第二个问题:

  

我对原语的定义感到困惑,因为原子统一可以对int进行操作并提供无锁线程sage编程。不使用synchronized。

一个关键的注意事项:

AtomicIntegersynchronized变量相比,AtomicXXX的范围具有广泛性。使用synchronized方法或块,您可以保护代码的关键部分,其中包含许多语句。

  

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

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