摘要:關于并發(fā)編程,其目的就是為了讓程序運行得更快,但是,并不是啟動更多的線程就能讓程序更大限度的并發(fā)執(zhí)行。對于軟件資源限制考慮使用資源池將資源復用,例如數(shù)據(jù)庫連接池等資源限制情況下進行并發(fā)編程根據(jù)不同的資源限制調(diào)整程序的并發(fā)度。
關于并發(fā)編程,其目的就是為了讓程序運行得更快,但是,并不是啟動更多的線程就能讓程序更大限度的并發(fā)執(zhí)行。有哪些影響并發(fā)編程的因素呢?
一、文章導圖 二、挑戰(zhàn) 1、上下文切換單核處理器也支持多線程執(zhí)行代碼,CPU通過給每個線程分配CPU時間片來實現(xiàn)這個機制,只是時間片的時間短,感覺CPU能同時處理多個任務。時間片一般是幾十毫秒(ms)。
CPU通過時間片輪訓的方式處理任務,當前任務執(zhí)行一個時間片會切換到下一個任務。注意,當CPU從一個任務切換到另一個任務前,會保留上一個任務的狀態(tài),以便再切回來是可以繼續(xù)執(zhí)行。所以任務從保持狀態(tài)到再加載的過程就是一次上下文切換。
多線程執(zhí)行耗時測試
電腦配置:單處理器雙核8G內(nèi)存
public class Demo1_1_1 { private static final long count = 1000000001; public static void main(String[] args) throws InterruptedException { // 注釋一個進行執(zhí)行 concurrent(); // serial(); } /** * 并發(fā)執(zhí)行 */ private static void concurrent() throws InterruptedException { long start = System.currentTimeMillis(); Thread thread = new Thread(() -> { int a = 0; for (long i = 0; i < count; i++) { a += 5; } }); thread.start(); int b = 0; for (long i = 0; i < count; i++) { b --; } thread.join(); System.out.println("concurrent time:" + (System.currentTimeMillis() - start) + "ms"); } /** * 串行執(zhí)行 */ private static void serial() { long start = System.currentTimeMillis(); int a = 0; for (long i = 0; i < count; i++) { a += 5; } int b = 0; for (long i = 0; i < count; i++) { b --; } System.out.println("serial time:" + (System.currentTimeMillis() - start) + "ms"); } }
以上分別執(zhí)行3次,取一個最大值和一個最小值
結果
循環(huán)次數(shù) | 并行耗時/ms | 串行耗時/ms |
---|---|---|
10萬 | 66 - 90 | 2 - 4 |
100萬 | 68 - 78 | 5 - 13 |
1000萬 | 75 - 81 | 16 - 19 |
1億 | 133 - 128 | 80 - 121 |
10億 | 600 - 615 | 900 - 1000 |
分析
當并發(fā)執(zhí)行不超過億級別時,并行是比串行慢的,這就是因為線程有創(chuàng)建和上下文切換的開銷。按理說多個線程執(zhí)行應該比單線程慢,實際并非如此。
如何減少上下文切換
1、無所并發(fā)編程:多線程競爭鎖時,會引發(fā)上下文切換
2、CAS算法:Java中的Atomic包使用CAS算法更新數(shù)據(jù),無需加鎖
3、使用最少線程:任務少,但線程多,導致很多線程都處于等待狀態(tài)
4、協(xié)程:在線程里實現(xiàn)多線程的調(diào)度
java中的鎖主要用來解決并發(fā)編程資源競爭的問題,如果編程不當,一旦產(chǎn)生死鎖,便會導致系統(tǒng)功能不可用。
例如,有兩個線程t1,t2;兩個資源A,B;當出現(xiàn),t1持有A資源,t2持有B資源時,t1嘗試獲取B資源,t2嘗試獲取A資源,此時,便會出現(xiàn)死鎖的情況。
避免死鎖的辦法
1、避免一個線程同時獲取多個鎖
2、避免一個線程在鎖內(nèi)同時占有多個資源,盡力保證每個線程只占用一個資源
3、嘗試使用定時鎖,如lock.tryLock(timeout)
什么是資源限制
資源限制指在進行并發(fā)編程時,程序的執(zhí)行速度受限于計算機硬件資源或軟件資源。
硬件資源包括:帶寬的上傳下載速度、硬盤讀寫速度和CPU的處理速度等
軟件資源包括:線程池大小、數(shù)據(jù)庫的連接數(shù)等
資源限制引發(fā)的問題
在并發(fā)編程中,代碼執(zhí)行速度加快的原則是將代碼中的串行部分變成并行執(zhí)行,但有可能由于資源限制問題,導致程序仍按串行執(zhí)行,此時程序不僅不會變快,反而更慢,因為增加了上下文切換和資源調(diào)度的時間。
如何解決資源限制的問題
對于硬件資源限制:考慮使用集群方式并行執(zhí)行程序。
對于軟件資源限制:考慮使用資源池將資源復用,例如數(shù)據(jù)庫連接池等
資源限制情況下進行并發(fā)編程
根據(jù)不同的資源限制調(diào)整程序的并發(fā)度。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/75968.html
摘要:對端,通過增加內(nèi)存修改最大文件描述符個數(shù)等參數(shù),單機最大并發(fā)連接數(shù)超過萬甚至上百萬是沒問題的,國外公司在產(chǎn)品環(huán)境中已做到萬并發(fā) [TOC] 前言 曾幾何時我們還在尋求網(wǎng)絡編程中C10K問題的解決方案,但是現(xiàn)在從硬件和操作系統(tǒng)支持來看單臺服務器支持上萬并發(fā)連接已經(jīng)沒有多少挑戰(zhàn)性了。 我們先假設單臺服務器最多只能支持萬級并發(fā)連接,其實對絕大多數(shù)應用來說已經(jīng)遠遠足夠了,但是對于一些擁有很大用...
摘要:前言并發(fā)編程的目的是讓程序跑的更快,但并不是啟動更多的線程,這個程序就跑的更快。盡可能降低上下文切換的次數(shù),有助于提高并發(fā)效率。死鎖并發(fā)編程中的另一挑戰(zhàn)是死鎖,會造成系統(tǒng)功能不可用。 前言 并發(fā)編程的目的是讓程序跑的更快,但并不是啟動更多的線程,這個程序就跑的更快。有以下幾種挑戰(zhàn)。 挑戰(zhàn)及方案 上下文切換 單核CPU上執(zhí)行多線程任務,通過給每個線程分配CPU時間片的方式來實現(xiàn)這個機制。...
摘要:表示的是兩個,當其中任意一個計算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂茫陂_始分析它的高并發(fā)實現(xiàn)機制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購,是兩個比較典型的互聯(lián)網(wǎng)高并發(fā)場景。 干貨:深度剖析分布式搜索引擎設計 分布式,高可用,和機器學習一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個名詞,今天我們首先來說說分布式。 探究...
閱讀 2732·2021-11-25 09:43
閱讀 2684·2021-11-22 09:34
閱讀 2967·2021-11-12 10:34
閱讀 1510·2021-10-20 13:46
閱讀 2359·2019-08-30 13:21
閱讀 990·2019-08-30 11:21
閱讀 544·2019-08-30 11:20
閱讀 2249·2019-08-29 17:20