--- title: Java 19 æ°ç¹æ§æ¦è§ category: Java tag: - Javaæ°ç¹æ§ --- JDK 19 å®äº 9 æ 20 æ¥æ£å¼åå¸ä»¥ä¾ç产使ç¨ï¼éé¿ææ¯æçæ¬ãä¸è¿ï¼JDK 19 䏿ä¸äºæ¯è¾éè¦çæ°ç¹æ§å¼å¾å ³æ³¨ã JDK 19 åªæ 7 个æ°ç¹æ§ï¼ - [JEP 405: Record Patternsï¼è®°å½æ¨¡å¼ï¼](https://openjdk.org/jeps/405)ï¼é¢è§ï¼ - [JEP 422: Linux/RISC-V Port](https://openjdk.org/jeps/422) - [JEP 424: Foreign Function & Memory APIï¼å¤é¨å½æ°åå å APIï¼](https://openjdk.org/jeps/424)ï¼é¢è§ï¼ - [JEP 425: Virtual Threadsï¼èæçº¿ç¨ï¼](https://openjdk.org/jeps/425)ï¼é¢è§ï¼ - [JEP 426: Vectorï¼åéï¼API](https://openjdk.java.net/jeps/426)ï¼ç¬¬å次åµåï¼ - [JEP 427: Pattern Matching for switchï¼switch 模å¼å¹é ï¼](https://openjdk.java.net/jeps/427) - [JEP 428: Structured Concurrencyï¼ç»æåå¹¶åï¼](https://openjdk.org/jeps/428)ï¼åµåï¼ è¿éåªå¯¹ 424ã425ã426ã428 è¿ 4 个æè§å¾æ¯è¾éè¦çæ°ç¹æ§è¿è¡è¯¦ç»ä»ç»ã ç¸å ³é 读ï¼[OpenJDK Java 19 ææ¡£](https://openjdk.org/projects/jdk/19/) ## JEP 424: å¤é¨å½æ°åå å APIï¼é¢è§ï¼ Java ç¨åºå¯ä»¥éè¿è¯¥ API ä¸ Java è¿è¡æ¶ä¹å¤ç代ç åæ°æ®è¿è¡äºæä½ãéè¿é«æå°è°ç¨å¤é¨å½æ°ï¼å³ JVM ä¹å¤ç代ç ï¼åå®å ¨å°è®¿é®å¤é¨å åï¼å³ä¸å JVM 管ççå åï¼ï¼è¯¥ API 使 Java ç¨åºè½å¤è°ç¨æ¬æºåºå¹¶å¤çæ¬æºæ°æ®ï¼èä¸ä¼å JNI 飿 ·å±é©åèå¼±ã å¤é¨å½æ°åå å API å¨ Java 17 ä¸è¿è¡äºç¬¬ä¸è½®åµåï¼ç± [JEP 412](https://openjdk.java.net/jeps/412) æåºã第äºè½®åµåç±[ JEP 419](https://openjdk.org/jeps/419) æåºå¹¶éæå°äº Java 18 ä¸ï¼é¢è§ç± [JEP 424](https://openjdk.org/jeps/424) æåºå¹¶éæå°äº Java 19 ä¸ã 卿²¡æå¤é¨å½æ°åå å API ä¹åï¼ - Java éè¿ [`sun.misc.Unsafe`](https://hg.openjdk.java.net/jdk/jdk/file/tip/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java) æä¾ä¸äºæ§è¡ä½çº§å«ãä¸å®å ¨æä½çæ¹æ³ï¼å¦ç´æ¥è®¿é®ç³»ç»å åèµæºãèªä¸»ç®¡çå åèµæºçï¼ï¼`Unsafe` 类让 Java è¯è¨æ¥æäºç±»ä¼¼ C è¯è¨æé䏿 ·æä½å å空é´çè½åçåæ¶ï¼ä¹å¢å äº Java è¯è¨çä¸å®å ¨æ§ï¼ä¸æ£ç¡®ä½¿ç¨ `Unsafe` ç±»ä¼ä½¿å¾ç¨åºåºéçæ¦çå大ã - Java 1.1 就已éè¿ Java åçæ¥å£ï¼JNIï¼æ¯æäºåçæ¹æ³è°ç¨ï¼ä½å¹¶ä¸å¥½ç¨ãJNI å®ç°èµ·æ¥è¿äºå¤æï¼æ¥éª¤ç¹çï¼å ·ä½çæ¥éª¤å¯ä»¥åèè¿ç¯æç« ï¼[Guide to JNI (Java Native Interface)](https://www.baeldung.com/jni) ï¼ï¼ä¸å JVM çè¯è¨å®å ¨æºå¶æ§å¶ï¼å½±å Java è¯è¨ç跨平å°ç¹æ§ãå¹¶ä¸ï¼JNI çæ§è½ä¹ä¸è¡ï¼å 为 JNI æ¹æ³è°ç¨ä¸è½ä»è®¸å¤å¸¸è§ç JIT ä¼å(å¦å è)ä¸åçãè½ç¶[JNA](https://github.com/java-native-access/jna)ã[JNR](https://github.com/jnr/jnr-ffi)å[JavaCPP](https://github.com/bytedeco/javacpp)çæ¡æ¶å¯¹ JNI è¿è¡äºæ¹è¿ï¼ä½ææè¿æ¯ä¸å¤ªçæ³ã å¼å ¥å¤é¨å½æ°åå å API å°±æ¯ä¸ºäºè§£å³ Java 访é®å¤é¨å½æ°åå¤é¨å ååå¨çä¸äºçç¹ã Foreign Function & Memory API (FFM API) å®ä¹äºç±»åæ¥å£ï¼ - åé å¤é¨å åï¼`MemorySegment`ãã`MemoryAddress`å`SegmentAllocator`ï¼ï¼ - æä½å访é®ç»æåçå¤é¨å åï¼`MemoryLayout`, `VarHandle`ï¼ - æ§å¶å¤é¨å åçåé åéæ¾ï¼`MemorySession`ï¼ - è°ç¨å¤é¨å½æ°ï¼`Linker`ã`FunctionDescriptor`å`SymbolLookup`ã ä¸é¢æ¯ FFM API 使ç¨ç¤ºä¾ï¼è¿æ®µä»£ç è·åäº C åºå½æ°ç `radixsort` æ¹æ³å¥æï¼ç¶å使ç¨å®å¯¹ Java æ°ç»ä¸çå个å符串è¿è¡æåºã ```java // 1. å¨Cåºè·¯å¾ä¸æ¥æ¾å¤é¨å½æ° Linker linker = Linker.nativeLinker(); SymbolLookup stdlib = linker.defaultLookup(); MethodHandle radixSort = linker.downcallHandle( stdlib.lookup("radixsort"), ...); // 2. åé å ä¸å å以åå¨å个å符串 String[] javaStrings = { "mouse", "cat", "dog", "car" }; // 3. åé å å¤å å以åå¨å个æé SegmentAllocator allocator = implicitAllocator(); MemorySegment offHeap = allocator.allocateArray(ValueLayout.ADDRESS, javaStrings.length); // 4. å°å符串ä»å ä¸å¤å¶å°å å¤ for (int i = 0; i < javaStrings.length; i++) { // å¨å å¤åé ä¸ä¸ªå符串ï¼ç¶åå卿åå®çæé MemorySegment cString = allocator.allocateUtf8String(javaStrings[i]); offHeap.setAtIndex(ValueLayout.ADDRESS, i, cString); } // 5. éè¿è°ç¨å¤é¨å½æ°å¯¹å 夿°æ®è¿è¡æåº radixSort.invoke(offHeap, javaStrings.length, MemoryAddress.NULL, '\0'); // 6. å°(éæ°æåºç)å符串ä»å å¤å¤å¶å°å ä¸ for (int i = 0; i < javaStrings.length; i++) { MemoryAddress cStringPtr = offHeap.getAtIndex(ValueLayout.ADDRESS, i); javaStrings[i] = cStringPtr.getUtf8String(0); } assert Arrays.equals(javaStrings, new String[] {"car", "cat", "dog", "mouse"}); // true ``` ## JEP 425: èæçº¿ç¨ï¼é¢è§ï¼ èæçº¿ç¨ï¼Virtual Thread-ï¼æ¯ JDK è䏿¯ OS å®ç°çè½»é级线ç¨(Lightweight Processï¼LWPï¼ï¼è®¸å¤èæçº¿ç¨å ±äº«åä¸ä¸ªæä½ç³»ç»çº¿ç¨ï¼èæçº¿ç¨çæ°éå¯ä»¥è¿å¤§äºæä½ç³»ç»çº¿ç¨çæ°éã èæçº¿ç¨å¨å ¶ä»å¤çº¿ç¨è¯è¨ä¸å·²ç»è¢«è¯å®æ¯ååæç¨çï¼æ¯å¦ Go ä¸ç GoroutineãErlang ä¸çè¿ç¨ã èæçº¿ç¨é¿å äºä¸ä¸æåæ¢çé¢å¤èè´¹ï¼å ¼é¡¾äºå¤çº¿ç¨çä¼ç¹ï¼ç®åäºé«å¹¶åç¨åºç夿ï¼å¯ä»¥ææåå°ç¼åãç»´æ¤åè§å¯é«ååéå¹¶ååºç¨ç¨åºçå·¥ä½éã ç¥ä¹æä¸ä¸ªå ³äº Java 19 èæçº¿ç¨çè®¨è®ºï¼æå ´è¶£çå¯ä»¥å»ççï¼https://www.zhihu.com/question/536743167 ã Java èæçº¿ç¨ç详ç»è§£è¯»ååçå¯ä»¥çä¸é¢è¿ä¸¤ç¯æç« ï¼ - [Java19 æ£å¼ GAï¼çèæçº¿ç¨å¦ä½å¤§å¹ æé«ç³»ç»ååé](https://mp.weixin.qq.com/s/yyApBXxpXxVwttr01Hld6Q) - [èæçº¿ç¨ - VirtualThread æºç éè§](https://www.cnblogs.com/throwable/p/16758997.html) ## JEP 426: åé 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 ä¸ã å¨ [Java 18 æ°ç¹æ§æ¦è§](./java18.md) ä¸ï¼ææè¯¦ç»ä»ç»å°åé APIï¼è¿éå°±ä¸ååé¢å¤çä»ç»äºã ## JEP 428: ç»æåå¹¶å(åµå) JDK 19 å¼å ¥äºç»æåå¹¶åï¼ä¸ç§å¤çº¿ç¨ç¼ç¨æ¹æ³ï¼ç®çæ¯ä¸ºäºéè¿ç»æåå¹¶å API æ¥ç®åå¤çº¿ç¨ç¼ç¨ï¼å¹¶ä¸æ¯ä¸ºäºå代`java.util.concurrent`ï¼ç®åå¤äºåµåå¨é¶æ®µã ç»æåå¹¶åå°ä¸å线ç¨ä¸è¿è¡çå¤ä¸ªä»»å¡è§ä¸ºå个工ä½åå ï¼ä»èç®åé误å¤çãæé«å¯é æ§å¹¶å¢å¼ºå¯è§å¯æ§ãä¹å°±æ¯è¯´ï¼ç»æåå¹¶åä¿çäºå线ç¨ä»£ç çå¯è¯»æ§ãå¯ç»´æ¤æ§åå¯è§å¯æ§ã ç»æåå¹¶åçåºæ¬ API æ¯[`StructuredTaskScope`](https://download.java.net/java/early_access/loom/docs/api/jdk.incubator.concurrent/jdk/incubator/concurrent/StructuredTaskScope.html)ã`StructuredTaskScope` æ¯æå°ä»»å¡æå为å¤ä¸ªå¹¶ååä»»å¡ï¼å¨å®ä»¬èªå·±ç线ç¨ä¸æ§è¡ï¼å¹¶ä¸åä»»å¡å¿ é¡»å¨ä¸»ä»»å¡ç»§ç»ä¹å宿ã `StructuredTaskScope` çåºæ¬ç¨æ³å¦ä¸ï¼ ```java try (var scope = new StructuredTaskScope