亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Java多線程學習(七)并發(fā)編程中一些問題

dingding199389 / 3007人閱讀

摘要:相比與其他操作系統(tǒng)包括其他類系統(tǒng)有很多的優(yōu)點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。因為多線程競爭鎖時會引起上下文切換。減少線程的使用。很多編程語言中都有協(xié)程。所以如何避免死鎖的產(chǎn)生,在我們使用并發(fā)編程時至關(guān)重要。

系列文章傳送門:

Java多線程學習(一)Java多線程入門

Java多線程學習(二)synchronized關(guān)鍵字(1)

java多線程學習(二)synchronized關(guān)鍵字(2)

Java多線程學習(三)volatile關(guān)鍵字

Java多線程學習(四)等待/通知(wait/notify)機制

Java多線程學習(五)線程間通信知識點補充

Java多線程學習(六)Lock鎖的使用

Java多線程學習(七)并發(fā)編程中一些問題
本節(jié)思維導圖:

關(guān)注微信公眾號:“Java面試通關(guān)手冊” 回復“Java多線程”獲取思維導圖源文件和思維導圖軟件。

多線程就一定好嗎?快嗎??

并發(fā)編程的目的就是為了能提高程序的執(zhí)行效率提高程序運行速度,但是并發(fā)編程并不總是能提高程序運行速度的,而且并發(fā)編程可能會遇到很多問題,比如:內(nèi)存泄漏、上下文切換、死鎖還有受限于硬件和軟件的資源閑置問題。

多線程就是幾乎同時執(zhí)行多個線程(一個處理器在某一個時間點上永遠都只能是一個線程!即使這個處理器是多核的,除非有多個處理器才能實現(xiàn)多個線程同時運行)。CPU通過給每個線程分配CPU時間片來實現(xiàn)偽同時運行,因為CPU時間片一般很短很短,所以給人一種同時運行的感覺。

上下文切換

當前任務在執(zhí)行完CPU時間片切換到另一個任務之前會先保存自己的狀態(tài),以便下次再切換會這個任務時,可以再加載這個任務的狀態(tài)。任務從保存到再加載的過程就是一次上下文切換。

上下文切換通常是計算密集型的。也就是說,它需要相當可觀的處理器時間,在每秒幾十上百次的切換中,每次切換都需要納秒量級的時間。所以,上下文切換對系統(tǒng)來說意味著消耗大量的 CPU 時間,事實上,可能是操作系統(tǒng)中時間消耗最大的操作。
Linux相比與其他操作系統(tǒng)(包括其他類 Unix 系統(tǒng))有很多的優(yōu)點,其中有一項就是,其上下文切換和模式切換的時間消耗非常少。

那么我們現(xiàn)在可能會考慮 :如何減少上下文切換的次數(shù)呢???

減少上下文切換


這是《Java并發(fā)編程的藝術(shù)》的作者方騰飛大佬嗎????

上下文切換又分為2種:讓步式上下文切換搶占式上下文切換。前者是指執(zhí)行線程主動釋放CPU,與鎖競爭嚴重程度成正比,可通過減少鎖競爭和使用CAS算法來避免;后者是指線程因分配的時間片用盡而被迫放棄CPU或者被其他優(yōu)先級更高的線程所搶占,一般由于線程數(shù)大于CPU可用核心數(shù)引起,可通過適當減少線程數(shù)使用協(xié)程來避免。

總結(jié)一下:

減少鎖的使用。因為多線程競爭鎖時會引起上下文切換。

使用CAS算法。這種算法也是為了減少鎖的使用。CAS算法是一種無鎖算法。

減少線程的使用。人物很少的時候創(chuàng)建大量線程會導致大量線程都處于等待狀態(tài)。

使用協(xié)程。

我們上面提到了兩個名詞:“CAS算法”“協(xié)程”??赡苡行┤瞬皇呛芰私膺@倆東西,所以這里簡單說一下。。。

CAS算法

CAS(比較與交換,Compare and swap) 是一種有名的無鎖算法。無鎖編程,即不使用鎖的情況下實現(xiàn)多線程之間的變量同步,也就是在沒有線程被阻塞的情況下實現(xiàn)變量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。實現(xiàn)非阻塞同步的方案稱為“無鎖編程算法”( Non-blocking algorithm)。 
相對應的,獨占鎖是一種悲觀鎖,synchronized就是一種獨占鎖,它假設最壞的情況,并且只有在確保其它線程不會造成干擾的情況下執(zhí)行,會導致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。

