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

【昕寶爸爸小模塊】深入淺出之JDK21 中的虛擬線程到底是怎么回事(一)

這篇具有很好參考價(jià)值的文章主要介紹了【昕寶爸爸小模塊】深入淺出之JDK21 中的虛擬線程到底是怎么回事(一)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【昕寶爸爸小模塊】深入淺出之JDK21 中的虛擬線程到底是怎么回事(一),# Java并發(fā),java,開發(fā)語言,線程安全,并發(fā)

??博客首頁(yè)???????https://blog.csdn.net/Java_Yangxiaoyuan


???????歡迎優(yōu)秀的你??點(diǎn)贊、???收藏、加??關(guān)注哦。


???????本文章CSDN首發(fā),歡迎轉(zhuǎn)載,要注明出處哦!


???????先感謝優(yōu)秀的你能認(rèn)真的看完本文,有問題歡迎評(píng)論區(qū)交流,都會(huì)認(rèn)真回復(fù)!



一、?典型解析


虛擬線程這個(gè)名字很多人可能比較懵,但是如果對(duì)像Go、Ruby、python等語言有一些了解的話,就會(huì)很快的反應(yīng)過來,其實(shí)這就是協(xié)程。


在以前的JDK中,Java的線程模型其實(shí)比較簡(jiǎn)單,在大多數(shù)操作系統(tǒng)中,主要采用的是基于輕量級(jí)進(jìn)程實(shí)現(xiàn)的一對(duì)一的線程模型,簡(jiǎn)單來說就是每一個(gè)Java線程對(duì)應(yīng)一個(gè)操作系統(tǒng)中的輕量級(jí)進(jìn)程,這種線程模型中的線程創(chuàng)建、析構(gòu)及同步等動(dòng)作,都需要進(jìn)行系統(tǒng)調(diào)用。而系統(tǒng)調(diào)用則需要在 用戶態(tài) (UserMode)內(nèi)核態(tài) (Kernel Mode) 中來回切換,所以性能開銷還是很大的。


而新引入的虛擬線程,是JDK 實(shí)現(xiàn)的輕量級(jí)線程,他可以避免上下文切換帶來的的額外耗費(fèi)。他的實(shí)現(xiàn)原理其實(shí)是JDK不再是每一個(gè)線程都一對(duì)一的對(duì)應(yīng)一個(gè)操作系統(tǒng)的線程了,而是會(huì)將多個(gè)虛擬線程映射到少量操作系統(tǒng)線程中,通過有效的調(diào)度來游免那些上下文切換。


在JDK 21,有多種方法可以創(chuàng)建協(xié)程,如Thread.startVirtualThread()Executors.newVirtualThreadPerTaskExecutor() 等。


1.1 ?在 JDK21 有哪些庫(kù)可以用于虛擬線程支持


在 JDK 21 中,用于虛擬線程支持的庫(kù)主要包括以下兩個(gè):


  1. Project Loom:這是 Oracle 正在開發(fā)的一個(gè)項(xiàng)目,旨在為 Java 添加輕量級(jí)線程(也稱為虛擬線程或纖程)。虛擬線程是一種輕量級(jí)的線程,與常規(guī)線程相比,它們具有更低的創(chuàng)建和銷毀成本,并且可以在共享執(zhí)行環(huán)境中并發(fā)運(yùn)行。Project Loom 提供了一個(gè)基于虛擬線程的并發(fā)模型,以簡(jiǎn)化并發(fā)編程和提高應(yīng)用程序的可伸縮性。

  1. Quasar:另一個(gè)用于虛擬線程支持的庫(kù)是 Quasar。Quasar 是一個(gè)開源項(xiàng)目,提供了基于 JVM 的纖程(fibre)和并行計(jì)算功能。它使用字節(jié)碼轉(zhuǎn)換技術(shù)來支持在 JVM 上運(yùn)行輕量級(jí)線程,并提供了一套 API 和工具來簡(jiǎn)化并發(fā)編程。Quasar 支持與 Java 應(yīng)用程序的集成,并且可以與現(xiàn)有的 Java 框架和庫(kù)一起使用。

注意:JDK 21 本身并沒有直接提供虛擬線程支持的庫(kù)。這些庫(kù)是作為單獨(dú)的項(xiàng)目開發(fā)的,可能需要單獨(dú)安裝和使用。此外,這些庫(kù)的具體實(shí)現(xiàn)和可用性可能隨著時(shí)間的推移而有所變化,建議查看最新的官方文檔以獲取最準(zhǔn)確的信息。


1.2 ?虛擬線程和進(jìn)程的區(qū)別是什么


