一区二区三区中文国产亚洲_另类视频区第一页_日韩精品免费视频_女人免费视频_国产综合精品久久亚洲

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時隨地免費學(xué)習(xí)課程

當(dāng)前位置:首頁  >  技術(shù)干貨  > Java領(lǐng)域中的線程機(jī)制-管程

Java領(lǐng)域中的線程機(jī)制-管程

來源:千鋒教育
發(fā)布人:qyf
時間: 2022-08-03 15:33:00 1659511980

  我們都知道,經(jīng)過多年的發(fā)展和無數(shù)Java開發(fā)者的不懈努力,Java已經(jīng)由一門單純的計算機(jī)編程語言,逐漸演變成一套強(qiáng)大的以及仍在可持續(xù)發(fā)展中的技術(shù)體系平臺。

  雖然,Java設(shè)計者們根據(jù)不同的技術(shù)規(guī)范,把Java劃分為3種結(jié)構(gòu)獨立且又彼此依賴的技術(shù)體系,分別是Java SE,Java EE 以及Java ME,其中Java EE 在廣泛應(yīng)用在企業(yè)級開發(fā)領(lǐng)域中。

  除了包括Java API組件外,其衍生和擴(kuò)充了Web組件,事務(wù)組件,分布式組件,EJB組件,消息組件等,并且持續(xù)發(fā)展到如今,其中,雖然有許多組件現(xiàn)如今不再適用,但是許多組件在我們?nèi)粘i_發(fā)工作中,扮演著同樣重要的角色和依舊服務(wù)著我們?nèi)招略庐惖臉I(yè)務(wù)需求。

  綜合Java EE的這些技術(shù),我們可以根據(jù)我們的實際需要和滿足我們的業(yè)務(wù)需求的情況下,可以快速構(gòu)建出一個具備高性能,結(jié)構(gòu)嚴(yán)謹(jǐn)且相對穩(wěn)定的應(yīng)用平臺,雖然現(xiàn)在云原生時代異軍突起許多基于非Java的其他技術(shù)平臺,但是在分布式時代,Java EE是用于構(gòu)建SOA架構(gòu)的首先平臺,甚至基于SpringCloud構(gòu)建微服務(wù)應(yīng)用平臺也離不開Java EE 的支撐。

  個人覺得,Java的持續(xù)發(fā)展需要感謝Google,正是起初Google將Java作為Android操作系統(tǒng)的應(yīng)用層編程語言,使得Java可以在PC時代和移動互聯(lián)網(wǎng)時代得到快速發(fā)展,可以用于手持設(shè)備,嵌入式設(shè)備,個人PC設(shè)備,高性能的集群服務(wù)器和大型機(jī)器平臺。

  當(dāng)然,Java的發(fā)展也不是一帆風(fēng)順的,也曾被許多開發(fā)者詬病和嫌棄,但是就憑Java在行業(yè)里能否覆蓋的場景來說,對于它的友好性和包容性,這不由讓我們心懷敬意。其中,除了Java有豐富的內(nèi)置API供我們使用外,尤其Java對于并發(fā)編程的支持,也是我們最難以釋懷的,甚至是我們作為Java開發(fā)者最頭疼的問題所在。

  雖然,并發(fā)編程這個技術(shù)領(lǐng)域已經(jīng)發(fā)展了半個世紀(jì)了,相關(guān)的理論和技術(shù)紛繁復(fù)雜。那有沒有一種核心技術(shù)可以很方便地解決我們的并發(fā)問題呢?今天,我們就來一起走進(jìn)Java領(lǐng)域的并發(fā)編程的核心——Java線程機(jī)制。

  基本概述

  在Java中,對于Java語言層面的線程,我們基本都不會太陌生,甚至耳熟能詳。但是在此之前,我們先來探討一下,什么是管程技術(shù)?Java 語言在 1.5 之前,提供的唯一的并發(fā)原語就是管程,而且 1.5 之后提供的 SDK 并發(fā)包,也是以管程技術(shù)為基礎(chǔ)的。除此之外,其中C/C++、C# 等高級語言也都支持管程。

  關(guān)于管程

  管程(Monitor)是指定義了一個數(shù)據(jù)結(jié)構(gòu)和能為并發(fā)進(jìn)程所執(zhí)行的一組操作,這組操作能同步進(jìn)程和改變管程中的數(shù)據(jù)。主要是指提供了一種機(jī)制,線程可以臨時放棄互斥訪問,等待某些條件得到滿足后,重新獲得執(zhí)行權(quán)恢復(fù)它的互斥訪問。

