华南俳烁实业有限公司

java

當(dāng)前位置:中華考試網(wǎng) >> java >> java教程 >> 文章內(nèi)容

關(guān)于Java并發(fā)編程-概念,你都懂多少?

來源:中華考試網(wǎng)  [2020年12月2日]  【

  并發(fā)編程是現(xiàn)代計算機(jī)軟件最常見的編程模式,是操作系統(tǒng)到應(yīng)用軟件到分布式系統(tǒng)都要關(guān)心的問題,其核 心目標(biāo)是解決并行事件的資源共享和訪問問題。

  自從學(xué)生時代,我就一直在學(xué)習(xí)和并試圖理解這些概念。尤 其是在學(xué)操作系統(tǒng)時,曾經(jīng)想得覺得自己腦殼都要爆炸了。許多東西是要隨著知識和實(shí)際工作經(jīng)驗(yàn)的增長 才能領(lǐng)悟的,F(xiàn)在的我覺得現(xiàn)在對這些概念的理解已經(jīng)超出當(dāng)初的理解水平,雖然許多更深入的概念和細(xì)節(jié)我現(xiàn)在都還是很糊涂,但為了梳理這些知識,防止遺忘, 在這兒把我對這些東西的理解,以及它們在Java中的應(yīng)用講出來?上КF(xiàn)在操作系統(tǒng)的書已經(jīng)很長時間不看了,肯定有許多不對的地方,如果您覺得不對,希望 您能及時指出。

  一切都要從這個世界的并行性講開。事物的發(fā)展總是并行進(jìn)行的,汽車在奔馳的同時,自行車也在行駛;別人正在唱歌,你可能正在吃飯;等等。這些都是并行的例 子,就單個事物來看,它發(fā)展的動作一般是順序進(jìn)行,而多個事物之間一般誰也不會妨礙誰,除非它們的動作要作用在同一個對象上:汽車過十字路口的綠燈時,另 一個方向的汽車就不能行駛;如果你在食堂里舉辦歌舞晚會,別人就不能在這兒吃飯。

  計算機(jī)軟件的基本模型是順序執(zhí)行的,然而現(xiàn)代計算機(jī)在此基礎(chǔ)上發(fā)展出了并發(fā)概念。什么是并發(fā)?什么是并行?它們之間的區(qū)別是什么?并發(fā)與并行是兩個既相似 而又不相同的概念:并發(fā)性,又稱共行性,是指能處理多個同時性活動的能力;并行是指同時發(fā)生的兩個并發(fā)事件,具有并發(fā)的含義,而并發(fā)則不一定并行,也亦是 說并發(fā)事件之間不一定要同一時刻發(fā)生。并行一般是指沒有互斥和同步的情況下獨(dú)立進(jìn)行同時發(fā)生的事件。因此單CPU操作系統(tǒng)的進(jìn)程/線程嚴(yán)格意義上來說都不 能算是并行事件,畢竟它們都要使用同一個CPU,真正的并行出現(xiàn)在多處理器的計算機(jī)上,當(dāng)進(jìn)程/線程獨(dú)立運(yùn)行在不同的CPU上,而且沒有不需要共享對象 時。粗略的說,沒有資源互斥共享的進(jìn)程和線程都是并行的。

  填寫下面表單即可預(yù)約申請免費(fèi)試聽java課程!害怕學(xué)不會?助教陪讀,隨時解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可全國推薦就業(yè)!

