国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java 20 新功能介紹

這篇具有很好參考價值的文章主要介紹了Java 20 新功能介紹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?  bin pwd
/Users/darcy/develop/jdk-20.0.1.jdk/Contents/Home/bin
?  bin ./java -version
openjdk version "20.0.1" 2023-04-18
OpenJDK Runtime Environment (build 20.0.1+9-29)
OpenJDK 64-Bit Server VM (build 20.0.1+9-29, mixed mode, sharing)

Java 20 共帶來 7 個新特性功能,其中三個是孵化提案,孵化也就是說尚在征求意見階段,未來可能會刪除此功能。

JEP 描述 分類
429 作用域值(孵化器) Project Loom,Java 開發(fā)相關
432 Record 模式匹配(第二次預覽) Project Amber,新的語言特性
433 switch 的模式匹配(第四次預覽) Project Amber,新的語言特性
434 外部函數(shù)和內存 API(第二個預覽版) Project Panama,非 Java 庫
436 虛擬線程(第二個預覽版) Project Loom,Java 開發(fā)相關
437 結構化并發(fā)(第二孵化器) Project Loom,Java 開發(fā)相關
438 Vector API(第五孵化器) Project Panama,非 Java 庫

JEP:JDK Enhancement Proposal,JDK 增強建議,或者叫 Java 未來發(fā)展建議。

JDK 20 不是長期支持 (LTS) 版本,因此它只會在六個月后被 JDK 21 取代之前收到更新。JDK 17( 2021 年 9 月 14 日發(fā)布)是 Java 的最新 LTS 版本。Oracle 宣布計劃將 LTS 版本之間的時間從三年縮短到兩年,因此 JDK 21(2023 年 9 月)計劃成為下一個LTS。

Java 20 安裝

Java 20 OpenJDK 下載:https://jdk.java.net/19/

Java 20 OpenJDK 文檔:https://openjdk.java.net/projects/jdk/20/

Java 20 OracleJDK 下載:Oracle JDK 20 Archive Downloads

# 此文中示例代碼運行都在 Java 20 環(huán)境下使用命令
?  src $ /jdk-20.0.1.jdk/Contents/Home/bin/java --version                                                         
openjdk 20.0.1 2023-04-18
OpenJDK Runtime Environment (build 20.0.1+9-29)
OpenJDK 64-Bit Server VM (build 20.0.1+9-29, mixed mode, sharing)
?  src $ /jdk-20.0.1.jdk/Contents/Home/bin/java  --add-modules jdk.incubator.concurrent Xxx.java
WARNING: Using incubator modules: jdk.incubator.concurrent
hello wdbyte
沒有信息

JEP 429: Scoped Value

在線程之間共享變量不是一件簡單的事,可以使用 ThreadLocal 來保存當前線程變量,但是需要手動清理,開發(fā)者常常忘記,且變量不能被子線程繼承;而使用 InheritableThreadLocal 共享信息可以被子線程繼承,但是數(shù)據會拷貝多份,占用更多內存。

引入Scoped values允許在線程內和線程間共享不可變數(shù)據,這比線程局部變量更加方便,尤其是在使用大量虛擬線程時。這提高了易用性、可理解性、健壯性以及性能。不過這是一個正在孵化的 API,未來可能會被刪除。

scoped values 有下面幾個目標:

  • 易用性——提供一個編程模型來在線程內和子線程之間共享數(shù)據,從而簡化數(shù)據流的推理。
  • 可理解性——使共享數(shù)據的生命周期從代碼的句法結構中可見。
  • 穩(wěn)健性——確保調用者共享的數(shù)據只能由合法的被調用者檢索。
  • 性能——將共享數(shù)據視為不可變的,以便允許大量線程共享,并啟用運行時優(yōu)化。

例子

如果每個請求都是用一個單獨的線程來處理,現(xiàn)在需要接受一個請求,然后根據不同身份訪問數(shù)據庫,那么我們可以用傳遞參數(shù)的方式,直接把身份信息在調用訪問數(shù)據庫方法時傳遞過去。如果不這么做,那么就要使用 ThreadLocal 來共享變量了。

