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

时间:2015-01-20 07:32:23

标签: java types

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

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

3 个答案:

答案 0 :(得分:6)

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

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

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

另请参阅compare and swap上的维基百科条目,或简称CAS。


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

答案 1 :(得分:0)

原始类型是原子的。换句话说,它们不能被解构为更简单的类型。

答案 2 :(得分:0)

在Java中有Primitive类型,并且有盒装类型,Box类型是实际对象,而原始类型只是类型的变量。

例如,int是基本类型,而Integer是盒装类型。

int pi; 整数bi;

pi已声明并已分配,可立即使用,例如: pi = 100;

bi已声明,但在下列情况之前不会分配: bi = new Integer(1);

在分配之前,引用bi将抛出java.lang.NullPointer错误。