java課程免費(fèi)學(xué)習(xí),高薪觸手可得

  • 地區(qū):
  • 姓名:
  • 手機(jī):

  如果進(jìn)程/線程沒有共享任何數(shù)據(jù),它們編程所關(guān)心的許多概念就不會存在。就像現(xiàn)實(shí)世界,如果任何兩個人都是獨(dú)立的,沒有任何關(guān)系的,那么也不會存在社會的 各種機(jī)構(gòu)來協(xié)調(diào)這些關(guān)系。在操作系統(tǒng)中,進(jìn)程之間共享數(shù)據(jù)的方式一般通過IO(如:文件、管道、網(wǎng)絡(luò)端口等等),當(dāng)然也有時會通過內(nèi)存共享。這種松耦合的 共享造成的同步、互斥問題并不多。常見的同步問題發(fā)生同一進(jìn)程內(nèi)不同線程之間。由于線程存在于同個進(jìn)程中,它們之間是可以共享內(nèi)存的,所以就會有很多同步 和互斥的問題。

  那么什么是同步,什么是互斥?同步和互斥往往是共生的。所謂的同步是指不同實(shí)體的動作按照某些特定條件的順序執(zhí)行。最常見的莫過于生產(chǎn)者和消費(fèi)者之間的關(guān) 系。生產(chǎn)者的生產(chǎn)動作和消費(fèi)者的消費(fèi)動作是必須滿足先后順序的:只有生產(chǎn)者生產(chǎn)出東西來,消費(fèi)者才能消費(fèi)這些東西。它們之間就需要所謂的同步。什么是互 斥?互斥是指兩個實(shí)體的動作不允許同時發(fā)生,如果同時發(fā)生就會產(chǎn)生不可以預(yù)期的結(jié)果;コ馐峭降那疤幔绻麅蓚動作不是互斥的,就不可能保證其發(fā)生的順 序。同步一定是互斥的,而互斥不一定需要同步。同步是固定順序的動作的互斥。理解這一點(diǎn)非常重要。

  舉個我們都熟悉的例子,多個并發(fā)生產(chǎn)者和多個并發(fā)消費(fèi)者。生產(chǎn)者生產(chǎn)的對象放在一個數(shù)組中,而消費(fèi)者則從這個數(shù)組中獲取對象。那么生產(chǎn)者的生產(chǎn)動作之間是 需要互斥的,但不需要同步。不管是A先放在數(shù)組,還是B先放在數(shù)組中,它們之間除了為避免將產(chǎn)品放在數(shù)組中同一位置上,需要互斥地訪問數(shù)組外,是不需要規(guī) 定哪一個在前面放,哪一個在后面放的。它們之間的關(guān)系就屬于互斥。而生產(chǎn)者和消費(fèi)者之間就存在一個先后順序問題,必須至少有生產(chǎn)者生產(chǎn)出產(chǎn)品放在數(shù)組中, 消費(fèi)者才能開始消費(fèi)。因此生產(chǎn)者生產(chǎn)和消費(fèi)者消費(fèi)之間的就是同步關(guān)系。此外,消費(fèi)者和消費(fèi)者之間的消費(fèi)關(guān)系也是需要互斥的,這樣才能避免兩個消費(fèi)者之間爭 奪同數(shù)組里同一位置的對象。但是它們的消費(fèi)行為是不需要同步的,只要互斥的進(jìn)行就行了。

  因此不同實(shí)體之間的動作有兩個基本關(guān)系:同步和互斥。一般處理同步的方法是建立在互斥的基礎(chǔ)上的;コ獾臋C(jī)制一般需要通過操作系統(tǒng)甚至底層硬件提供的信號 量、管程(管程是建立在信號量基礎(chǔ)上的更高層構(gòu)件)等底層機(jī)制來實(shí)現(xiàn)。Java語言中通過提供互斥原語synchronized(雖然叫同步,更準(zhǔn)確的說 應(yīng)該是互斥mutex)來保證的,當(dāng)然Java實(shí) 際上是通過JVM的monitor_enter和monitor_exit指令來實(shí)現(xiàn)的,這些指令最終以底層操作系統(tǒng)提供的機(jī)制來實(shí)現(xiàn)。同步的實(shí)現(xiàn)除了要 依靠互斥原語,還要結(jié)合條件判斷和線程掛起等語言構(gòu)件來實(shí)現(xiàn)。其原理比較簡單,首先要通過原語synchronized互斥兩個需要同步的動作(也稱作臨 界代碼),當(dāng)某個動作(比如消費(fèi))獲得信號鎖進(jìn)入管程時,它首先判斷某個條件是否滿足(是否有可消費(fèi)對象),不滿足則掛起當(dāng)前線程,釋放信號鎖,允許其他 線程進(jìn)入。當(dāng)其他線程(比如生產(chǎn)者)進(jìn)入后,也是檢查是否滿足某些條件(比如數(shù)組是否有空閑),如果不滿足則和前面線程一樣釋放信號鎖并掛起線程,如果滿 足(有空閑)則進(jìn)行動作(生產(chǎn)并放在數(shù)組空閑處),然后這個動作一般要負(fù)責(zé)激活其他掛起的線程(當(dāng)然也可以不負(fù)責(zé)任,其結(jié)果是往往造成死鎖),然后自己釋 放信號鎖退出管程。其他被激活的線程進(jìn)入下一輪競爭,誰獲得信號鎖后繼續(xù)檢查它需要的條件是否滿足,如此繼續(xù)下去。

  如果你現(xiàn)在想學(xué)習(xí)Java,贏取高薪工作機(jī)會,非常簡單,填寫下面信息,學(xué)好Java技術(shù)高薪工作機(jī)會唾手可得。

責(zé)編:fushihao
  • 會計考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學(xué)歷考試
固阳县| 新余市| 南投市| 漳平市| 金坛市| 民和| 米脂县| 白玉县| 民县| 读书| 新安县| 鲜城| 农安县| 娱乐| 北京市| 望城县| 丰宁| 邵阳市| 米脂县| 长宁区| 株洲市| 甘孜县| 从江县| 海淀区| 汽车| 曲松县| 泾源县| 东台市| 武强县| 苗栗市| 恩施市| 忻城县| 朔州市| 望谟县| 将乐县| 大厂| 泗水县| 巴马| 台湾省| 天长市| 大安市|