Thread 1                             Thread 2
--------                             --------
8. 數(shù)據庫 - 開始查詢 ()                8. throw new InvalidPrincipalException()
7. 數(shù)據庫 - 開始訪問 () <---+          7. 數(shù)據庫 - 開始訪問 () <---+ 
   ...                    |             ...                   |
   ...                身份(管理員)        ...                  身份(訪客)
2. 開始處理(..)            |          2. 開始處理(..)            |
1. 收到請求(..) -----------+          1. 收到請求(..) -----------+   

示意代碼:

class Server {
    final static ThreadLocal<Principal> PRINCIPAL = new ThreadLocal<>();  

    void serve(Request request, Response response) {
        var level     = (request.isAuthorized() ? ADMIN : GUEST);
        var principal = new Principal(level);
        PRINCIPAL.set(principal);                                         
        Application.handle(request, response);
    }
}

class DBAccess {
    DBConnection open() {
        var principal = Server.PRINCIPAL.get();                           
        if (!principal.canOpen()) throw new InvalidPrincipalException();
        return newConnection(...);                                        
    }
}

這是我們常見的寫法,但是使用 ThreadLocal 的問題是:

  • PRINCIPAL.set(principal) 可以被任意設置修改。
  • 使用 ThreadLocal 可能會忘記 remove。
  • 如果想要子線程繼承共享的變量,需要占用新的內存空間。
  • 在虛擬線程場景下,可能會有幾十萬線程,使用 ThreadLocal 過于復雜,且有安全性能隱患。

虛擬線程自 Java 19 引入:JEP 425: 虛擬線程 (預覽)

使用 ScopedValue

import jdk.incubator.concurrent.ScopedValue;

/**
 * 啟動命令加上 --add-modules jdk.incubator.concurrent
 *
 * @author https://www.wdbyte.com
 */
public class Jep429ScopedValueTest {
    final static ScopedValue<String> SCOPED_VALUE = ScopedValue.newInstance();

    public static void main(String[] args) {
        // 創(chuàng)建線程
        Thread thread1 = new Thread(Jep429ScopedValueTest::handle);
        Thread thread2 = new Thread(Jep429ScopedValueTest::handle);
        String str = "hello wdbyte";
        // 傳入線程里使用的字符串信息
        ScopedValue.where(SCOPED_VALUE, str).run(thread1);
        ScopedValue.where(SCOPED_VALUE, str).run(thread2);
        // 執(zhí)行完畢自動清空,這里獲取不到了。
        System.out.println(SCOPED_VALUE.orElse("沒有信息"));
    }
    public static void handle() {
        String result = SCOPED_VALUE.get();
        System.out.println(result);
    }
}

運行:

?  src $ /jdk-20.0.1.jdk/Contents/Home/bin/java --version                                                         
openjdk 20.0.1 2023-04-18
OpenJDK Runtime Environment (build 20.0.1+9-29)
OpenJDK 64-Bit Server VM (build 20.0.1+9-29, mixed mode, sharing)
  
?  src $ /jdk-20.0.1.jdk/Contents/Home/bin/java  --add-modules jdk.incubator.concurrent Jep429ScopedValueTest.java
WARNING: Using incubator modules: jdk.incubator.concurrent
hello wdbyte.com
hello wdbyte.com  
沒有信息

可見使用 ScopedValue 有幾個顯而易見的好處。

  • 代碼方便,容易理解。符合編程邏輯。
  • 不允許修改值,安全性高。(沒有 set 方法)
  • 生命周期明確。只傳遞到 run() 方法體中。
  • 不需要清理,自動釋放。
  • 從實現(xiàn)來講,也是一種輕量級實現(xiàn)。

JEP 432: Record 模式匹配(二次預覽)

在 Java 14 的 JEP 359 中增加了 Record 類,在 Java 16 的 JEP 394中,新增了 instanceof 模式匹配。