虛擬線程和進(jìn)程在概念、資源占用、執(zhí)行效率、系統(tǒng)開銷等方面存在明顯的區(qū)別。


  1. 概念:進(jìn)程是操作系統(tǒng)中的一個(gè)執(zhí)行實(shí)例,有獨(dú)立的內(nèi)存空間、虛擬地址空間等資源。虛擬線程是進(jìn)程中的一條執(zhí)行路徑,用于完成特定任務(wù)。進(jìn)程是一個(gè)容器,而線程則是容器內(nèi)的執(zhí)行單元。

  1. 資源占用:進(jìn)程擁有獨(dú)立的內(nèi)存空間和資源,不同的進(jìn)程之間通常是相互獨(dú)立的。而線程共享相同的內(nèi)存空間和其他資源,線程之間的通信和協(xié)作更加方便。

  1. 執(zhí)行效率:由于線程之間的切換開銷比進(jìn)程之間的切換開銷小,因此多線程編程通常比多進(jìn)程編程效率更高。

  1. 系統(tǒng)開銷:在創(chuàng)建或撤消進(jìn)程時(shí),由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時(shí)的開銷。

以下是一個(gè)使用Java代碼的詳細(xì)解釋:



/**
* @author xinbaobaba
* 展示了虛擬線程和進(jìn)程的區(qū)別
*/
public class ProcessAndThreadComparison {
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)進(jìn)程
        Process process = new Process();
        // 創(chuàng)建一個(gè)線程
        Thread thread = new Thread(() -> {
            // 線程執(zhí)行的代碼邏輯
        });

        // 啟動(dòng)進(jìn)程
        process.start();
        // 啟動(dòng)線程
        thread.start();
    }
}

示例中:創(chuàng)建了一個(gè)進(jìn)程和一個(gè)線程,并分別啟動(dòng)它們。下面我們分別解釋進(jìn)程和線程的不同點(diǎn):


進(jìn)程

  • 進(jìn)程是一個(gè)獨(dú)立的執(zhí)行環(huán)境,擁有自己的內(nèi)存空間、系統(tǒng)資源等。
  • 進(jìn)程之間的資源是相互隔離的,一個(gè)進(jìn)程的崩潰不會(huì)影響其他進(jìn)程的執(zhí)行。
  • 進(jìn)程的創(chuàng)建和銷毀需要較高的系統(tǒng)開銷,因?yàn)樾枰峙浜突厥召Y源。
  • 進(jìn)程之間通信需要通過特定的機(jī)制,如管道、消息隊(duì)列等。

線程

  • 線程是進(jìn)程中的一個(gè)執(zhí)行路徑,共享進(jìn)程的內(nèi)存空間和其他資源。
  • 線程之間的切換開銷較小,因?yàn)樗鼈児蚕硐嗤馁Y源。
  • 線程的創(chuàng)建和銷毀相對(duì)較快,系統(tǒng)開銷較小。
  • 線程之間可以通過共享內(nèi)存進(jìn)行通信,協(xié)作更加方便。

通過以上代碼和解釋,我們可以看出虛擬線程和進(jìn)程的區(qū)別主要在于資源占用、執(zhí)行效率、系統(tǒng)開銷等方面。在實(shí)際應(yīng)用中,根據(jù)需求選擇合適的方式來實(shí)現(xiàn)并發(fā)編程,以提高應(yīng)用程序的性能和可伸縮性。


1.3 ?為什么虛擬線程更適合用于處理大量并發(fā)的場(chǎng)景


虛擬線程更適合用于處理大量并發(fā)的場(chǎng)景,主要原因如下:


1. 更高的并發(fā)能力:虛擬線程由于其輕量級(jí)的特性,能夠支持更高的并發(fā)能力。相比傳統(tǒng)線程,虛擬線程的創(chuàng)建和銷毀成本更低,使得能夠同時(shí)處理更多的任務(wù),更好地應(yīng)對(duì)高并發(fā)場(chǎng)景。


2. 更好的資源利用:由于虛擬線程共享進(jìn)程資源,可以更好地利用系統(tǒng)資源,避免資源的浪費(fèi)。多個(gè)虛擬線程可以共享相同的內(nèi)存空間和其他資源,使得資源利用率更高。

3. 更低的系統(tǒng)開銷:與進(jìn)程相比,虛擬線程的切換開銷更小。在進(jìn)行線程切換時(shí),虛擬線程的上下文切換更加快速和高效,降低了系統(tǒng)開銷,提高了處理大量并發(fā)任務(wù)的效率。


