国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

dingding199389 / 2943人閱讀

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

系列文章傳送門:

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

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

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

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

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

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

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

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

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

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

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

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

上下文切換

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

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

那么我們現在可能會考慮 :如何減少上下文切換的次數呢???

減少上下文切換


這是《Java并發編程的藝術》的作者方騰飛大佬嗎????

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

總結一下:

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

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

減少線程的使用。人物很少的時候創建大量線程會導致大量線程都處于等待狀態。

使用協程。

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

CAS算法

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

協程

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

最后Mark兩篇關于協程的文章:

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

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

避免死鎖

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

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

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

根據《Java并發編程的藝術》有下面四種避免死鎖的常見方法:

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

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

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

對于數據庫鎖,加鎖和解鎖必須在一個數據庫連接里,否則會出現解鎖失敗的情況

解決資源限制

這里我覺得《Java并發編程的藝術》講的還是挺好的。

什么是資源限制???

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

資源限制引發的問題

在并發編程中,程序運行加快的原因是運行方式從串行運行變為并發運行,但是如果如果某段程序的并發執行由于資源限制仍然在串行執行的話,這時候程序的運行不僅不會加快,反而會更慢,因為可能增加了上下文切換和資源調度的時間。

如何解決資源限制的問題

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

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

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

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

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69097.html

相關文章

  • Java線程學習并發編程一些問題

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

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

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

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

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

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

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

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

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

    Charles 評論0 收藏0

發表評論

0條評論

dingding199389

|高級講師

TA的文章

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