這兩項都簡化了 Java 開發(fā)的代碼編寫。在 Java 19 的 JEP 405 中,增又加了 Record 模式匹配功能的第一次預覽,這把 JEP 359 和 JEP 394 的功能進行了結合,但是還不夠強大,現(xiàn)在 JEP 432 又對其進行了增強。

JEP 359 功能回顧:

/**
 * @author https://www.wdbyte.com
 */
public class RecordTest {
    public static void main(String[] args) {
        Dog dog = new Dog("name", 1);
        System.out.println(dog.name()); // name
        System.out.println(dog.age());  // 1
    }
}

record Dog(String name, Integer age) {
}

JEP 394 功能回顧:

// Old code
if (obj instanceof String) {
    String s = (String)obj;
    ... use s ...
}

// New code
if (obj instanceof String s) {
    ... use s ...
}

JEP 432 例子

而現(xiàn)在,可以進行更加復雜的組合嵌套,依舊可以準確識別類型。

/**
 * @author https://www.wdbyte.com
 */
public class Jep432RecordAndInstance {
    public static void main(String[] args) {
        ColoredPoint coloredPoint1 = new ColoredPoint(new Point(0, 0), Color.RED);
        ColoredPoint coloredPoint2 = new ColoredPoint(new Point(1, 1), Color.GREEN);
        Rectangle rectangle = new Rectangle(coloredPoint1, coloredPoint2);
        printUpperLeftColoredPoint(rectangle);
    }

    static void printUpperLeftColoredPoint(Rectangle r) {
        if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {
            System.out.println(ul.c());
        }
    }
}

record Point(int x, int y) {}
enum Color { RED, GREEN, BLUE }
record ColoredPoint(Point p, Color c) {}
record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}

輸出:RED。

JEP 433: switch 模式匹配(四次預覽)

Switch 的使用體驗改造早在 Java 17 就已經開始了,下面是之前文章的一些介紹。

  • JEP 406:switch 的類型匹配(預覽)
  • JEP 420:switch 表達式(二次預覽)
  • JEP 427: switch 模式匹配 (三次預覽)

現(xiàn)在 JEP 433 進行第四次預覽,對其功能進行了增強,直接從下面的新老代碼看其變化。

/**
 * @author https://www.wdbyte.com
 */
public class JEP433SwitchTest {
    public static void main(String[] args) {
        Object obj = 123;
        System.out.println(matchOld(obj)); // 是個數(shù)字
        System.out.println(matchNew(obj)); // 是個數(shù)字
        obj = "wdbyte.com";
        System.out.println(matchOld(obj)); // 是個字符串,長度大于2
        System.out.println(matchNew(obj)); // 是個字符串,長度大于2
    }

    /**
     * 老代碼
     *
     * @param obj
     * @return
     */
    public static String matchOld(Object obj) {
        if (obj == null) {
            return "數(shù)據為空";
        }
        if (obj instanceof String) {
            String s = obj.toString();
            if (s.length() > 2) {
                return "是個字符串,長度大于2";
            }
            if (s.length() <= 2) {
                return "是個字符串,長度小于等于2";
            }
        }
        if (obj instanceof Integer) {
            return "是個數(shù)字";
        }
        throw new IllegalStateException("未知數(shù)據:" + obj);
    }

    /**
     * 新代碼
     *
     * @param obj
     * @return
     */
    public static String matchNew(Object obj) {
        String res = switch (obj) {
            case null -> "數(shù)據為空";
            case String s when s.length() > 2 -> "是個字符串,長度大于2";
            case String s when s.length() <= 2 -> "是個字符串,長度小于等于于2";
            case Integer i -> "是個數(shù)字";
            default -> throw new IllegalStateException("未知數(shù)據:" + obj);
        };
        return res;
    }

}

JEP 434: 外部函數(shù)和內存 API(二次預覽)

此功能引入的 API 允許 Java 開發(fā)者與 JVM 之外的代碼和數(shù)據進行交互,通過調用外部函數(shù)(JVM 之外)和安全的訪問外部內存(非 JVM 管理),讓 Java 程序可以調用本機庫并處理本機數(shù)據,而不會像 JNI 一樣存在很多安全風險。

