久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

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

手機(jī)站
千鋒教育

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

千鋒教育

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

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

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

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > 每個(gè)Java Developer都應(yīng)該知道的關(guān)于并發(fā)編程的那點(diǎn)事?

每個(gè)Java Developer都應(yīng)該知道的關(guān)于并發(fā)編程的那點(diǎn)事?

來(lái)源:千鋒教育
發(fā)布人:qyf
時(shí)間: 2022-08-03 15:23:00 1659511380

  在這個(gè)互聯(lián)網(wǎng)應(yīng)用亂象叢生的時(shí)代,應(yīng)對(duì)復(fù)雜業(yè)務(wù)需求,如何開(kāi)發(fā)和設(shè)計(jì)一個(gè)高效和穩(wěn)定的應(yīng)用程序,一直都是我們備受矚目的關(guān)注點(diǎn) 。作為一名Java Developer,從接觸 Java 開(kāi)發(fā)到現(xiàn)在,相信大家對(duì)于并發(fā)編程這個(gè)概念都不陌生,你對(duì) Java并發(fā)編程最直觀的印象是什么呢?是各個(gè)大廠面試寶典宣揚(yáng)的高頻熱詞,還是在實(shí)際工作中,都有過(guò)實(shí)際工作場(chǎng)景必備高階開(kāi)發(fā)技術(shù)?關(guān)于并發(fā)編程的基礎(chǔ)和原則都做到了然于胸了嗎?接下來(lái),我們一起總結(jié)和思考一下。

  并發(fā)編程三要素

  所謂并發(fā)編程是指在一臺(tái)處理器上“同時(shí)”處理多個(gè)任務(wù)。并發(fā)是在同一實(shí)體上的多個(gè)事件。多個(gè)事件在同一時(shí)間間隔發(fā)生。——百度百科

  對(duì)于時(shí)實(shí)際編程過(guò)程中,其實(shí)相當(dāng)一大部分的任務(wù)都是可以通過(guò)順序編程來(lái)解決,只是對(duì)于某些特殊的和特定的問(wèn)題,并發(fā)編程會(huì)讓我們對(duì)于應(yīng)用程序的操作與控制可以變得十分方便甚至必要。很大程度上說(shuō),并發(fā)編程"具有可論證的確定性,但是實(shí)際上也具有不可確定性“,正是因?yàn)槿绱?,并發(fā)編程令人最困惑的一個(gè)原因:使用并發(fā)時(shí)需要解決的問(wèn)題有多個(gè),而實(shí)現(xiàn)并發(fā)的方式也有多種,并且兩者之間沒(méi)有十分明顯的映射關(guān)系。從并發(fā)編程幫助我們解決問(wèn)題來(lái)說(shuō),主要是應(yīng)用程序“運(yùn)行速度”和“設(shè)計(jì)可管理性”兩個(gè)方面。

  從而我們知道,并發(fā)編程三要素主要是指原子性,可見(jiàn)性,有序性,其中:

1

  原子性:最小粒度的劃分,即一個(gè)不可被分割的操作。Java 中的原子性指:一個(gè)或多個(gè)操作要么全部執(zhí)行成功,要么全部執(zhí)行失敗。

  有序性:程序執(zhí)行的順序是按照代碼的先后順序執(zhí)行的。cpu 有可能會(huì)對(duì)指令進(jìn)行重排序。

  可見(jiàn)性:當(dāng)多個(gè)線(xiàn)程訪問(wèn)同一個(gè)共享變量時(shí),如果其中一個(gè)線(xiàn)程對(duì)其進(jìn)行了修改操作,其它線(xiàn)程能立即獲取到最新修改的值。

  綜上所述,并發(fā)的本質(zhì)本身是提高運(yùn)行在單處理器上的程序的性能,實(shí)現(xiàn)并發(fā)最直接的方式是在操作系統(tǒng)級(jí)別使用進(jìn)程,操作系統(tǒng)會(huì)自動(dòng)隔離資源。但是對(duì)于像Java這樣的會(huì)共享資源來(lái)說(shuō),在協(xié)調(diào)不同線(xiàn)程驅(qū)動(dòng)的任務(wù)之間的資源使用,會(huì)使得某些資源無(wú)法被多個(gè)任務(wù)訪問(wèn)。因此,Java在順序編程的基礎(chǔ)上,支持對(duì)線(xiàn)程的控制,而且只對(duì)操作系統(tǒng)透明。

  “X”程基本概述

  在Java中,我們都知道應(yīng)用程序(Application Program)的代碼會(huì)被裝載并且放入一個(gè)class里面,最后保存到一個(gè)拓展名為.java的文件中,然后通過(guò)命令工具和開(kāi)發(fā)環(huán)境的編譯,生成.class文件,最終托管給JVM虛擬機(jī)運(yùn)行起來(lái),從而實(shí)現(xiàn)我們要的反饋結(jié)果。在這些操作過(guò)程中,我們需要理解程序,進(jìn)程,線(xiàn)程等幾個(gè)關(guān)鍵概念,其中:

