番石榴ImmutableList ......究竟是什么支持它?

tmn*_*tmn 0 java collections guava

我出于好奇而下载了Google Guava的源代码,以了解支持不可变集合的内容.

我正在浏览ImmutableList,我注意到它仍然由一个老式数组支持,如同 Object[]

所以我只是好奇,这个Object[]数组本质上可能是可变的,并且它不是线程安全的.我已经知道ArrayList和CopyOnWriteArrayList是由Object[]数组支持的,但它们是可变的.

因此,ImmutableList只是不可变和线程安全的,因为它的内部属性被很好地封装和保护了吗?它是不可变的还是线程安全的,因为封装确保在构造之后什么都不会修改它?是否有一天像这样的低级别数组将被更换为更好的而不是遗留的东西,并且本质上是不可变的和最终的而不是通过仔细的封装不可变?

Thi*_*ilo 10

是的,ImmutableList是"仅"不可变的,因为它不允许修改其内部后备阵列.

这与a的情况完全相同,a java.lang.String也包含私有char[].同样,非常有用的并发库主要是作为常规Java类实现的,仅依赖于极少数(和非常基本的)JVM同步原语.

所以这应该足够好了.显然,编写这些库类的人必须要小心并且知识渊博,但是通过将代码更"低级"地移动到JVM原语中,这个要求并没有神奇地消失.(同意,你现在可以使用黑暗伏都教般的反射射击自己,但这种情况几乎不会发生,而且在常规使用中,"用户土地"实施也同样有效).

会不会有一天

这是纯粹的猜测.但显然有关于"价值类型"的工作,这是一个相关的主题.