原始类型和原子类型有什么区别?

mit*_*nia 2 java types

许多编程语言规范都讨论了语言的原始类型及其原子类型.在某些情况下,这些是单独提到的,有些将这些定义混合在一起.在阅读了一些材料后,我逐渐意识到这两个术语之间存在差异,但它似乎要么非常微妙或太模糊.

原子类型原始类型之间究竟有什么区别?是否包含在另一个内?

fge*_*fge 6

不同之处在于原始类型(int等)不是对象; 虽然在Java中存在与每种基本类型相关联的类(Integer对于int等).

原子类型是"只是"常规Java对象; 与"普通"对象的区别在于,操作它们的方法保证是原子的,因此线程安全.因为int,那就是AtomicInteger你可以.getAndSet()原子地增量等.

然而,谈论"原子类型"与"原始类型"部分是不正确的,因为一些支持原子操作的类没有链接到原始类型; 一个这样的例子是AtomicReference,但你也有AtomicIntegerArray其他一些.

另请参阅维基百科有关比较和交换的条目,或简称CAS.


此外,虽然人们会认为原始类型基本上是线程安全的,但情况并非如此; 每个线程都可以拥有自己的本地存储(这称为TLS,线程局部存储,不作为TLS,线程局部存储),因此可以拥有自己的原始变量副本; 这就是为什么你用Java volatile.