4. 更方便的編程模型:虛擬線程可以與現(xiàn)有的Java框架和庫(kù)集成,提供更方便的并發(fā)編程模型。開發(fā)人員可以使用熟悉的Java語言和API進(jìn)行編程,同時(shí)享受到虛擬線程帶來的高并發(fā)優(yōu)勢(shì)。


總之,虛擬線程適合處理大量并發(fā)的場(chǎng)景,主要是因?yàn)樗鼈兡軌蛱峁└叩牟l(fā)能力、更好的資源利用、更低的系統(tǒng)開銷以及更方便的編程模型。這些優(yōu)勢(shì)使得虛擬線程成為處理高并發(fā)場(chǎng)景的理想選擇。


1.4 ?JDK21中的其他并發(fā)編程模型


JDK 21中的其他并發(fā)編程模型包括:


  1. Reactor模式:用于構(gòu)建響應(yīng)式應(yīng)用程序,可以更好地處理大量并發(fā)請(qǐng)求。
  2. Actor模型:一種并發(fā)計(jì)算模型,通過消息傳遞的方式實(shí)現(xiàn)不同進(jìn)程或線程之間的通信。
  3. Dataflow模型:一種基于數(shù)據(jù)流的編程模型,可以自動(dòng)處理并行和并發(fā)問題。
  4. Promises和Futures模型:用于異步編程,可以避免回調(diào)地獄,使代碼更加簡(jiǎn)潔易讀。
  5. Phaser模型:用于協(xié)調(diào)多個(gè)并行任務(wù),確保它們按順序執(zhí)行。
  6. Multicore并發(fā)模型:利用多核CPU的優(yōu)勢(shì),通過并行處理提高程序性能。

這些模型在JDK 21中都有相應(yīng)的實(shí)現(xiàn)和工具支持,可以幫助開發(fā)人員更好地處理并發(fā)問題,提高應(yīng)用程序的性能和可伸縮性。選擇合適的并發(fā)模型取決于具體的應(yīng)用場(chǎng)景和需求。


二、?拓展知識(shí)倉(cāng)

2.1 ?JDK21中的其他并發(fā)編程模型是什么


除了虛擬線程,JDK 21還提供了其他一些并發(fā)編程模型。以下是一些可能的例子:

  1. CompletableFuture:這是JDK 8中引入的一個(gè)類,用于處理異步編程和并發(fā)編程。它提供了一種簡(jiǎn)單的方式來編寫非阻塞的代碼,并且可以鏈?zhǔn)秸{(diào)用。
  2. Phaser:這是一個(gè)同步類,用于協(xié)調(diào)并行任務(wù)。它可以幫助你同步一組線程,以便它們可以一起完成某個(gè)任務(wù)。
  3. ForkJoinPool:這是JDK 7中引入的一個(gè)類,用于實(shí)現(xiàn)Fork/Join并發(fā)模式。這種模式可以將一個(gè)大任務(wù)分解成多個(gè)小任務(wù),然后使用工作竊取算法將小任務(wù)分配給不同的線程,最后再將結(jié)果合并。

Demo:


import java.util.concurrent.*;

/**
* 
* 虛擬線程、CompletableFuture和Phaser
*/
public class ConcurrencyModelsComparison {
    public static void main(String[] args) {
        // 虛擬線程示例
        VirtualThread virtualThread = new VirtualThread();
        virtualThread.start();

        // CompletableFuture示例
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
            // 異步執(zhí)行的代碼邏輯
            System.out.println("CompletableFuture task executed");
        });
        future.join(); // 等待異步任務(wù)完成

        // Phaser示例
        Phaser phaser = new Phaser(2); // 創(chuàng)建Phaser,初始階段數(shù)為2
        phaser.register(); // 注冊(cè)當(dāng)前線程
        phaser.arriveAndAwaitAdvance(); // 等待所有線程到達(dá)并同步
        System.out.println("Phaser task executed");
    }
}