1

  所謂管程,指的是管理共享變量以及對共享變量的操作過程,讓他們支持并發(fā)。翻譯為 Java 領(lǐng)域的語言,就是管理類的成員變量和成員方法,讓這個類是線程安全的。

  基本定義

2


  首先,系統(tǒng)中的各種硬件資源和軟件資源均可用數(shù)據(jù)結(jié)構(gòu)抽象地描述其資源特性,即用少量信息和對該資源所執(zhí)行的操作來表征該資源,而忽略它們的內(nèi)部結(jié)構(gòu)和實現(xiàn)細(xì)節(jié)。

  其次,可以利用共享數(shù)據(jù)結(jié)構(gòu)抽象地表示系統(tǒng)中的共享資源,并且將對該共享數(shù)據(jù)結(jié)構(gòu)實施的特定操作定義為一組過程。進(jìn)程對共享資源的申請、釋放和其它操作必須通過這組過程,間接地對共享數(shù)據(jù)結(jié)構(gòu)實現(xiàn)操作。

  然后,對于請求訪問共享資源的諸多并發(fā)進(jìn)程,可以根據(jù)資源的情況接受或阻塞,確保每次僅有一個進(jìn)程進(jìn)入管程,執(zhí)行這組過程,使用共享資源,達(dá)到對共享資源所有訪問的統(tǒng)一管理,有效地實現(xiàn)進(jìn)程互斥。

  最后,代表共享資源的數(shù)據(jù)結(jié)構(gòu)以及由對該共享數(shù)據(jù)結(jié)構(gòu)實施操作的一組過程所組成的資源管理程序共同構(gòu)成了一個操作系統(tǒng)的資源管理模塊,我們稱之為管程,管程被請求和釋放資源的進(jìn)程所調(diào)用。

  綜上所述,管程(Monitor)是指定義了一個數(shù)據(jù)結(jié)構(gòu)和能為并發(fā)進(jìn)程所執(zhí)行的一組操作,這組操作能同步進(jìn)程和改變管程中的數(shù)據(jù)。主要是指提供了一種機(jī)制,線程可以臨時放棄互斥訪問,等待某些條件得到滿足后,重新獲得執(zhí)行權(quán)恢復(fù)它的互斥訪問。

  基本組成

3

  由上述的定義可知,管程由四部分組成:

  管程的名稱;

  局部于管程的共享數(shù)據(jù)結(jié)構(gòu)說明;

  對該數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作的一組過程;

  對局部于管程的共享數(shù)據(jù)設(shè)置初始值的語句

  實際上,管程中包含了面向?qū)ο蟮乃枷耄鼘⒈碚鞴蚕碣Y源的數(shù)據(jù)結(jié)構(gòu)及其對數(shù)據(jù)結(jié)構(gòu)操作的一組過程,包括同步機(jī)制,都集中并封裝在一個對象內(nèi)部,隱藏了實現(xiàn)細(xì)節(jié)。

  封裝于管程內(nèi)部的數(shù)據(jù)結(jié)構(gòu)僅能被封裝于管程內(nèi)部的過程所訪問,任何管程外的過程都不能訪問它;反之,封裝于管程內(nèi)部的過程也僅能訪問管程內(nèi)的數(shù)據(jù)結(jié)構(gòu)。

  所有進(jìn)程要訪問臨界資源時,都只能通過管程間接訪問,而管程每次只準(zhǔn)許一個進(jìn)程進(jìn)入管程,執(zhí)行管程內(nèi)的過程,從而實現(xiàn)了進(jìn)程互斥。

  基本特點

4


  管程是一種程序設(shè)計語言的結(jié)構(gòu)成分,它和信號量有同等的表達(dá)能力,從語言的角度看,管程主要有以下特點:

  模塊化,即管程是一個基本程序單位,可以單獨編譯;

  抽象數(shù)據(jù)類型,指管程中不僅有數(shù)據(jù),而且有對數(shù)據(jù)的操作;

  信息屏蔽,指管程中的數(shù)據(jù)結(jié)構(gòu)只能被管程中的過程訪問,這些過程也是在管程內(nèi)部定義的,供管程外的進(jìn)程調(diào)用,而管程中的數(shù)據(jù)結(jié)構(gòu)以及過程(函數(shù))的具體實現(xiàn)外部不可見。

  基本模型

