sun.misc.Unsafe的未来将如何发展?

随着2015年即将结束,我们认为这将是对Java社区过去一年中最热门辩论之一进行尸检的好机会。 通过查看标题,您中的大多数人可能已经开始在口腔中产生酸味并在肠道中产生愤怒的感觉,但是如果您错过了该操作,让我们来回顾一下所有引起大惊小怪的事情。

最重要的是:sun.misc.Unsafe不会走到任何地方

整个辩论始于7月,当时Oracle正在考虑删除许多开发人员所依赖的作为JVM关键API之一的Unsafe库。 该提案建议,在Java 9发行时,Unsafe将被完全封装,尽管该Java版本的发行日程仍遥遥无期,但仅此宣布就在开发人员社区引起了轩然大波。

我们看到Reddit,Twitter和多个博客对此举表示了批评,许多开发人员感到甲骨文“背叛了”,原因有以下三个主要原因:

  1. Unsafe提供了对有助于开发许多工具的低级功能的访问。
  2. 这些相同的功能在内部JVM库之外没有任何其他选择。
  3. 许多开发人员担心sun.misc.Unsafe的封装会产生负面影响,甚至将许多工具减少到无法使用的状态。

暂时存在一个折衷方案,这是Java平台组首席架构师Mark Reinhold建议的三步解决方案 。 该解决方案概述了封装内部API(例如Unsafe)的所需过程:

  1. 如果它在JDK 8中具有受支持的替代品,那么它将被封装在JDK 9中
  2. 如果它在JDK 8中没有受支持的替代品,则它将不会封装在JDK 9中,因此外部代码仍然可以访问它; 并进一步,
  3. 如果它在JDK 9中具有受支持的替代产品,那么它将不推荐使用,并将其封装在JDK 9中,甚至可能在JDK 10中将其删除。

所以现在的问题是:Oracle为什么要寻求消除不安全并从头开始这场风暴? 要了解,我们可能应该在做出任何判断之前以一种或另一种方式客观地看待事物。

如何变得不安全

我们唯一可以启动检查此类火灾原因的过程的地方就是Unsafe库本身。 许多开发人员已经开始依靠其独特的功能来完成各种任务,但是,请不要忘记,Unsafe库实际上并不意味着内部开发团队之外的任何人都可以访问。 它曾经是而且仍然是一种不规则,巧合,各种错误。

当然,这是一次非常有用和快乐的巧合,但它根本就不会发生。 多年以来,各种不安全的用途已成为实际上的标准,但是这些用途中的任何一种的起源仍源于错误。 因此,期望Oracle无限期地保留过时的Sun *库有点不合逻辑。毕竟,如果我们中有人发现了自己代码中的错误,我们是否会努力消除它?

社区的反应–一场灾难

随着Unsafe风暴席卷整个Java开发人员社区,有两个主要问题不断出现。 第一个是先前讨论的背叛感(是否合理,取决于您的观点)。 第二个,也许稍微更合理-出于合理的担心,封装Unsafe将有史以来第一次违反Java的一项主要承诺-向后兼容性。

一些开发人员一直在发布有关消除或限制访问Unsafe的可能结果的世界末日帖子,称许多工具,库和基础结构软件直接或在可见代码下方使用该库,其中包括Hazelcast,Cassandra,Spring等。其他。

如果要完全实现Oracle的封装计划,那么使用一个或多个这些工具的任何开发人员都会遇到严重的困难。

甲骨文的立场–

该库的名称应表明该库存在使用风险,并且Oracle所做的一切实际上都是在试图最大程度地降低任何潜在风险。 在任何地方使用标题为“不安全”的库有点像看到雷区,成功穿越它,然后邀请所有朋友也穿越它,因为它“为您工作”。 那只会导致一个结果:

多年来,Oracle一直在解释说,尽管他们赞赏所有社区使用Unsafe库在开发方面所做的努力,但是访问这样低级的库应该被视为有使用风险。 不负责任地使用未记录的库可能会在使用该库的任何平台上导致各种内存问题和其他处理过载。 就Oracle而言,这就是“不太理想的结果”的确切定义。 可能需要注意的是,并不是所有Java中的“弃用”在发生时都被认为是不好的,有些人,例如删除PermGen最终被称赞为“ 非常积极” 。

最后的想法

看起来,尽管Java平台团队看到了抗议的蔓延(他们很可能知道抗议即将来临)并最终找到了解决该问题的合理解决方案,或者至少可以与开发人员社区一起生活。

距离Java 9的实际发布版本还有1年多的时间,无论是否以任何形式或形式存在Unsafe库,而且其他更改和声明可能很快就会到来。 您可以访问我们的倒计时站点java9countdown.xyz并注册新闻通讯,以获取有关Java 9所有相关问题的最新信息。

