原始类型和原子类型有什么区别?
What is the difference between a primitive type and an atomic type?
许多编程语言规范都讨论了该语言的基本类型及其原子类型。在某些情况下,这些是单独提及的,而有些则将定义混合在一起。在阅读了一些资料后,我开始意识到这两个术语之间存在差异,但是它似乎非常微妙或过于晦涩。
原子类型和原始类型到底有什么区别?一个包含在另一个中吗?
区别在于原始类型(int
等)不是对象;尽管在 Java 中有 类 与每个基本类型相关联(Integer
对应 int
等)。
原子类型是 "just" 常规 Java 对象; "plain" 对象的区别在于操作它们的方法保证是原子的,因此是线程安全的。对于 int
,那将是 AtomicInteger
,您可以自动递增,.getAndSet()
等。
然而,谈论 "atomic types" 与 "primitive types" 是部分不正确的,因为一些支持原子操作的 类 没有链接到基本类型;一个这样的例子是 AtomicReference
,但你也有 AtomicIntegerArray
和其他一些。
另请参阅 compare and swap 或简称 CAS 上的维基百科条目。
此外,虽然有人会认为原始类型从根本上讲是线程安全的,但事实并非如此;每个线程都可以有自己的本地存储(这被称为 TLS,Thread Local Storage)用于优化,因此可以有自己的原始变量副本;这就是为什么 Java 你有 volatile
.
基本类型是原子的。换句话说,它们不能被解构为更简单的类型。
在Java中有原始类型和装箱类型,盒子类型是实际对象,原始类型只是类型的变量。
例如 int 是原始类型,而 Integer 是装箱类型。
整数圆周率;
整数 bi;
pi 已声明并已分配,可以立即使用,例如:
圆周率 = 100 ;
bi 已声明,但直到:
双 = 新整数 (1);
在分配引用 bi 之前将抛出 java.lang.NullPointer 错误。
许多编程语言规范都讨论了该语言的基本类型及其原子类型。在某些情况下,这些是单独提及的,而有些则将定义混合在一起。在阅读了一些资料后,我开始意识到这两个术语之间存在差异,但是它似乎非常微妙或过于晦涩。
原子类型和原始类型到底有什么区别?一个包含在另一个中吗?
区别在于原始类型(int
等)不是对象;尽管在 Java 中有 类 与每个基本类型相关联(Integer
对应 int
等)。
原子类型是 "just" 常规 Java 对象; "plain" 对象的区别在于操作它们的方法保证是原子的,因此是线程安全的。对于 int
,那将是 AtomicInteger
,您可以自动递增,.getAndSet()
等。
然而,谈论 "atomic types" 与 "primitive types" 是部分不正确的,因为一些支持原子操作的 类 没有链接到基本类型;一个这样的例子是 AtomicReference
,但你也有 AtomicIntegerArray
和其他一些。
另请参阅 compare and swap 或简称 CAS 上的维基百科条目。
此外,虽然有人会认为原始类型从根本上讲是线程安全的,但事实并非如此;每个线程都可以有自己的本地存储(这被称为 TLS,Thread Local Storage)用于优化,因此可以有自己的原始变量副本;这就是为什么 Java 你有 volatile
.
基本类型是原子的。换句话说,它们不能被解构为更简单的类型。
在Java中有原始类型和装箱类型,盒子类型是实际对象,原始类型只是类型的变量。
例如 int 是原始类型,而 Integer 是装箱类型。
整数圆周率; 整数 bi;
pi 已声明并已分配,可以立即使用,例如: 圆周率 = 100 ;
bi 已声明,但直到: 双 = 新整数 (1);
在分配引用 bi 之前将抛出 java.lang.NullPointer 错误。