许多编程语言规范都讨论了语言的原始类型及其原子类型。在某些情况下,这些是单独提到的,有些将这些定义混合在一起。在阅读了一些材料后,我逐渐意识到这两个术语之间存在差异,但它似乎要么非常微妙或太模糊。
原子类型和原始类型之间究竟有什么区别?一个是否包含在另一个中?
答案 0 :(得分:6)
不同之处在于原始类型(int
等)不是对象;虽然在Java中有与每种基本类型相关联的类(Integer
等int
)。
原子类型是“只是”常规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错误。