5

  在管程的發(fā)展史上,先后出現(xiàn)過三種不同的管程模型,分別是:Hasen 模型、Hoare 模型和 MESA 模型。其中,現(xiàn)在廣泛應(yīng)用的是 MESA 模型,并且 Java 管程的實現(xiàn)參考的也是 MESA 模型。

  接下來,我們就針對幾種管程模型分別來簡單的說明一下,它們之間的區(qū)別。

  假設(shè)有這樣一個進(jìn)程同步機(jī)制中的問題:如果進(jìn)程P1因x條件處于阻塞狀態(tài),那么當(dāng)進(jìn)程P2執(zhí)行了x.signal操作喚醒P1后,進(jìn)程P1和P2此時同時處于管程中了,這是不被允許的,那么如何確定哪個執(zhí)行哪個等待?

  一般來說,我們都會采用如下兩種方式來進(jìn)行處理:

  第一種方式:假如進(jìn)程 P2進(jìn)行等待,直至進(jìn)程P1離開管程或者等待另一個條件

  第二種方式:假如進(jìn)程 P1進(jìn)行等待,直至進(jìn)程P2離開管程或者等待另一個條件

  綜上所述,三種不同的管程模型采取的方式如下:

  1.Hasen 模型

1

  Hansan管程模型,采用了基于兩種的折中處理。主要是規(guī)定管程中的所有過程執(zhí)行的signal操作是過程體的最后一個操作,于是,進(jìn)程P2執(zhí)行完signal操作后立即退出管程,因此進(jìn)程P1馬上被恢復(fù)執(zhí)行。

  2.Hoare 模型

2

  Hoare 管程模型,采用第一種方式處理。只要進(jìn)程 P2進(jìn)行等待,直至進(jìn)程P1離開管程或者等待。

  3.MESA 模型

3

  MESA 管程模型,采用第二種方式處理。只要進(jìn)程 P1進(jìn)行等待,直至進(jìn)程P2離開管程或者等待。

  基本實現(xiàn)

4

  在并發(fā)編程領(lǐng)域,有兩大核心問題:互斥和同步。其中:

  互斥(Mutual Exclusion),即同一時刻只允許一個線程訪問共享資源

  同步(Synchronization),即線程之間如何通信、協(xié)作

  這兩大問題,管程都是能夠解決的。主要是由于信號量機(jī)制是一種進(jìn)程同步機(jī)制,但每個要訪問臨界資源的進(jìn)程都必須自備同步操作wait(S)和signal(S)。

  這樣大量同步操作分散到各個進(jìn)程中,可能會導(dǎo)致系統(tǒng)管理問題和死鎖,在解決上述問題的過程中,便產(chǎn)生了新的進(jìn)程同步工具——管程。其中:

  信號量(Semaphere):操作系統(tǒng)提供的一種協(xié)調(diào)共享資源訪問的方法。和用軟件實現(xiàn)的同步比較,軟件同步是平等線程間的的一種同步協(xié)商機(jī)制,不能保證原子性。而信號量則由操作系統(tǒng)進(jìn)行管理,地位高于進(jìn)程,操作系統(tǒng)保證信號量的原子性。

  管程(Monitor):解決信號量在臨界區(qū)的 PV 操作上的配對的麻煩,把配對的 PV 操作集中在一起,生成的一種并發(fā)編程方法。其中使用了條件變量這種同步機(jī)制。

  綜上所述,這也是Java中,最常見的鎖機(jī)制的實現(xiàn)方案,即最典型的實現(xiàn)就是ReenTrantLock為互斥鎖(Mutex Lock) 和synchronized 為同步鎖(Synchronization Lock)。

  具體表現(xiàn)

