Java 基本类型和原子类型之间有什么区别?

Java 基本类型和原子类型之间有什么区别?,java,types,Java,Types,许多编程语言规范都讨论语言的基本类型及其原子类型。在某些情况下,这些是单独提及的,有些则将这些定义混合在一起。在阅读了一些材料之后,我逐渐意识到这两个术语之间有区别,但它似乎要么非常微妙,要么太模糊 原子类型和原语类型之间到底有什么区别?一个包含在另一个中吗?区别在于基本类型(int等)不是对象;尽管在Java中,存在与每个基元类型相关联的类(Integerforintetc) 原子类型“只是”常规Java对象;与“普通”对象的区别在于,操作它们的方法保证是原子的,因此是线程安全的。对于int,

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


原子类型原语类型之间到底有什么区别?一个包含在另一个中吗?

区别在于基本类型(
int
等)不是对象;尽管在Java中,存在与每个基元类型相关联的类(
Integer
for
int
etc)

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

然而,谈论“原子类型”与“基元类型”在一定程度上是不正确的,因为一些支持原子操作的类没有链接到基元类型;一个这样的例子是
AtomicReference
,但也有
AtomicIntegerArray
和其他一些例子

另请参见上的Wikipedia条目,简称CAS



此外,虽然有人认为基本类型基本上是线程安全的,但事实并非如此;每个线程都可以有自己的本地存储(这被称为TLS,线程本地存储),用于优化,因此可以有自己的原语变量副本;这就是为什么在Java中,
volatile

基本类型是原子的。换句话说,它们不能分解为更简单的类型。

在Java中,有基本类型,也有装箱类型,方框类型是实际对象,基本类型只是类型的变量

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

int-pi; 整数bi

pi是声明和分配的,可以立即使用,例如: pi=100

bi已声明,但直到: bi=新整数(1)


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

@fge过去是true,但64位值的读取和写入现在是原子的。@PeterLawrey I随后得到纠正;出于我个人的好奇:从什么时候开始?@fge AFAIK他们更新JMM时是Java 5.0,这是修复程序之一(包括使双重检查锁定安全)。在64位长且双使用两个“插槽”的字节码中,即使是64位,引用也只使用一个插槽,但是这些插槽的意义在很大程度上是历史性的,因为JVM在运行如此多的代码时会对代码进行优化。