上面的代碼,我們分別演示了 虛擬線程 、` CompletableFuture和Phaser的使用。以下是它們各自的特點(diǎn):


虛擬線程


  • 虛擬線程是一種輕量級(jí)的線程,與常規(guī)線程相比具有更低的創(chuàng)建和銷毀成本。
  • 虛擬線程可以在共享執(zhí)行環(huán)境中并發(fā)運(yùn)行,提供更好的并發(fā)能力。
  • 虛擬線程的切換開銷較小,可以快速地在不同任務(wù)之間切換。
  • 虛擬線程可以與其他Java框架和庫(kù)集成,提供更方便的并發(fā)編程模型。

CompletableFuture


  • CompletableFuture是Java 8引入的一個(gè)類,用于處理異步編程和并發(fā)編程。
  • 它提供了一種簡(jiǎn)單的方式來編寫非阻塞的代碼,通過鏈?zhǔn)秸{(diào)用來處理異步操作的結(jié)果。
  • CompletableFuture可以與其他并發(fā)模型(如虛擬線程)結(jié)合使用,以實(shí)現(xiàn)更復(fù)雜的并發(fā)邏輯。
  • 它提供了豐富的方法來處理異步任務(wù)的完成、異常處理等,使得代碼更加簡(jiǎn)潔易讀。

Phaser


  • Phaser是一個(gè)同步類,用于協(xié)調(diào)并行任務(wù)。
  • 它可以幫助你同步一組線程,以便它們可以一起完成某個(gè)任務(wù)。
  • Phaser通過階段(phase)和參與者(participants)的概念來進(jìn)行線程同步,能夠處理更復(fù)雜的同步場(chǎng)景。
  • 它通常用于解決需要等待一組線程都完成才能繼續(xù)執(zhí)行的問題。

2.2 ?為什么虛擬線程更適合用于處理大量并發(fā)的場(chǎng)景呢


虛擬線程更適合用于處理大量并發(fā)的場(chǎng)景,主要是因?yàn)樗鼈兙哂幸韵聝?yōu)勢(shì):


  1. 輕量級(jí):虛擬線程比傳統(tǒng)線程更加輕量級(jí),因此它們的啟動(dòng)和銷毀的開銷更小。在應(yīng)用程序需要?jiǎng)?chuàng)建大量線程時(shí),這種輕量級(jí)特性使得虛擬線程的性能更優(yōu)。
  2. 高并發(fā)能力:由于虛擬線程的輕量級(jí)特性,它們能夠支持更高的并發(fā)能力。這意味著應(yīng)用程序能夠更好地處理高并發(fā)場(chǎng)景,而不會(huì)因?yàn)檫^多的線程而消耗過多的系統(tǒng)資源。
  3. 低內(nèi)存消耗:虛擬線程相比傳統(tǒng)線程具有更低的內(nèi)存消耗,這使得它們能夠更好地支持大規(guī)模的并發(fā)編程。在處理大量并發(fā)任務(wù)時(shí),低內(nèi)存消耗有助于防止因資源不足而導(dǎo)致的性能瓶頸。
  4. 簡(jiǎn)化并發(fā)編程:虛擬線程的設(shè)計(jì)初衷是為了簡(jiǎn)化并發(fā)編程。通過提供更高級(jí)別的抽象,虛擬線程使得編寫、維護(hù)和觀察高吞吐量并發(fā)應(yīng)用程序的工作量大大減少。這有助于提高開發(fā)人員的工作效率,并減少因并發(fā)編程復(fù)雜性而導(dǎo)致的錯(cuò)誤。
  5. 高吞吐量:雖然虛擬線程不能提供比平臺(tái)線程更快的代碼執(zhí)行速度,但它們能夠通過數(shù)量?jī)?yōu)勢(shì)實(shí)現(xiàn)更高的吞吐量。在并發(fā)任務(wù)數(shù)量較高(超過幾千個(gè)),并且工作負(fù)載不綁定CPU的情況下,虛擬線程有助于提高典型服務(wù)器應(yīng)用程序的吞吐量。這是因?yàn)檫@類應(yīng)用程序由大量并發(fā)任務(wù)組成,這些任務(wù)通?;ㄙM(fèi)大量時(shí)間等待。
  6. 與現(xiàn)有框架集成:許多服務(wù)器框架選擇使用虛擬線程來自動(dòng)處理請(qǐng)求,為每個(gè)傳入請(qǐng)求創(chuàng)建一個(gè)新的虛擬線程,并在其中運(yùn)行應(yīng)用程序的業(yè)務(wù)邏輯。這種集成方式使得處理請(qǐng)求的現(xiàn)有Java代碼可以輕松地在虛擬線程中運(yùn)行,進(jìn)一步簡(jiǎn)化了并發(fā)編程。

總結(jié):注意:虛擬線程通過其輕量級(jí)、高并發(fā)能力、低內(nèi)存消耗等特性,以及與現(xiàn)有框架的集成和簡(jiǎn)化并發(fā)編程的優(yōu)勢(shì),使其成為處理大量并發(fā)的場(chǎng)景的理想選擇。


2.3 ?虛擬線程和物理線程有什么區(qū)別


虛擬線程和物理線程是計(jì)算機(jī)領(lǐng)域中的兩個(gè)重要概念,它們?cè)诙x、資源占用、調(diào)度和并發(fā)性等方面存在明顯的區(qū)別。


  1. 定義:物理線程是指實(shí)際的硬件執(zhí)行線程,通常一個(gè)核心對(duì)應(yīng)一個(gè)物理線程。虛擬線程則是在操作系統(tǒng)上創(chuàng)建的邏輯執(zhí)行單元,它不直接對(duì)應(yīng)特定的CPU核心或處理器。
  2. 資源占用:物理線程需要實(shí)際的處理器、內(nèi)存和其他硬件資源來執(zhí)行任務(wù)。虛擬線程則只需要一部分CPU時(shí)間片和內(nèi)存資源,因?yàn)樗⒉恢苯訉?duì)應(yīng)一個(gè)硬件執(zhí)行線程。
  3. 調(diào)度:物理線程由操作系統(tǒng)的調(diào)度器來分配處理器時(shí)間。虛擬線程則是由線程庫(kù)或操作系統(tǒng)的用戶級(jí)線程管理器來調(diào)度,這使得虛擬線程可以在不涉及內(nèi)核切換的情況下進(jìn)行線程切換。
  4. 并發(fā)性:物理線程是真正的并發(fā)執(zhí)行,可以在多個(gè)處理器核心上同時(shí)執(zhí)行不同的任務(wù)。虛擬線程在同一時(shí)間只能有一個(gè)線程在執(zhí)行,它們的并發(fā)性是通過線程切換來實(shí)現(xiàn)的。
  5. 親和性:物理線程可以綁定到特定的CPU核心或處理器,以提高性能。虛擬線程通常不與特定的CPU核心或處理器相關(guān)聯(lián)。

物理線程是直接由硬件執(zhí)行的線程,而虛擬線程是由操作系統(tǒng)上的線程庫(kù)或用戶級(jí)線程管理器創(chuàng)建的線程。虛擬線程提供了一種更高級(jí)別的抽象,使得并發(fā)編程更加簡(jiǎn)化,特別適合處理大量并發(fā)的場(chǎng)景。


好的,以下是一個(gè)使用Java代碼的詳細(xì)介紹,包括虛擬線程和物理線程的區(qū)別:

public class ThreadComparison {
    public static void main(String[] args) {
        // 創(chuàng)建物理線程
        Thread physicalThread = new Thread(() -> {
            // 物理線程執(zhí)行的代碼邏輯
            System.out.println("Physical thread task executed");
        });
        physicalThread.start();

        // 創(chuàng)建虛擬線程
        VirtualThread virtualThread = new VirtualThread();
        virtualThread.start();
    }
}

代碼中,分別創(chuàng)建了一個(gè)物理線程和一個(gè)虛擬線程,并啟動(dòng)它們。以下是它們之間的主要區(qū)別:

物理線程

  • 物理線程是操作系統(tǒng)級(jí)別的線程,直接由硬件執(zhí)行。
  • 物理線程的創(chuàng)建和銷毀成本較高,因?yàn)樾枰峙浜突厥詹僮飨到y(tǒng)資源。
  • 物理線程可以直接訪問操作系統(tǒng)資源,具有較高的權(quán)限。
  • 物理線程的調(diào)度由操作系統(tǒng)的調(diào)度器負(fù)責(zé),具有較高的優(yōu)先級(jí)。

虛擬線程

  • 虛擬線程是用戶級(jí)別的線程,由線程庫(kù)或用戶級(jí)線程管理器創(chuàng)建。
  • 虛擬線程的創(chuàng)建和銷毀成本較低,因?yàn)樗鼈儾恍枰苯臃峙洳僮飨到y(tǒng)資源。
  • 虛擬線程通常用于簡(jiǎn)化并發(fā)編程,提供更高級(jí)別的抽象。
  • 虛擬線程的調(diào)度由線程庫(kù)或用戶級(jí)線程管理器負(fù)責(zé),可以更好地適應(yīng)應(yīng)用程序的需求。

總結(jié):物理線程和虛擬線程的主要區(qū)別在于它們的級(jí)別、創(chuàng)建和銷毀成本、調(diào)度方式和訪問權(quán)限。物理線程是操作系統(tǒng)級(jí)別的線程,具有較高的權(quán)限和優(yōu)先級(jí),而虛擬線程是用戶級(jí)別的線程,主要用于簡(jiǎn)化并發(fā)編程。在處理大量并發(fā)的場(chǎng)景時(shí),虛擬線程由于其輕量級(jí)和高并發(fā)能力的特性,成為更好的選擇。

<br/

2.4 ?虛擬線程和物理線程哪個(gè)更好呢


虛擬線程和物理線程各有優(yōu)劣,哪個(gè)更好取決于具體的場(chǎng)景和需求。以下是對(duì)兩者的一些比較:


虛擬線程的優(yōu)點(diǎn):


  1. 輕量級(jí):虛擬線程的創(chuàng)建和銷毀成本較低,適用于創(chuàng)建大量線程的場(chǎng)景。
  2. 高并發(fā):由于虛擬線程的輕量級(jí)特性,它們能夠支持更高的并發(fā)能力,適合處理大量并發(fā)的任務(wù)。
  3. 資源高效:虛擬線程只占用必要資源,有助于減少系統(tǒng)資源的浪費(fèi)。
  4. 簡(jiǎn)化并發(fā)編程:虛擬線程提供更高級(jí)別的抽象,簡(jiǎn)化并發(fā)編程的工作量,減少出錯(cuò)的可能性。
  5. 與框架集成:許多服務(wù)器框架選擇使用虛擬線程來處理請(qǐng)求,這有助于簡(jiǎn)化服務(wù)器應(yīng)用程序的開發(fā)。

虛擬線程的缺點(diǎn):


  1. 性能:由于虛擬線程不是直接由硬件執(zhí)行,因此在某些情況下可能會(huì)降低性能。
  2. 資源限制:虛擬線程的數(shù)量通常受到操作系統(tǒng)或線程庫(kù)的限制。
  3. 調(diào)度開銷:雖然虛擬線程的切換開銷相對(duì)較小,但在高并發(fā)場(chǎng)景下,大量的虛擬線程可能會(huì)導(dǎo)致調(diào)度器過載。
  4. 與操作系統(tǒng)交互:由于虛擬線程是在用戶空間中運(yùn)行的,因此在進(jìn)行某些操作系統(tǒng)級(jí)別的操作時(shí)可能受限。

物理線程的優(yōu)點(diǎn):


  1. 性能:物理線程直接由硬件執(zhí)行,執(zhí)行效率通常較高。
  2. 資源綁定:物理線程可以綁定到特定的處理器或核心上,充分利用硬件資源。
  3. 低延遲:由于物理線程直接與硬件交互,因此在某些需要低延遲的場(chǎng)景中可能更有優(yōu)勢(shì)。
  4. 操作系統(tǒng)交互:物理線程可以直接與操作系統(tǒng)交互,進(jìn)行系統(tǒng)級(jí)別的操作。

物理線程的缺點(diǎn):


  1. 創(chuàng)建和銷毀成本:物理線程的創(chuàng)建和銷毀成本較高,不適合創(chuàng)建大量線程的場(chǎng)景。
  2. 資源消耗:每個(gè)物理線程都需要分配獨(dú)立的處理器和內(nèi)存資源,可能導(dǎo)致資源的過度消耗。
  3. 調(diào)度開銷:物理線程的調(diào)度由操作系統(tǒng)的調(diào)度器負(fù)責(zé),可能存在較大的調(diào)度開銷。
  4. 編程復(fù)雜性:并發(fā)編程需要處理多線程間的同步和通信,可能增加開發(fā)的復(fù)雜性和出錯(cuò)的可能性。

總結(jié):選擇虛擬線程還是物理線程取決于具體的場(chǎng)景和需求。在處理大量并發(fā)的場(chǎng)景時(shí),虛擬線程由于其輕量級(jí)和高并發(fā)能力的特性成為更好的選擇。而在需要高性能、低延遲或直接與操作系統(tǒng)交互的場(chǎng)景中,物理線程可能更合適。


2.5 ?虛擬線程的優(yōu)缺點(diǎn)


虛擬線程的優(yōu)點(diǎn)主要包括:


  1. 輕量級(jí):虛擬線程的創(chuàng)建和銷毀成本較低,相比傳統(tǒng)線程,它們更加輕量級(jí)。這使得在應(yīng)用程序需要?jiǎng)?chuàng)建大量線程時(shí),虛擬線程的性能優(yōu)勢(shì)更加明顯。
  2. 高并發(fā)能力:由于虛擬線程的輕量級(jí)特性,它們能夠支持更高的并發(fā)能力。這意味著應(yīng)用程序能夠更好地處理高并發(fā)場(chǎng)景,提高整體性能。
  3. 低內(nèi)存消耗:虛擬線程相比傳統(tǒng)線程具有更低的內(nèi)存消耗,這使得它們能夠更好地支持大規(guī)模的并發(fā)編程。
  4. 簡(jiǎn)化并發(fā)編程:虛擬線程提供更高級(jí)別的抽象,簡(jiǎn)化并發(fā)編程的工作量,減少出錯(cuò)的可能性。
  5. 與框架集成:許多服務(wù)器框架選擇使用虛擬線程來處理請(qǐng)求,這有助于簡(jiǎn)化服務(wù)器應(yīng)用程序的開發(fā)。

虛擬線程缺點(diǎn)


  1. 性能:虛擬線程不是直接由硬件執(zhí)行,因此在某些情況下可能會(huì)降低性能。
  2. 資源限制:虛擬線程的數(shù)量通常受到操作系統(tǒng)或線程庫(kù)的限制。
  3. 調(diào)度開銷:雖然虛擬線程的切換開銷相對(duì)較小,但在高并發(fā)場(chǎng)景下,大量的虛擬線程可能會(huì)導(dǎo)致調(diào)度器過載。
  4. 與操作系統(tǒng)交互:由于虛擬線程是在用戶空間中運(yùn)行的,因此在進(jìn)行某些操作系統(tǒng)級(jí)別的操作時(shí)可能受限。

總體來說,虛擬線程在處理大量并發(fā)的場(chǎng)景時(shí)具有優(yōu)勢(shì),但需要根據(jù)具體需求和應(yīng)用場(chǎng)景進(jìn)行權(quán)衡。文章來源地址http://www.zghlxwxcb.cn/news/detail-794946.html


到了這里,關(guān)于【昕寶爸爸小模塊】深入淺出之JDK21 中的虛擬線程到底是怎么回事(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【昕寶爸爸小模塊】ConcurrentHashMap是如何保證線程安全的

    【昕寶爸爸小模塊】ConcurrentHashMap是如何保證線程安全的

    在JDK 1.7中,ConcurrentHashMap使用了分段鎖技術(shù) ,即將哈希表分成多個(gè)段,每個(gè)段擁有一個(gè)獨(dú)立的鎖。這樣可以在多個(gè)線程同時(shí)訪問哈希表時(shí),只需要鎖住需要操作的那個(gè)段,而不是整個(gè)哈希表,從而提高了并發(fā)性能。 雖然JDK 1.7的這種方式可以減少鎖競(jìng)爭(zhēng),但是在高并發(fā)場(chǎng)景下

    2024年02月01日
    瀏覽(24)
  • 深入淺出對(duì)話系統(tǒng)——自然語言理解模塊

    深入淺出對(duì)話系統(tǒng)——自然語言理解模塊

    首先回顧一下自然語言理解的概念。 自然語言理解(Natural Language Understanding)包含三個(gè)子模塊: 其中領(lǐng)域識(shí)別和意圖識(shí)別都是分類問題,而語義槽填充屬于序列標(biāo)注問題。所以,在自然語言理解中,我們要解決兩個(gè)分類任務(wù)和一個(gè)序列標(biāo)注任務(wù)。既然其中兩個(gè)問題都屬于分類任

    2024年02月08日
    瀏覽(21)
  • 【昕寶爸爸小模塊】HashMap用在并發(fā)場(chǎng)景存在的問題

    【昕寶爸爸小模塊】HashMap用在并發(fā)場(chǎng)景存在的問題

    這是一個(gè)非常典型的問題,但是只會(huì)出現(xiàn)在1.7及以前的版本,1.8之后就被修復(fù)了。 雖然JDK 1.8修復(fù)了某些多線程對(duì)HashMap進(jìn)行操作的問題,但在并發(fā)場(chǎng)景下,HashMap仍然存在一些問題。 如: 雖然JDK 1.8修復(fù)了多線程同時(shí)對(duì)HashMap擴(kuò)容時(shí)可能引起的鏈表死循環(huán)問題 , 但在JDK 1.8版本

    2024年01月24日
    瀏覽(27)
  • 【昕寶爸爸小模塊】日志系列之什么是分布式日志系統(tǒng)

    【昕寶爸爸小模塊】日志系列之什么是分布式日志系統(tǒng)

    ??博客首頁(yè)???????https://blog.csdn.net/Java_Yangxiaoyuan ???????歡迎優(yōu)秀的你??點(diǎn)贊、???收藏、加??關(guān)注哦。 ???????本文章CSDN首發(fā),歡迎轉(zhuǎn)載,要注明出處哦! ???????先感謝優(yōu)秀的你能認(rèn)真的看完本文,有問題歡迎評(píng)論區(qū)交流,都會(huì)認(rèn)真回復(fù)! 現(xiàn)在,很多應(yīng)

    2024年02月20日
    瀏覽(23)
  • 【昕寶爸爸小模塊】淺談之創(chuàng)建線程的幾種方式

    【昕寶爸爸小模塊】淺談之創(chuàng)建線程的幾種方式

    ??博客首頁(yè)???????https://blog.csdn.net/Java_Yangxiaoyuan ???????歡迎優(yōu)秀的你??點(diǎn)贊、???收藏、加??關(guān)注哦。 ???????本文章CSDN首發(fā),歡迎轉(zhuǎn)載,要注明出處哦! ???????先感謝優(yōu)秀的你能認(rèn)真的看完本文,有問題歡迎評(píng)論區(qū)交流,都會(huì)認(rèn)真回復(fù)! 在Java中,共有

    2024年01月18日
    瀏覽(18)
  • 【昕寶爸爸小模塊】如何讓Java的線程池順序執(zhí)行任務(wù)

    【昕寶爸爸小模塊】如何讓Java的線程池順序執(zhí)行任務(wù)

    ??博客首頁(yè)???????https://blog.csdn.net/Java_Yangxiaoyuan ???????歡迎優(yōu)秀的你??點(diǎn)贊、???收藏、加??關(guān)注哦。 ???????本文章CSDN首發(fā),歡迎轉(zhuǎn)載,要注明出處哦! ???????先感謝優(yōu)秀的你能認(rèn)真的看完本文,有問題歡迎評(píng)論區(qū)交流,都會(huì)認(rèn)真回復(fù)! Java中的線程池

    2024年01月16日
    瀏覽(19)
  • 【昕寶爸爸小模塊】Java中Timer實(shí)現(xiàn)定時(shí)調(diào)度的原理(解析)

    【昕寶爸爸小模塊】Java中Timer實(shí)現(xiàn)定時(shí)調(diào)度的原理(解析)

    Java中的 Timer 類是用于計(jì)劃執(zhí)行一項(xiàng)任務(wù)一次或重復(fù)固定延遲執(zhí)行的簡(jiǎn)單工具。它使用一個(gè)名為 TaskQueue 的內(nèi)部類來存儲(chǔ)要執(zhí)行的任務(wù),這些任務(wù)被封裝為 TimerTask 對(duì)象。 Timer 實(shí)現(xiàn)定時(shí)調(diào)度的基本原理: 創(chuàng)建 Timer 對(duì)象 :當(dāng)你創(chuàng)建一個(gè) Timer 對(duì)象時(shí),它會(huì)實(shí)例化一個(gè)線程(不是

    2024年01月16日
    瀏覽(22)
  • 深入淺出 Java 中的神鎖:ReentrantLock,還有誰不會(huì)?

    深入淺出 Java 中的神鎖:ReentrantLock,還有誰不會(huì)?

    來源:jiannan.blog.csdn.net/article/details/121331360 話不多說,扶我起來,我還可以繼續(xù)擼。 在學(xué)習(xí) ReentrantLock 源碼之前,先來回顧一下鏈表、隊(duì)列數(shù)據(jù)結(jié)構(gòu)的基本概念~~ 小學(xué)一、二年級(jí)的時(shí)候,學(xué)校組織戶外活動(dòng),老師們一般都要求同學(xué)之間小手牽著小手。這個(gè)場(chǎng)景就很類似一

    2024年02月08日
    瀏覽(29)
  • 深入淺出理解CSS中的3D變換:踏上立體視覺之旅

    在現(xiàn)代Web設(shè)計(jì)中,CSS 3D變換已經(jīng)成為增強(qiáng)用戶體驗(yàn)、打造沉浸式界面的重要手段。借助CSS的3D變換屬性,我們可以輕松實(shí)現(xiàn)元素在三維空間中的旋轉(zhuǎn)、移動(dòng)、縮放等操作,從而創(chuàng)造出生動(dòng)活潑、富有立體感的網(wǎng)頁(yè)效果。本文將從基礎(chǔ)知識(shí)出發(fā),通過易于理解的概念解析和實(shí)戰(zhàn)

    2024年04月22日
    瀏覽(27)
  • 深入淺出Node.js中的node_modules

    深入淺出Node.js中的node_modules

    在Node.js中, node_modules 是一個(gè)特殊的目錄,通常用來存放項(xiàng)目所依賴的 npm 包及其相關(guān)依賴,以供應(yīng)用程序在運(yùn)行時(shí)動(dòng)態(tài)加載所需的模塊和庫(kù)文件。 當(dāng)使用 npm 或者 yarn 等包管理工具安裝npm包時(shí),會(huì)將相關(guān)依賴包下載并保存在項(xiàng)目的 node_modules 目錄下,以便于在應(yīng)用程序中引用

    2024年02月06日
    瀏覽(25)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包