JAVA并發(fā)入門與多線程介紹在過去單 CPU 時代,單任務(wù)在一個時間點只能執(zhí)行單一程序。之后發(fā)展到多任務(wù)階段,計算機能在同一時間點并行執(zhí)行多任務(wù)或多進(jìn)程。雖然并不是真正意義上的“同一時間點”,而是多個任務(wù)或進(jìn)程共享一個CPU,并交由操作系統(tǒng)來完成多任務(wù)間對CPU的運行切換,以使得每個任務(wù)都有機會獲得一定的時間片運行隨著多任務(wù)對軟件開發(fā)者帶來的新挑戰(zhàn),程序不再能假設(shè)獨占所有的CPU時間、所有的內(nèi)存和其他計算機資源。一個好的程序的榜樣是在其不再使用這些資源時對其進(jìn)行釋放,以使得其他程序能有機會使用這些資源再后來發(fā)展到多線程技術(shù),使得在一個程序內(nèi)部能擁有多個線程并行執(zhí)行。一個線程的執(zhí)行可以被認(rèn)為是一個 CPU 在執(zhí)行該程序。當(dāng)一個程序運行在多線程下,就好像有多個 CPU 在同時執(zhí)行該程序多線程比多任務(wù)更加有挑戰(zhàn)。多線程是在同一個程序內(nèi)部并行執(zhí)行,因此會對相同的內(nèi)存空間進(jìn)行并發(fā)讀寫操作。這可能是在單線程程序中從來不會遇到的問題。其中的一些錯誤也未必會在單 CPU 機器上出現(xiàn),因為兩個線程從來不會得到真正的并行執(zhí)行。然而,企業(yè)宣傳片制作更現(xiàn)代的計算機伴隨著多核CPU的出現(xiàn),也就意味著不同的線程能被不同的 CPU 核得到真正意義的并行執(zhí)行如果一個線程在讀一個內(nèi)存時,另一個線程正向該內(nèi)存進(jìn)行寫操作,那進(jìn)行讀操作的那個線程將獲得什么結(jié)果呢?是寫操作之前舊的值?還是寫操作成功之后的新值?或是一半新一半舊的值?或者,如果是兩個線程同時寫同一個內(nèi)存,在操作完成后將會是什么結(jié)果呢?是第一個線程寫入的值?還是第二個線程寫入的值?還是兩個線程寫入的一個混合值?因此如沒有合適的預(yù)防措施,中國解放軍史上最倒霉的九個軍,任何結(jié)果都是可能的。而且這種行為的發(fā)生甚至不能預(yù)測,所以結(jié)果也是不確定性的Java是一種多線程語言。企業(yè)宣傳片制作雖然編程問題中相當(dāng)大的一部分都可以通過使用順序編程來解決。然而,對于某些問題,如果能夠并行地執(zhí)行程序中的多個部分,則會變得非常方便甚至非常必要,因為這些部分要么看起來在并發(fā)地執(zhí)行,要么在多處理器環(huán)境下可以同時執(zhí)行并發(fā)具有可論證的確定性,但是實際上具有不可確定性。偏偏在我們又無法避免使用線程的代碼。例如,Web系統(tǒng)是最常見的Java應(yīng)用系統(tǒng)之一,而基本的Web類庫、Servlet具有天生的的多線程。圖形化用戶界面也是類似的情況并發(fā)通常可以提高運行在單處理器上的程序的性能。這聽起來有些違背直覺。如果你仔細(xì)考慮一下就會發(fā)現(xiàn),在單處理器上運行的并發(fā)程序開銷確實應(yīng)該比該程序的所有部分都順序執(zhí)行的開銷大,因為其中增加了所謂的上下文切換的代價。但為什么還要使用呢?問題的關(guān)鍵—阻塞。如果程序中的某個任務(wù)因為該程序控制范圍之外的某些條件(通常是I/O)而導(dǎo)致不能繼續(xù)執(zhí)行。沒有并發(fā),整個計劃接近停止,直到外界條件的變化。然而,如果程序使用并發(fā),當(dāng)一個任務(wù)被堵住了其他任務(wù)的程序可以繼續(xù)執(zhí)行,所以該計劃繼續(xù)前進(jìn)。事實上,從性能的角度來看,如果沒有任務(wù)會阻塞,那么在單處理器機器上使用并發(fā)就沒有任何意義Java的線程機制是搶占式的(因為當(dāng)今大部分操作系統(tǒng)都是搶占式的)。這表示調(diào)度機制會周期性地中斷線程,將上下文切換到另一個線程,從潭嶺天湖走出的梵高。從而為每個線程都提供時間片,使得每個線程都會分配到數(shù)量合理的時間去驅(qū)動它的任務(wù)并發(fā)需要付出代價,包含復(fù)雜性代價,但是這些代價與在程序設(shè)計、資源負(fù)載均衡以及用戶方便使用的方面改進(jìn)相比,就顯得微不足道了。通常,線程使你能夠創(chuàng)建更加松散耦合的設(shè)計,否則,你的代碼中各個部分都必須顯式地關(guān)注那些通常可以由線程來處理的任務(wù)并行:多個cpu實例或者多臺機器同時執(zhí)行一段處理邏輯,是真正的同時并發(fā):通過cpu調(diào)度算法,讓用戶看上去同時執(zhí)行,實際上從cpu操作層面不是真正的同時。并發(fā)往往在場景中有公用的資源,那么針對這個公用的資源往往產(chǎn)生瓶頸,我們會用TPS或者QPS來反應(yīng)這個系統(tǒng)的處理能力線程安全:經(jīng)常用來描繪一段代碼。指在并發(fā)的情況之下,該代碼經(jīng)過多線程使用,線程的調(diào)度順序不影響任何結(jié)果。這個時候使用多線程,我們只需要關(guān)注系統(tǒng)的內(nèi)存,cpu是否夠用即可。反過來,線程不安全就意味著線程的調(diào)度順序會影響最終結(jié)果,攝影協(xié)會招募通知的相關(guān)文章推薦。如不加事務(wù)的轉(zhuǎn)賬代碼:系統(tǒng)要做一件事,運行一個任務(wù),所有運行的任務(wù)通常就是一個程序。每個運行中的程序就是一個進(jìn)程,這一點在任務(wù)管理器上面可以形象地看到。當(dāng)一個程序運行時,內(nèi)部可能會包含多個順序執(zhí)行流,每個順序執(zhí)行流就是一個線程線程模型為編程帶來了便利,它簡化了在單一程序中同時交織在一起的多個操作的處理。在使用線程時,CPU將輪流給每個任務(wù)分配其占用時間。使用線程機制是一種建立透明的、可擴展程序的方法。如果程序運行得太慢,為機器增添一個CPU就能很容易地加快程序的運行速度。影視視頻制作多任務(wù)和多線程往往是使用多處理器系統(tǒng)的最合理方式。
備案號:津icp備14005706號
本站視頻作品采用知識共享署名非商業(yè)性使用