5

  熟悉Java中synchronized 關(guān)鍵詞的都應(yīng)該知道,它是Java語言為開發(fā)者提供的同步工具,主要用來解決多線程并發(fā)執(zhí)行過程中數(shù)據(jù)同步的問題,主要有wait()、notify()、notifyAll() 這三個方法。其中,最關(guān)鍵的實現(xiàn)是,當(dāng)我們在代碼中聲明synchronized 之后,其被聲明部分代碼編譯之后會生成一對monitorenter和monitorexit指令來指定某個同步塊。

  在JVM執(zhí)行指令過程中,一般當(dāng)遇到monitorenter指令表示獲取互斥鎖時,而當(dāng)遇到monitorexit指令表示要釋放互斥鎖,這就是synchronized在Java層面實現(xiàn)同步機(jī)制的過程。除此之外,如果是獲取鎖失敗,則會將當(dāng)前線程放入到阻塞讀隊列中,當(dāng)其他線程釋放鎖時,再通知阻塞讀隊列中的線程去獲取鎖。

  由此可見,我們可以知道的是,synchronized 代碼塊是由一對 monitorenter/monitorexit 指令實現(xiàn)的,Monitor 對象是同步的基本實現(xiàn)單元。

  準(zhǔn)確的說,JVM一般通過Monitor來實現(xiàn)monitorenter和monitorexit指令,而且Monitor 對象包括一個阻塞隊列和一個等待隊列。其中,阻塞隊列用來保存鎖競爭失敗的線程,并且它處于阻塞狀態(tài),而等待隊列則用來保存synchronized 代碼塊中調(diào)用wait方法后放置的隊列,其調(diào)用wait方法后會通知阻塞隊列。

  當(dāng)然,在 Java 6 之前,Monitor 的實現(xiàn)完全是依靠操作系統(tǒng)內(nèi)部的互斥鎖,因為需要進(jìn)行用戶態(tài)到內(nèi)核態(tài)的切換,所以同步操作是一個無差別的重量級操作。

  這并不意味著,Java是提供信號量這種編程原語來支持解決并發(fā)問題的,雖然在《操作系統(tǒng)原理》中,我們知道用信號量能解決所有并發(fā)問題,但是在Java中并不是這樣的。

  其實,最根本的原因,就是Java 采用的是管程技術(shù),synchronized 關(guān)鍵字及 wait()、notify()、notifyAll() 這三個方法都是管程的組成部分。而管程和信號量是等價的,所謂等價指的是用管程能夠?qū)崿F(xiàn)信號量,也能用信號量實現(xiàn)管程。

  特別指出的是,相對于synchronized來說,ReentrantLock主要有以下幾個特點:

  從鎖獲取粒度上來看,比synchronized較為細(xì),主要表現(xiàn)在是鎖的持有是以線程為單位而不是基于調(diào)用次數(shù)。

  從線程公平性上來看,ReentrantLock 可以設(shè)置公平性(fairness),能減少線程“饑餓”的發(fā)生。

  從使用角度上來看,ReentrantLock 可以像普通對象一樣使用,所以可以利用其提供的各種便利方法,進(jìn)行精細(xì)的同步操作,甚至是實現(xiàn) synchronized 難以表達(dá)的用例。

  從性能角度上來看,synchronized 早期的實現(xiàn)比較低效,對比 ReentrantLock,大多數(shù)場景性能都相差較大。雖然在 Java 6之后 中對其進(jìn)行了非常多的改進(jìn),但在高競爭情況下,ReentrantLock 仍然有一定優(yōu)勢。

  綜上所述,我我相信你對Java中的管程技術(shù)已經(jīng)有了一個明確的認(rèn)識。接下來,我們便來進(jìn)入今天的主題——Java線程機(jī)制。

  更多關(guān)于“java培訓(xùn)”的問題,歡迎咨詢千鋒教育在線名師。千鋒教育多年辦學(xué),課程大綱緊跟企業(yè)需求,更科學(xué)更嚴(yán)謹(jǐn),每年培養(yǎng)泛IT人才近2萬人。不論你是零基礎(chǔ)還是想提升,都可以找到適合的班型,千鋒教育隨時歡迎你來試聽。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
免費領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
服務(wù)器為什么要用Linux?

服務(wù)器為什么要用Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,Linux在眾多選擇中脫穎而出。Linux作為服務(wù)器操作系統(tǒng)的優(yōu)選,有其獨特的優(yōu)勢和特點。包括其...詳情>>

2023-10-14 12:34:11
ORM解決的主要問題是什么?

ORM(對象關(guān)系映射)解決的主要問題是將關(guān)系數(shù)據(jù)庫與面向?qū)ο缶幊讨g的映射困境。在傳統(tǒng)的關(guān)系數(shù)據(jù)庫中,數(shù)據(jù)以表格的形式存儲,而在面向?qū)ο?..詳情>>

2023-10-14 12:26:19
Go為什么不支持三元運算符?

Go為什么不支持三元運算符Go語言是一種以簡潔和有效性為目標(biāo)的編程語言,因此在設(shè)計過程中,Go的設(shè)計者刻意排除了一些他們認(rèn)為可能導(dǎo)致復(fù)雜性或...詳情>>

2023-10-14 12:12:36
IT通常說的平臺是什么意思?

在信息技術(shù)(IT)領(lǐng)域,”平臺”這個詞有著廣泛的含義,它常常指代支持軟件應(yīng)用開發(fā)和運行的基礎(chǔ)框架和環(huán)境。以下是對”平臺”這個概念的更深入...詳情>>

2023-10-14 11:55:36
什么是PowerPivot?

什么是PowerPivotPowerPivot,全稱”PowerPivot for Excel”,是Microsoft提供的一種數(shù)據(jù)分析工具,可以作為Excel的插件使用。通過PowerPivot,...詳情>>

2023-10-14 11:25:48