這不是一個新功能,自 Java 14 就已經引入,此次對其進行了性能、通用性、安全性、易用性上的優(yōu)化。

歷史

  • Java 14 JEP 370 引入了外部內存訪問 API(孵化器)。
  • Java 15 JEP 383 引入了外部內存訪問 API(第二孵化器)。
  • Java 16 JEP 389 引入了外部鏈接器 API(孵化器)。
  • Java 16 JEP 393 引入了外部內存訪問 API(第三孵化器)。
  • Java 17 JEP 412 引入了外部函數(shù)和內存 API(孵化器)。
  • Java 18 JEP 419 引入了外部函數(shù)和內存 API(二次孵化器)。
  • Java 19 JEP 424 引入了外部函數(shù)和內存 API(孵化器)。

JEP 436: 虛擬線程(二次預覽)

通過將輕量級虛擬線程引入 Java 平臺,簡化了編寫、維護和觀察高吞吐量、并發(fā)應用程序的過程。使開發(fā)人員能夠使用現(xiàn)有的 JDK 工具和技術輕松地排除故障、調試和分析并發(fā)應用程序,虛擬線程有助于加速應用程序開發(fā)。

這個特性自 Java 19 的 JEP 425: 虛擬線程 (預覽)引入,在 Java 19 已經進行了詳細介紹。

JEP 425: 虛擬線程 (預覽)

JEP 437: Structured Concurrency(二次孵化)

通過引入用于結構化并發(fā) API 來簡化多線程編程。結構化并發(fā)將在不同線程中運行的多個任務視為單個工作單元,從而簡化錯誤處理,提高可靠性,增強可觀察性。因為是個孵化狀態(tài)提案,這里不做過多研究。

  • 相關 Java 19,JEP 428:結構化并發(fā)(孵化)

JEP 438: Vector API(五次孵化)

再次提高性能,實現(xiàn)優(yōu)于等效標量計算的性能。這是通過引入一個 API 來表達矢量計算,該 API 在運行時可靠地編譯為支持的 CPU 架構上的最佳矢量指令,從而實現(xiàn)優(yōu)于等效標量計算的性能。Vector API 在 JDK 16 到 19 中孵化。JDK 20 整合了這些版本用戶的反饋以及性能改進和實現(xiàn)增強。

一如既往,文章中代碼存放在 Github.com/niumoo/javaNotes.

文章持續(xù)更新,可以微信搜一搜「 程序猿阿朗 」或訪問「程序猿阿朗博客 」第一時間閱讀。本文 Github.com/niumoo/JavaNotes 已經收錄,有很多系列文章,歡迎Star。文章來源地址http://www.zghlxwxcb.cn/news/detail-434794.html