協(xié)程

協(xié)程也可以說是微線程或者說是輕量級的線程,它占用的內(nèi)存更少并且更靈活。很多編程語言中都有協(xié)程。Lua, Ruby 等等都有自己的協(xié)程實現(xiàn)。Go完全就是因為協(xié)程而發(fā)展壯大的。維基百科上面并沒有Java實現(xiàn)協(xié)程的方式,但是不代表Java不能實現(xiàn)協(xié)程。比如可以使用Java實現(xiàn)的開源協(xié)程庫:Quasar。Quasar官網(wǎng):http://www.paralleluniverse.co/quasar/,。這個庫實現(xiàn)了一種可以和Go語言中的Goroutine相對標的編程概念:Fiber。Fiber是一種真正的協(xié)程。

最后Mark兩篇關(guān)于協(xié)程的文章:

協(xié)程,高并發(fā)IO終極殺器(3):https://zhuanlan.zhihu.com/p/27590299

次時代Java編程(一):Java里的協(xié)程:http://geek.csdn.net/news/detail/71824

避免死鎖

在操作系統(tǒng)中,死鎖是指兩個或兩個以上的進程在執(zhí)行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無外力作用,它們都將無法推進下去。此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。

在線程中,如果兩個線程同時等待對方釋放鎖也會產(chǎn)生死鎖。

鎖是一個好東西,但是使用不當就會造成死鎖。一旦死鎖產(chǎn)生程序就無法繼續(xù)運行下去。所以如何避免死鎖的產(chǎn)生,在我們使用并發(fā)編程時至關(guān)重要。

根據(jù)《Java并發(fā)編程的藝術(shù)》有下面四種避免死鎖的常見方法:

避免一個線程同時獲得多個鎖

避免一個線程在鎖內(nèi)同時占用多個資源,盡量保證每個鎖只占用一個資源

嘗試使用定時鎖,使用lock.tryLock(timeout)來替代使用內(nèi)部鎖機制

對于數(shù)據(jù)庫鎖,加鎖和解鎖必須在一個數(shù)據(jù)庫連接里,否則會出現(xiàn)解鎖失敗的情況

解決資源限制

這里我覺得《Java并發(fā)編程的藝術(shù)》講的還是挺好的。

什么是資源限制???

所謂資源限制就是我們在進行并發(fā)編程時,程序的運行速度受限于計算機硬件資源比如CPU,內(nèi)存等等或軟件資源比如軟件的質(zhì)量、性能等等。舉個例子:如果說服務器的帶寬只有2MB/s,某個資源的下載速度是1MB/s,系統(tǒng)啟動10個線程下載該資源并不會導致下載速度編程10MB/s,所以在并發(fā)編程時,需要考慮這些資源的限制。硬件資源限制有:帶寬的上傳和下載速度、硬盤讀寫速度和CPU處理速度;軟件資源限制有數(shù)據(jù)庫的連接數(shù)、socket連接數(shù)、軟件質(zhì)量和性能等等。

資源限制引發(fā)的問題

在并發(fā)編程中,程序運行加快的原因是運行方式從串行運行變?yōu)椴l(fā)運行,但是如果如果某段程序的并發(fā)執(zhí)行由于資源限制仍然在串行執(zhí)行的話,這時候程序的運行不僅不會加快,反而會更慢,因為可能增加了上下文切換和資源調(diào)度的時間。

如何解決資源限制的問題

對于硬件資源限制,可以考慮使用集群并行執(zhí)行程序。既然單機的資源有限制,那么就讓程序在多機上運行。比如使用Hadoop或者自己搭建服務器集群。

對于軟件資源的限制,可以考慮使用資源池將資源復用。比如使用連接池將數(shù)據(jù)庫和Socket復用,或者在調(diào)用對方webservice接口獲取數(shù)據(jù)時,只建立一個連接。另外還可以考慮使用良好的開源軟件。

在資源限制的情況下如何進行并發(fā)編程

根據(jù)不同的資源限制調(diào)整程序的并發(fā)度,比如下載文件程序依賴于兩個資源-帶寬和硬盤讀寫速度。有數(shù)據(jù)庫操作時,設計數(shù)據(jù)庫練連接數(shù),如果SQL語句執(zhí)行非常快,而線程的數(shù)量比數(shù)據(jù)庫連接數(shù)大很多,則某些線程會被阻塞,等待數(shù)據(jù)庫連接。

