天天看點

多線程之:并發程式設計面臨的挑戰

一:并發程式設計面臨的挑戰

(1)上下文切換問題

(2)死鎖問題

(3)受限于硬體和軟體資源的問題

&&注意點:并發程式設計的累加操作不超過百萬次,多線程的執行速度要比單線程慢。因為線程有建立和上下文切換的開銷。

二:如何減少上下文切換?

(1)無鎖并發程式設計。

--->多線程競争鎖時,會引起上下文切換,是以多線程處理資料時候,可以用一些辦法避免使用鎖。

--->如将資料id按照hash算法取摸分段,不同線程處理不同段的資料。

(2)CAS算法

--->java的Atomic包使用了CAS算法更新資料,而不需要加鎖。

(3)使用最少線程

--->避免建立不需要的線程,比如任務很少,但是建立了很多線程來處理,這樣會造成大量線程都處于等待狀态

(4)協程

--->在單線程裡實作多任務的排程,并在單線程裡維持多個任務間的切換。

三:如何避免多線程死鎖?

(1)避免一個線程同時擷取多個鎖

(2)避免一個線程在鎖内同時占用多個資源,盡量保證每個鎖隻占用一個資源。

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

(4)對于資料庫鎖,加鎖和解鎖必須在一個資料庫連接配接裡,否則會出現解鎖失敗的情況。

四:如何解決資源限制?

(1)什麼是資源限制

--->硬體資源限制有帶寬的上傳/下載下傳速度。

--->硬碟的讀寫速度和cpu處理速度。

--->資料庫的連接配接數和socket連接配接數

(2)資源限制引發的問題

--->并發程式設計中,将代碼執行速度加快的原則是将代碼中串行的部分變成并發執行。

--->由于受限于資源,所設計的并發其實仍然在串行執行,這時候程式不僅不會加快執行,反而會更慢,因為增加了上下文切換和資源排程的時間。

(3)如何解決資源限制的問題。

--->對于硬體資源限制,可以考慮使用叢集并行執行程式。單機有限,多機運作。比如:叢集。

--->對于軟體資源的限制,可以考慮使用資源池将資源複用。比如使用連接配接池将資料庫和socket連接配接複用。

--->根據不同的資源限制調整程式的并發度,比如下載下傳檔案程式依賴兩個資源--帶寬和硬碟的讀寫速度。有資料庫操作時,設計資料庫連接配接數,如果sql語句執行非常快,而線程的數量比資料庫的連接配接數大很多,某些線程會被阻塞,等待資料庫連接配接。