到了這里,關于Java 20 新功能介紹的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C++11 新功能

    C++11 新功能

    在2003年C++標準委員會曾經提交了一份技術勘誤表(簡稱TC1),使得C++03這個名字已經取代了C++98稱為 C++11之前的最新C++標準名稱。不過由于TC1主要是對C++98標準中的漏洞進行修復,語言的核心部分則沒 有改動,因此人們習慣性的把兩個標準合并稱為C++98/03標準。從C++0x到C++11,C+

    2023年04月12日
    瀏覽(28)
  • Midjourney新功能:角色參照指南

    基本概念 角色參照(Character Reference) :這個功能允許用戶在不同的圖像生成中保持給定參照角色的一致性。 適用模型 :適用于Midjourney V6和Niji6型號。 功能亮點 跨風格一致性 :可以在不同風格(如動漫風、寫實風)中保持角色特征一致。 面部、著裝、發(fā)型調控 :用戶可以

    2024年04月10日
    瀏覽(42)
  • 【C++】C++11 -- 新功能

    在C++11之前一個類有6個默認成員函數(shù),在C++11標準中又新增了兩個默認成員函數(shù),分別是移動構造函數(shù)和移動賦值函數(shù) 默認移動構造和移動賦值生成的條件 移動構造函數(shù)的生成條件:沒有自己實現(xiàn)移動構造函數(shù),并且沒有自己實現(xiàn)析構函數(shù),拷貝構造函數(shù)和拷貝賦值函數(shù) 移

    2024年02月17日
    瀏覽(52)
  • TypeScript 5.1發(fā)布,新功能更新

    TypeScript 5.1發(fā)布,新功能更新

    1:返回類型增加undefined 這里設置了一個別名 fun,當時使用它的時候,我們必須顯示返回一個 undefined 。 現(xiàn)在你可以直接設置返回類型: 而不僅限于 void any 。 4.3版本 :? 5.1版本 :? 2:getter可以設置和 setter 的不相關類型 在之前版本 ,get 返回類型應該為 set 的子類型,如

    2024年02月09日
    瀏覽(24)
  • SOLIDWORKS 2023新功能揭秘(一):3D CAD功能的十大更新

    SolidWorks 3D CAD ?軟件擁有設計、模擬、成本估算、可制造性檢查、CAM、可持續(xù)設計和數(shù)據管理等功能,同時還包含適用于鈑金,焊件,曲面,模具,產品配置,DFM和CAM的專業(yè)工具,支持ECAD/MCAD協(xié)作,復雜的零部件庫以及高級真實感渲染。更重要的是具有結構和運動分析功能,

    2024年02月05日
    瀏覽(18)
  • 三星泄露微軟 Copilot 新功能:用自然語言操控各種功能

    三星泄露微軟 Copilot 新功能:用自然語言操控各種功能

    3 月 11 日消息,微軟計劃本月晚些時候發(fā)布新款 Surface 電腦和適用于?Windows 11?的 Copilot 新功能,但三星似乎等不及了,在其即將推出的 Galaxy Book4 系列產品宣傳材料中泄露了一些即將到來的 Copilot 功能。 三星官網上發(fā)布的圖片證實了此前關于微軟正為其人工智能助手 Copilo

    2024年04月09日
    瀏覽(30)
  • Microsoft Releases .NET 7新功能

    Microsoft Releases .NET 7新功能

    Microsoft Visual Studio是一種統(tǒng)一的開發(fā)體驗,使開發(fā)人員能夠跨web、云和設備創(chuàng)建多層應用程序。11月8日,微軟發(fā)布了該強大開發(fā)環(huán)境的下一版本:Visual Studio 2022 17.4版。 除了修復許多頂級報告的bug之外,17.4版還包括了許多基于開發(fā)者社區(qū)建議的新功能,包括: Visual Studio的本

    2024年02月06日
    瀏覽(30)
  • 揭密.NET 8到底有什么新功能

    .NET 8 是微軟于2021年8月24日宣布的下一代編程語言和框架,它是 .NET 宇宙的一部分,與 C# (Common Language Infrastructure) 緊密集成。.NET 8 引入了許多新功能,如原生編譯、值類型 (Value Types)、結構化并發(fā) (structured concurrency) 和快速數(shù)組 (RapidArray)。.NET 8 還支持本機 (native) AOT (Ahead-Of

    2024年02月03日
    瀏覽(27)
  • C# 12 預覽版的新功能

    作者:Kathleen Dollard 排版:Alan Wang Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的發(fā)布推進了 C# 12的發(fā)展。此預覽版包含的功能為將來的性能增強奠定了基礎?,F(xiàn)在,您能夠在庫中更方便的使用內聯(lián)函數(shù)。此預覽版首次推出了一項實驗性功能:攔截器。該功能允許生成器重新路由代

    2024年02月14日
    瀏覽(26)
  • 【C++】C++11類的新功能

    【C++】C++11類的新功能

    ?? 樊梓慕: 個人主頁 ??? 個人專欄: 《C語言》 《數(shù)據結構》 《藍橋杯試題》 《LeetCode刷題筆記》 《實訓項目》 《C++》 《Linux》 《算法》 ?? 每一個不曾起舞的日子,都是對生命的辜負 目錄 前言 默認成員函數(shù) 類成員變量初始化 強制生成默認函數(shù)的default 禁止生

    2024年04月17日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包