參考:
維基百科,百度百科
《Java并發(fā)編程的藝術(shù)》
上下文切換的詳解:http://ifeve.com/context-swit...

如果你覺得博主的文章不錯,歡迎轉(zhuǎn)發(fā)點贊。你能從中學到知識就是我最大的幸運。

歡迎關(guān)注我的微信公眾號:“Java面試通關(guān)手冊”(分享各種Java學習資源,面試題,以及企業(yè)級Java實戰(zhàn)項目回復關(guān)鍵字免費領取)。另外我創(chuàng)建了一個Java學習交流群(群號:174594747),歡迎大家加入一起學習,這里更有面試,學習視頻等資源的分享。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/69097.html

相關(guān)文章

  • Java線程學習并發(fā)編程一些問題

    摘要:因為多線程競爭鎖時會引起上下文切換。減少線程的使用。舉個例子如果說服務器的帶寬只有,某個資源的下載速度是,系統(tǒng)啟動個線程下載該資源并不會導致下載速度編程,所以在并發(fā)編程時,需要考慮這些資源的限制。 最近私下做一項目,一bug幾日未解決,總惶恐。一日頓悟,bug不可怕,怕的是項目不存在bug,與其懼怕,何不與其剛正面。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Jav...

    yimo 評論0 收藏0
  • Java線程學習(三)volatile關(guān)鍵字

    摘要:三關(guān)鍵字能保證原子性嗎并發(fā)編程藝術(shù)這本書上說保證但是在自增操作非原子操作上不保證,多線程編程核心藝術(shù)這本書說不保證。多線程訪問關(guān)鍵字不會發(fā)生阻塞,而關(guān)鍵字可能會發(fā)生阻塞關(guān)鍵字能保證數(shù)據(jù)的可見性,但不能保證數(shù)據(jù)的原子性。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Java多線程學習(二)synchronized關(guān)鍵字(1) java多線程學習(二)synchroniz...

    tain335 評論0 收藏0
  • Java線程學習(二)synchronized關(guān)鍵字(1)

    摘要:轉(zhuǎn)載請備注地址多線程學習二將分為兩篇文章介紹同步方法另一篇介紹同步語句塊。如果兩個線程同時操作對象中的實例變量,則會出現(xiàn)非線程安全,解決辦法就是在方法前加上關(guān)鍵字即可。 轉(zhuǎn)載請備注地址: https://blog.csdn.net/qq_3433... Java多線程學習(二)將分為兩篇文章介紹synchronized同步方法另一篇介紹synchronized同步語句塊。系列文章傳送門...

    xuxueli 評論0 收藏0
  • 淺談Java并發(fā)編程系列() —— 深入解析synchronized關(guān)鍵字

    摘要:第一個字被稱為。經(jīng)量級鎖的加鎖過程當一個對象被鎖定時,被復制到當前嘗試獲取鎖的線程的線程棧的鎖記錄空間被復制的官方稱為。根據(jù)鎖對象目前是否處于被鎖定狀態(tài),撤銷偏向后恢復到未鎖定或經(jīng)量級鎖定狀態(tài)。 Synchronized關(guān)鍵字 synchronized的鎖機制的主要優(yōu)勢是Java語言內(nèi)置的鎖機制,因此,JVM可以自由的優(yōu)化而不影響已存在的代碼。 任何對象都擁有對象頭這一數(shù)據(jù)結(jié)構(gòu)來支持鎖...

    piglei 評論0 收藏0
  • 手撕面試官系列():面試必備之常問并發(fā)編程高級面試專題

    摘要:如何在線程池中提交線程內(nèi)存模型相關(guān)問題什么是的內(nèi)存模型,中各個線程是怎么彼此看到對方的變量的請談談有什么特點,為什么它能保證變量對所有線程的可見性既然能夠保證線程間的變量可見性,是不是就意味著基于變量的運算就是并發(fā)安全的請對比下對比的異同。 并發(fā)編程高級面試面試題 showImg(https://upload-images.jianshu.io/upload_images/133416...

    Charles 評論0 收藏0

發(fā)表評論

0條評論

dingding199389

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<