翻译自: https://www.javacodegeeks.com/2016/01/still-unsafe-major-bug-java-6-turned-java-9-feature.html

仍然不安全:变成了Java 9功能的Java 6中的主要错误相关推荐

  1. java常见的报错_Java中常见的错误有哪些?

    原标题:Java中常见的错误有哪些? 1.java.lang.Error 错误.是所有错误的基类,用于标识严重的程序运行问题.这些问题通常描述一些不应被应用程序捕获的反常情况. 原因: 1.对系统所访 ...

  2. arraycoy java,LifeAsia 功能通过Java转移到Web

    主题思想,除了业务操作类以BO实现外,除非已有现成BO,查询/报表 不通过BO实现. LIfeAsia文件的IO通过开发Java版本的IO来达到同样目的,LifeAsia的查询类程序通过PCML来调用 ...

  3. java收藏功能思路,互联网产品中的“收藏”功能思路

    简单谈谈"收藏"(互联网产品中的收藏功能)的思路,抛砖引玉,欢迎交流. 1."收藏"是什么? 收藏是个性化地整理信息资源. every coin has two ...

  4. java添加功能备注,java程序导出excel中如何添加单元格备注信息

    如果是JSP页面要导出成excel,依靠javascript就可以实现了,具体你试试上面的代码 <input type="button" value="保存为 Ex ...

  5. Java堆栈功能_【ThinkingInJava】35、用java实现堆栈功能

    /** * 书本:<Thinking In Java> * 功能:用java实现堆栈功能 * 文件:LinkedStack.java * 时间:2015年4月17日14:23:34 * 作 ...

  6. java多功能钟_Java 11将包含更多功能

    java多功能钟 Java 11即将发布的功能是什么?它与Java 9和10有何不同? Java 10可能是新手,但现在该谈论Java 11了.Oracle迈向更快的发布周期意味着更多的特性和功能以比 ...

  7. Node之父发布新项目deno:下一代Node;百度推出没有广告的简单搜索;甲骨文计划砍掉Java序列化功能;丨Q新闻...

    点击关注 InfoQ,置顶公众号 接收程序员的技术早餐 编辑|小智 音频|Heard 本周要闻:Git 爆任意代码执行漏洞,所有使用者都受影响:Node 之父发布新项目 deno:下一代 Node:G ...

  8. java date.getyear_为什么Java的Date.getYear()返回111而不是2011?

    tl;博士 int year = LocalDate.parse( "04/12/2011" , DateTimeFormatter.ofLocalizedDate( Format ...

  9. java判断白天黑夜,获取Java中的所有夜晚时间

    tl;博士 正如George Fox所说的那样,你问题的直接答案是使用逻辑OR而不是AND . 但是您的代码还有其他问题: 忽略 time zone 的关键问题 使用血腥 awful date-tim ...

最新文章

  1. oracle trunc()截断函数
  2. 哪本python入门书内容最详细-重磅 | 由浅入深的 AI 学习路线,最详细的资源整理!...
  3. [Charset]UTF-8, UTF-16, UTF-16LE, UTF-16BE的区别
  4. MySQL之最基本命令
  5. 解释三度带和六度带的概念以及各坐标系如何定义
  6. 云南干旱 谁人受损 心有戚戚 愤怒哀伤
  7. python教学视频r_R Tutorial
  8. ios nstimer实现延时_iOS中定时器NSTimer的使用
  9. rhel5.3服务器安装centOS的yum源
  10. 【转】并查集算法和路径压缩
  11. 黑客攻防技巧:2分钟入侵网站全程实录
  12. 第五章 区块链怎么玩 [25]
  13. 小游戏打包发布安卓APK
  14. 华宇软件华为鸿蒙,舒华体育携手华为打造:全球首款搭载鸿蒙操作系统跑步机面世...
  15. Java设计模式大全
  16. 财神来了 | 那些年伤害过你的分叉币
  17. PS2021 编辑PDF文件,修改文字
  18. 机器学习——VC维问题
  19. ILP的基本编译器技术
  20. springcloud ribbon实现负载均衡的时候,提示Request URI does not contain a valid hostname: htt...

热门文章

  1. 面象对象设计6大原则之五:依赖倒置原则
  2. 你必须了解Spring的生态
  3. 切记!构造函数里面别一定不要初始化其他类,踩过坑的都知道
  4. LocalDateTime与LocalDate之间的相互转换
  5. 二维数组常用的赋值方式
  6. 页面复杂对象传递参数 开发中遇到的问题
  7. redis集群依赖ruby
  8. 吃透 | Elasticsearch filter和query的不同
  9. 在Spring中使用多个动态缓存
  10. java set方法不生效_使您的Java 8方法引用生效