--- title: Java 16 æ°ç¹æ§æ¦è§ category: Java tag: - Javaæ°ç¹æ§ --- Java 16 å¨ 2021 å¹´ 3 æ 16 æ¥æ£å¼åå¸ï¼éé¿ææ¯æï¼LTSï¼çæ¬ã ç¸å ³é 读ï¼[OpenJDK Java 16 ææ¡£](https://openjdk.java.net/projects/jdk/16/) ã ## JEP 338:åé API(ç¬¬äºæ¬¡åµå) åéï¼Vectorï¼ API æåç± [JEP 338](https://openjdk.java.net/jeps/338) æåºï¼å¹¶ä½ä¸º[åµå API](http://openjdk.java.net/jeps/11)éæå° Java 16 ä¸ã第äºè½®åµåç± [JEP 414](https://openjdk.java.net/jeps/414) æåºå¹¶éæå° Java 17 ä¸ï¼ç¬¬ä¸è½®åµåç± [JEP 417](https://openjdk.java.net/jeps/417) æåºå¹¶éæå° Java 18 ä¸ï¼ç¬¬åè½®ç± [JEP 426](https://openjdk.java.net/jeps/426) æåºå¹¶éæå°äº Java 19 ä¸ã 该åµåå¨ API æä¾äºä¸ä¸ª API çåå§è¿ä»£ä»¥è¡¨è¾¾ä¸äºåé计ç®ï¼è¿äºè®¡ç®å¨è¿è¡æ¶å¯é å°ç¼è¯ä¸ºæ¯æç CPU æ¶æä¸çæä½³åé硬件æä»¤ï¼ä»èè·å¾ä¼äºåçæ é计ç®çæ§è½ï¼å åå©ç¨åæä»¤å¤æ°æ®ï¼SIMDï¼ææ¯ï¼å¤§å¤æ°ç°ä»£ CPU ä¸é½å¯ä»¥ä½¿ç¨çä¸ç§æä»¤ï¼ã尽管 HotSpot æ¯æèªå¨åéåï¼ä½æ¯å¯è½¬æ¢çæ éæä½éæé䏿åä»£ç æ´æ¹çå½±åã该 API å°ä½¿å¼å人åè½å¤è½»æ¾å°ç¨ Java ç¼åå¯ç§»æ¤ç髿§è½åéç®æ³ã å¨ [Java 18 æ°ç¹æ§æ¦è§](./java18.md) ä¸ï¼ææè¯¦ç»ä»ç»å°åé APIï¼è¿éå°±ä¸ååé¢å¤çä»ç»äºã ## JEP 347:å¯ç¨ C++ 14 è¯è¨ç¹æ§ Java 16 å è®¸å¨ JDK ç C++ æºä»£ç ä¸ä½¿ç¨ C++14 è¯è¨ç¹æ§ï¼å¹¶æä¾å¨ HotSpot 代ç ä¸å¯ä»¥ä½¿ç¨åªäºç¹æ§çå ·ä½æå¯¼ã å¨ Java 15 ä¸ï¼JDK ä¸ C++ 代ç 使ç¨çè¯è¨ç¹æ§ä» éäº C++98/03 è¯è¨æ åãå®è¦æ±æ´æ°åç§å¹³å°ç¼è¯å¨çæä½å¯æ¥åçæ¬ã ## JEP 376:ZGC å¹¶å线ç¨å æ å¤ç Java16 å° ZGC çº¿ç¨æ å¤çä»å®å ¨ç¹è½¬ç§»å°ä¸ä¸ªå¹¶åé¶æ®µï¼çè³å¨å¤§å ä¸ä¹å è®¸å¨æ¯«ç§å æå GC å®å ¨ç¹ãæ¶é¤ ZGC å徿¶éå¨ä¸æåä¸ä¸ªå»¶è¿æºå¯ä»¥æå¤§å°æé«åºç¨ç¨åºçæ§è½åæçã ## JEP 387:å¼¹æ§å ç©ºé´ èªä»å¼å ¥äº Metaspace 以æ¥ï¼æ ¹æ®åé¦ï¼Metaspace ç»å¸¸å ç¨è¿å¤çå å¤å åï¼ä»è导è´å åæµªè´¹ãå¼¹æ§å 空é´è¿ä¸ªç¹æ§å¯å°æªä½¿ç¨ç HotSpot ç±»å æ°æ®ï¼å³å 空é´ï¼metaspaceï¼å åæ´å¿«éå°è¿åå°æä½ç³»ç»ï¼ä»èåå°å 空é´çå ç¨ç©ºé´ã å¹¶ä¸ï¼è¿ä¸ªææ¡è¿ç®åäºå 空é´ç代ç 以éä½ç»´æ¤ææ¬ã ## JEP 390:对åºäºå¼çç±»ååºè¦å > 以ä¸ä»ç»æèªï¼[宿 | åæ Java16 æ°è¯æ³ç¹æ§](https://xie.infoq.cn/article/8304c894c4e38318d38ceb116)ï¼åæåçå¾ä¸éï¼æ¨èé è¯»ã æ©å¨ Java9 çæ¬æ¶ï¼Java ç设计è 们就对 `@Deprecated` 注解è¿è¡äºä¸æ¬¡å级ï¼å¢å äº `since` å `forRemoval` ç 2 个æ°å ç´ ãå ¶ä¸ï¼since å ç´ ç¨äºæå®æ è®°äº `@Deprecated` 注解ç API 被å¼ç¨æ¶ççæ¬ï¼è `forRemoval` åè¿ä¸æ¥æç¡®äº API æ è®° @Deprecated 注解æ¶çè¯ä¹ï¼å¦æ`forRemoval=true`æ¶ï¼å表示该 API 卿ªæ¥çæ¬ä¸è¯å®ä¼è¢«å é¤ï¼å¼å人ååºè¯¥ä½¿ç¨æ°ç API è¿è¡æ¿ä»£ï¼ä¸å容æäº§çæ§ä¹ï¼Java9 ä¹åï¼æ è®° @Deprecated 注解ç APIï¼è¯ä¹ä¸åå¨å¤ç§å¯è½æ§ï¼æ¯å¦ï¼åå¨ä½¿ç¨é£é©ãå¯è½å¨æªæ¥åå¨å ¼å®¹æ§é误ãå¯è½å¨æªæ¥çæ¬ä¸è¢«å é¤ï¼ä»¥ååºè¯¥ä½¿ç¨æ´å¥½çæ¿ä»£æ¹æ¡çï¼ã ä»ç»è§å¯åå§ç±»åçå è£ ç±»ï¼æ¯å¦ï¼`java.lang.Integer`ã`java.lang.Double`ï¼ï¼ä¸é¾åç°ï¼å ¶æé 彿°ä¸é½å·²ç»æ è®°æ`@Deprecated(since="9", forRemoval = true)`注解ï¼è¿å°±æå³çå ¶æé 彿°å¨å°æ¥ä¼è¢«å é¤ï¼ä¸åºè¯¥å¨ç¨åºä¸ç»§ç»ä½¿ç¨è¯¸å¦`new Integer();`è¿æ ·çç¼ç æ¹å¼ï¼å»ºè®®ä½¿ç¨`Integer a = 10;`æè `Integer.valueOf()`彿°ï¼ï¼å¦æç»§ç»ä½¿ç¨ï¼ç¼è¯æå°ä¼äº§ç'Integer(int)' is deprecated and marked for removal åè¦ãå¹¶ä¸ï¼å¼å¾æ³¨æçæ¯ï¼è¿äºå è£ ç±»åå·²ç»è¢«æå®ä¸ºå `java.util.Optional` å `java.time.LocalDateTime` 䏿 ·çå¼ç±»åã å ¶æ¬¡ï¼å¦æç»§ç»å¨ `synchronized` 忥åä¸ä½¿ç¨å¼ç±»åï¼å°ä¼å¨ç¼è¯æåè¿è¡æäº§çè¦åï¼çè³æ¯å¼å¸¸ã卿¤å¤§å®¶éè¦æ³¨æï¼å°±ç®ç¼è¯æåè¿è¡ææ²¡æäº§çè¦ååå¼å¸¸ï¼ä¹ä¸å»ºè®®å¨ `synchronized` 忥åä¸ä½¿ç¨å¼ç±»åï¼ä¸¾ä¸ªèªå¢çä¾åãç¤ºä¾ 1-5ï¼ ```java public void inc(Integer count) { for (int i = 0; i { synchronized (count) { count++; } }).start(); } } ``` 彿§è¡ä¸è¿°ç¨åºç¤ºä¾æ¶ï¼æç»çè¾åºç»æä¸å®ä¼ä¸ä½ çææäº§çå·®å¼ï¼è¿æ¯è®¸å¤æ°äººç»å¸¸ç¯éçä¸ä¸ªç¹ï¼å 为å¨å¹¶åç¯å¢ä¸ï¼`Integer` å¯¹è±¡æ ¹æ¬æ æ³éè¿ `synchronized` æ¥ä¿è¯çº¿ç¨å®å ¨ï¼è¿æ¯å ä¸ºæ¯æ¬¡ç`count++`æä½ï¼æäº§çç `hashcode` åä¸åï¼ç®èè¨ä¹ï¼æ¯æ¬¡å éé½éå¨äºä¸åç对象ä¸ãå æ¤ï¼å¦æå¸æå¨å®é çå¼åè¿ç¨ä¸ä¿è¯å ¶ååæ§ï¼åºè¯¥ä½¿ç¨ `AtomicInteger`ã ## JEP 392:æå å·¥å · å¨ Java 14 ä¸ï¼JEP 343 å¼å ¥äºæå å·¥å ·ï¼å½ä»¤æ¯ `jpackage`ãå¨ Java 15 ä¸ï¼ç»§ç»åµåï¼ç°å¨å¨ Java 16 ä¸ï¼ç»äºæä¸ºäºæ£å¼åè½ã è¿ä¸ªæå å·¥å ·å 许æå èªå å«ç Java åºç¨ç¨åºã宿¯æåçæå æ ¼å¼ï¼ä¸ºæç»ç¨æ·æä¾èªç¶çå®è£ ä½éªï¼è¿äºæ ¼å¼å æ¬ Windows ä¸ç msi å exeãmacOS ä¸ç pkg å dmgï¼è¿æ Linux ä¸ç deb å rpmãå®è¿å è®¸å¨æå æ¶æå®å¯å¨æ¶åæ°ï¼å¹¶ä¸å¯ä»¥ä»å½ä»¤è¡ç´æ¥è°ç¨ï¼ä¹å¯ä»¥éè¿ ToolProvider API 以ç¼ç¨æ¹å¼è°ç¨ã注æ jpackage 模ååç§°ä» jdk.incubator.jpackage æ´æ¹ä¸º jdk.jpackageãè¿å°æ¹åæç»ç¨æ·å¨å®è£ åºç¨ç¨åºæ¶çä½éªï¼å¹¶ç®åäºâåºç¨ååºâ模åçé¨ç½²ã å ³äºè¿ä¸ªæå å·¥å ·çå®é 使ç¨ï¼å¯ä»¥çè¿ä¸ªè§é¢ [Playing with Java 16 jpackage](https://www.youtube.com/watch?v=KahYIVzRIkQ)ï¼éè¦æ¢¯åï¼ã ## JEP 393:å¤é¨å åè®¿é® API(ç¬¬ä¸æ¬¡åµå) å¼å ¥å¤é¨å åè®¿é® API 以å 许 Java ç¨åºå®å ¨ææå°è®¿é® Java å ä¹å¤çå¤é¨å åã Java 14([ JEP 370](https://openjdk.org/jeps/370)) çæ¶åï¼ç¬¬ä¸æ¬¡åµåå¤é¨å åè®¿é® APIï¼Java 15 ä¸è¿è¡äºç¬¬äºæ¬¡å¤æ´»ï¼[JEP 383](https://openjdk.org/jeps/383)ï¼ï¼å¨ Java 16 ä¸è¿è¡äºç¬¬ä¸æ¬¡åµåã å¼å ¥å¤é¨å åè®¿é® API çç®çå¦ä¸ï¼ - éç¨ï¼å个 API åºè¯¥è½å¤å¯¹åç§å¤é¨å åï¼å¦æ¬æºå åãæä¹ å åãå å åçï¼è¿è¡æä½ã - å®å ¨ï¼æ 论æä½ä½ç§å åï¼API é½ä¸åºè¯¥ç ´å JVM çå®å ¨æ§ã - æ§å¶ï¼å¯ä»¥èªç±çéæ©å¦ä½éæ¾å åï¼æ¾å¼ãéå¼çï¼ã - å¯ç¨ï¼å¦æéè¦è®¿é®å¤é¨å åï¼API åºè¯¥æ¯ `sun.misc.Unsafa`. ## JEP 394:instanceof 模å¼å¹é (转æ£) | JDK çæ¬ | æ´æ°ç±»å | JEP | æ´æ°å 容 | | ---------- | ----------------- | --------------------------------------- | ---------------------------------------- | | Java SE 14 | preview | [JEP 305](https://openjdk.org/jeps/305) | 馿¬¡å¼å ¥ instanceof 模å¼å¹é ã | | Java SE 15 | Second Preview | [JEP 375](https://openjdk.org/jeps/375) | ç¸æ¯è¾ä¸ä¸ªçæ¬æ ååï¼ç»§ç»æ¶éæ´å¤åé¦ã | | Java SE 16 | Permanent Release | [JEP 394](https://openjdk.org/jeps/394) | 模å¼åéä¸å¨éå¼ä¸º finalã | ä» Java 16 å¼å§ï¼ä½ å¯ä»¥å¯¹ `instanceof` ä¸çåéå¼è¿è¡ä¿®æ¹ã ```java // Old code if (o instanceof String) { String s = (String)o; ... use s ... } // New code if (o instanceof String s) { ... use s ... } ``` ## JEP 395:è®°å½ç±»å(转æ£) è®°å½ç±»ååæ´åå²ï¼ | JDK çæ¬ | æ´æ°ç±»å | JEP | æ´æ°å 容 | | ---------- | ----------------- | -------------------------------------------- | ------------------------------------------------------------------------- | | Java SE 14 | Preview | [JEP 359](https://openjdk.java.net/jeps/359) | å¼å ¥ `record` å ³é®åï¼`record` æä¾ä¸ç§ç´§åçè¯æ³æ¥å®ä¹ç±»ä¸çä¸å¯åæ°æ®ã | | Java SE 15 | Second Preview | [JEP 384](https://openjdk.org/jeps/384) | æ¯æå¨å±é¨æ¹æ³åæ¥å£ä¸ä½¿ç¨ `record`ã | | Java SE 16 | Permanent Release | [JEP 395](https://openjdk.org/jeps/395) | ééæå é¨ç±»å¯ä»¥å®ä¹é常éçéææåã | ä» Java SE 16 å¼å§ï¼ééæå é¨ç±»å¯ä»¥å®ä¹é常éçéææåã ```java public class Outer { class Inner { static int age; } } ``` > å¨ JDK 16 ä¹åï¼å¦æåä¸é¢è¿ç§ä»£ç ï¼IDE ä¼æç¤ºä½ éæå段 age ä¸è½å¨ééæçå é¨ç±»ä¸å®ä¹ï¼é¤éå®ç¨ä¸ä¸ªå¸¸é表达å¼åå§åãï¼The field age cannot be declared static in a non-static inner type, unless initialized with a constant expressionï¼ ## JEP 396:é»è®¤å¼ºå°è£ JDK å é¨å ç´ æ¤ç¹æ§ä¼é»è®¤å¼ºå°è£ JDK çææå é¨å ç´ ï¼ä½å ³é®å é¨ APIï¼ä¾å¦ `sun.misc.Unsafe`ï¼é¤å¤ãé»è®¤æ åµä¸ï¼ä½¿ç¨æ©æçæ¬æåç¼è¯çè®¿é® JDK å é¨ API ç代ç å¯è½ä¸åèµ·ä½ç¨ãé¼å±å¼å人åä»ä½¿ç¨å é¨å ç´ è¿ç§»å°ä½¿ç¨æ å API çæ¹æ³ä¸ï¼ä»¥ä¾¿ä»ä»¬åå ¶ç¨æ·é½å¯ä»¥æ ç¼å级å°å°æ¥ç Java çæ¬ã强å°è£ ç± JDK 9 çå¯å¨å¨é项âillegal-access æ§å¶ï¼å° JDK 15 é»è®¤æ¹ä¸º warningï¼ä» JDK 16 å¼å§é»è®¤ä¸º denyãï¼ç®åï¼ä»ç¶å¯ä»¥ä½¿ç¨å个å½ä»¤è¡é项æ¾å®½å¯¹ææè½¯ä»¶å çå°è£ ï¼å°æ¥åªæä½¿ç¨âadd-opens æå¼ç¹å®çè½¯ä»¶å æè¡ã ## JEP 397:å¯å°ç±»(é¢è§) å¯å°ç±»ç± [JEP 360](https://openjdk.java.net/jeps/360) æåºé¢è§ï¼éæå°äº Java 15 ä¸ãå¨ JDK 16 ä¸ï¼ å¯å°ç±»å¾å°äºæ¹è¿ï¼æ´å ä¸¥æ ¼çå¼ç¨æ£æ¥åå¯å°ç±»çç»§æ¿å ³ç³»ï¼ï¼ç± [JEP 397](https://openjdk.java.net/jeps/397) æåºäºå次é¢è§ã å¨ [Java 14 & 15 æ°ç¹æ§æ¦è§](./java14-15.md) ä¸ï¼ææè¯¦ç»ä»ç»å°å¯å°ç±»ï¼è¿éå°±ä¸ååé¢å¤çä»ç»äºã ## å ¶ä»ä¼å䏿¹è¿ - **JEP 380:Unix-Domain 奿¥åéé**ï¼Unix-domain 奿¥åä¸ç´æ¯å¤§å¤æ° Unix å¹³å°çä¸ä¸ªç¹æ§ï¼ç°å¨å¨ Windows 10 å Windows Server 2019 乿ä¾äºæ¯æãæ¤ç¹æ§ä¸º java.nio.channels å ç奿¥åééåæå¡å¨å¥æ¥åéé API æ·»å äº Unix-domainï¼AF_UNIXï¼å¥æ¥åæ¯æã宿©å±äºç»§æ¿çééæºå¶ä»¥æ¯æ Unix-domain 奿¥åééåæå¡å¨å¥æ¥åééãUnix-domain 奿¥åç¨äºåä¸ä¸»æºä¸çè¿ç¨é´éä¿¡ï¼IPCï¼ãå®ä»¬å¨å¾å¤§ç¨åº¦ä¸ç±»ä¼¼äº TCP/IPï¼åºå«å¨äºå¥æ¥åæ¯éè¿æä»¶ç³»ç»è·¯å¾åè䏿¯ Internet åè®®ï¼IPï¼å°åå端å£å·å¯»åçãå¯¹äºæ¬å°è¿ç¨é´éä¿¡ï¼Unix-domain 奿¥åæ¯ TCP/IP ç¯åè¿æ¥æ´å®å ¨ãæ´ææ - **JEP 389:å¤é¨é¾æ¥å¨ API(åµå)ï¼** 该åµåå¨ API æä¾äºéæç±»åã纯 Java 访é®åç代ç çç¹æ§ï¼è¯¥ API å°å¤§å¤§ç®åç»å®åçåºç忬夿ä¸å®¹æåºéçè¿ç¨ãJava 1.1 就已éè¿ Java åçæ¥å£ï¼JNIï¼æ¯æäºåçæ¹æ³è°ç¨ï¼ä½å¹¶ä¸å¥½ç¨ãJava å¼å人ååºè¯¥è½å¤ä¸ºç¹å®ä»»å¡ç»å®ç¹å®çåçåºãå®è¿æä¾äºå¤æ¥å½æ°æ¯æï¼èæ éä»»ä½ä¸é´ç JNI ç²å代ç ã - **JEP 357:ä» Mercurial è¿ç§»å° Git**ï¼å¨æ¤ä¹åï¼OpenJDK æºä»£ç æ¯ä½¿ç¨çæ¬ç®¡çå·¥å · Mercurial è¿è¡ç®¡çï¼ç°å¨è¿ç§»å°äº Gitã - **JEP 369:è¿ç§»å° GitHub**ï¼å JEP 357 ä» Mercurial è¿ç§»å° Git çæ¹åä¸è´ï¼å¨æçæ¬ç®¡çè¿ç§»å° Git ä¹åï¼éæ©äºå¨ GitHub ä¸æç®¡ OpenJDK 社åºç Git ä»åºãä¸è¿åªå¯¹ JDK 11 以忴é«çæ¬ JDK è¿è¡äºè¿ç§»ã - **JEP 386:ç§»æ¤ Alpine Linux**ï¼Alpine Linux æ¯ä¸ä¸ªç¬ç«çãéåä¸ç Linux åè¡çï¼å®ååçå°ï¼ä¸ä¸ªå®¹å¨éè¦ä¸è¶ è¿ 8MB ç空é´ï¼æå°å®è£ å°ç£çåªéè¦å¤§çº¦ 130MB åå¨ç©ºé´ï¼å¹¶ä¸ååçç®åï¼åæ¶å ¼é¡¾äºå®å ¨æ§ãæ¤ææ¡å° JDK ç§»æ¤å°äº Apline Linuxï¼ç±äº Apline Linux æ¯åºäº musl lib çè½»é级 Linux åè¡çï¼å æ¤å ¶ä» x64 å AArch64 æ¶æä¸ä½¿ç¨ musl lib ç Linux åè¡çä¹éç¨ã - **JEP 388:Windows/AArch64 ç§»æ¤**ï¼è¿äº JEP çéç¹ä¸æ¯ç§»æ¤å·¥ä½æ¬èº«ï¼èæ¯å°å®ä»¬éæå° JDK 主线åå¨åºä¸ï¼JEP 386 å° JDK ç§»æ¤å° Alpine Linux åå ¶ä»ä½¿ç¨ musl ä½ä¸º x64 ä¸ä¸»è¦ C åºçåè¡çä¸ãæ¤å¤ï¼JEP 388 å° JDK ç§»æ¤å° Windows AArch64ï¼ARM64ï¼ã ## åèæç® - [Java Language Changes](https://docs.oracle.com/en/java/javase/16/language/java-language-changes.html) - [Consolidated JDK 16 Release Notes](https://www.oracle.com/java/technologies/javase/16all-relnotes.html) - [Java 16 æ£å¼åå¸ï¼æ°ç¹æ§ä¸ä¸è§£æ](https://www.infoq.cn/article/IAkwhx7i9V7G8zLVEd4L) - [宿 | åæ Java16 æ°è¯æ³ç¹æ§](https://xie.infoq.cn/article/8304c894c4e38318d38ceb116)ï¼åçå¾èµï¼