JDK 类 除了他们的 Javadoc 之外还有其他规范吗?
Do JDK classes have any further specifications beyond their Javadoc?
JDK 类 除了他们的 Java 文档之外还有其他规范吗?如果有,在哪里?
例如,考虑 Collections.unmodifiableMap
。 Its Javadoc 没有提到线程安全;因此,仅从 Javadoc 开始,我不能假设在不采取我自己的一些特殊步骤来获得线程安全的情况下将生成的映射公开给其他线程是安全的。但是恕我直言,任何现实的实现都会将内部映射存储在 final
字段中,因此在 Java 5 及更高版本中,只要内部映射是(带有 "happens-before" 结果映射的任何访问与之前对内部映射的任何修改之间的关系)。例如,这就是 OpenJDK 实现所做的。
那么,我怎样才能确定我是否可以便携地假设给定的行为?
Javadoc 是规范。也就是说,编写好的规范非常困难,要在不遗漏有用的东西和不过度使用(并破坏未来发展实施的能力)之间取得平衡。
如果我不得不猜测,我会说这被排除在规范之外的原因(除了可能的疏忽)是任何线程安全都是有条件的,而不是底层集合 (a) 不被发布和(b) 不可修改视图创建后不可修改,这个也要慎重指定。
最后只有一个连续体,从 永远不会改变 到 可能会在下一个版本中改变行为 到 恰好可以在您的平台上工作。即使指定的行为也可以被弃用,然后在某个时候删除,这种情况极少发生(例如 Thread.destroy
)。因此,您是否可以依赖合理但未指定的行为取决于您需要多强的保证,您想要花费多少精力来防御性地编码/添加测试以确保您检测到未来的变化等。
但是,是的,javadoc 是您可以获得的最有力的保证,其他一切都意味着要更进一步。
许多项目依赖的 API 不仅没有记录,而且被认为是内部的,表面上是特定于实现的。 sun.misc.Unsafe
是这里的主要示例,以至于它的大部分功能在 9.
中被具体化为适当的 JDK API。
在 Collections.unmodifiableMap
的情况下,如果您想真正防御安全发布,您可以在创建后插入商店围栏。
JDK 类 除了他们的 Java 文档之外还有其他规范吗?如果有,在哪里?
例如,考虑 Collections.unmodifiableMap
。 Its Javadoc 没有提到线程安全;因此,仅从 Javadoc 开始,我不能假设在不采取我自己的一些特殊步骤来获得线程安全的情况下将生成的映射公开给其他线程是安全的。但是恕我直言,任何现实的实现都会将内部映射存储在 final
字段中,因此在 Java 5 及更高版本中,只要内部映射是(带有 "happens-before" 结果映射的任何访问与之前对内部映射的任何修改之间的关系)。例如,这就是 OpenJDK 实现所做的。
那么,我怎样才能确定我是否可以便携地假设给定的行为?
Javadoc 是规范。也就是说,编写好的规范非常困难,要在不遗漏有用的东西和不过度使用(并破坏未来发展实施的能力)之间取得平衡。
如果我不得不猜测,我会说这被排除在规范之外的原因(除了可能的疏忽)是任何线程安全都是有条件的,而不是底层集合 (a) 不被发布和(b) 不可修改视图创建后不可修改,这个也要慎重指定。
最后只有一个连续体,从 永远不会改变 到 可能会在下一个版本中改变行为 到 恰好可以在您的平台上工作。即使指定的行为也可以被弃用,然后在某个时候删除,这种情况极少发生(例如 Thread.destroy
)。因此,您是否可以依赖合理但未指定的行为取决于您需要多强的保证,您想要花费多少精力来防御性地编码/添加测试以确保您检测到未来的变化等。
但是,是的,javadoc 是您可以获得的最有力的保证,其他一切都意味着要更进一步。
许多项目依赖的 API 不仅没有记录,而且被认为是内部的,表面上是特定于实现的。 sun.misc.Unsafe
是这里的主要示例,以至于它的大部分功能在 9.
在 Collections.unmodifiableMap
的情况下,如果您想真正防御安全发布,您可以在创建后插入商店围栏。