2

  程序(Program):指一組指示計(jì)算機(jī)或其他具有信息處理能力裝置執(zhí)行動(dòng)作或做出判斷的指令,通常用某種程序設(shè)計(jì)語(yǔ)言編寫(xiě),運(yùn)行于某種目標(biāo)計(jì)算機(jī)體系結(jié)構(gòu)上。

  進(jìn)程(Process):計(jì)算機(jī)中的軟件程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ),是系統(tǒng)分配資源和調(diào)度的基本單位,也就是說(shuō)進(jìn)程可以單獨(dú)運(yùn)行一段程序。

  線(xiàn)程(Thead):進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,是CPU調(diào)度和分派的最小基本單位,線(xiàn)程自己不擁有操作系統(tǒng)資源,但是該線(xiàn)程可與同屬進(jìn)程的其他線(xiàn)程共享該進(jìn)程所擁有的全部資源。

  從一定程度上來(lái)說(shuō),進(jìn)程是程序的實(shí)體,而線(xiàn)程又是進(jìn)程的實(shí)體,進(jìn)程又是線(xiàn)程的容器。三者之間區(qū)別如下:

  對(duì)于程序而言,程序并不能單獨(dú)執(zhí)行,是靜止的,只有將程序加載到內(nèi)存中,系統(tǒng)為其分配資源后才能夠執(zhí)行。

  對(duì)于進(jìn)程而言,程序?qū)σ粋€(gè)數(shù)據(jù)集的動(dòng)態(tài)執(zhí)行過(guò)程,一個(gè)進(jìn)程包含一個(gè)或者更多的線(xiàn)程,一個(gè)線(xiàn)程同時(shí)只能被一個(gè)進(jìn)程所擁有,進(jìn)程是分配資源的基本單位。進(jìn)程擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享內(nèi)存,從而提高了應(yīng)用程序的運(yùn)行效率。

  對(duì)于線(xiàn)程而言,線(xiàn)程是進(jìn)程內(nèi)的基本調(diào)度單位,線(xiàn)程的劃分尺度小于進(jìn)程,并發(fā)性更高,線(xiàn)程本身不擁有系統(tǒng)資源,但是該線(xiàn)程可與同屬進(jìn)其他線(xiàn)程共享該進(jìn)程所擁有的全部資源。每一個(gè)獨(dú)立的線(xiàn)程,都有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。

  綜上所述,每個(gè)應(yīng)用程序都使用一塊內(nèi)存區(qū)域,這個(gè)內(nèi)存區(qū)域可以稱(chēng)為一個(gè)進(jìn)程,內(nèi)存區(qū)域中是需要執(zhí)行代碼的,具體執(zhí)行代碼就是線(xiàn)程去執(zhí)行的。 需要注意的是:進(jìn)程只是負(fù)責(zé)開(kāi)辟內(nèi)存空間的,線(xiàn)程才是負(fù)責(zé)執(zhí)行代碼邏輯的執(zhí)行單元。

  除了線(xiàn)程和進(jìn)程外,我們更需要了解什么是管程,協(xié)程和纖程:

  1.管程(Monitors):提供了一種機(jī)制,線(xiàn)程可以臨時(shí)放棄互斥訪問(wèn),等待某些條件得到滿(mǎn)足后,重新獲得執(zhí)行權(quán)恢復(fù)它的互斥訪問(wèn)。

  2.纖程(Fiber):是Microsoft組織為了幫助企業(yè)程序的更好移植到Windows系統(tǒng),而在操做系統(tǒng)中增加的一個(gè)概念,由操作系統(tǒng)內(nèi)核根據(jù)對(duì)應(yīng)的調(diào)度算法進(jìn)行控制,也是一種輕量級(jí)的線(xiàn)程。

  3.協(xié)程(Coroutines):一種基于線(xiàn)程之上,但又比線(xiàn)程更加輕量級(jí)的存在,這種由程序管理的輕量級(jí)線(xiàn)程也被稱(chēng)為用戶(hù)空間線(xiàn)程,對(duì)于內(nèi)核而言是不可見(jiàn)的。正如同進(jìn)程中存在多條線(xiàn)程一樣,線(xiàn)程中也可以存在多個(gè)協(xié)程。協(xié)程在運(yùn)行時(shí)也有自己的寄存器、上下文和棧,協(xié)程的調(diào)度完全由用戶(hù)控制,協(xié)程調(diào)度切換時(shí),會(huì)將寄存器上下文和棧保存到分配的私有內(nèi)存區(qū)域中,在切回來(lái)的時(shí)候,恢復(fù)先前保存的寄存器上下文和棧,直接操作棧則基本沒(méi)有內(nèi)核切換的開(kāi)銷(xiāo),可以不加鎖的訪問(wèn)全局變量,所以上下文的切換非???。

  [特別關(guān)注]:

  1.纖程和協(xié)程的概念一致,都是線(xiàn)程的多對(duì)一模型,但有些地方會(huì)區(qū)分開(kāi)來(lái),但從協(xié)程的本質(zhì)概念上來(lái)談:纖程、綠色線(xiàn)程、微線(xiàn)程這些概念都屬于協(xié)程的范圍。

  2.纖程和協(xié)程的區(qū)別在于:纖程是OS級(jí)別的實(shí)現(xiàn),而協(xié)程是語(yǔ)言級(jí)別的實(shí)現(xiàn),纖程被OS內(nèi)核控制,協(xié)程對(duì)于內(nèi)核而言不可見(jiàn)。

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

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專(zhuān)屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(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)選,有其獨(dú)特的優(yōu)勢(shì)和特點(diǎn)。包括其...詳情>>

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

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

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

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

2023-10-14 12:12:36
IT通常說(shuō)的平臺(tái)是什么意思?

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

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

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

2023-10-14 11:25:48