成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

并發(fā)編程之并發(fā)編程的挑戰(zhàn)

LeanCloud / 3557人閱讀

摘要:關(guān)于并發(fā)編程,其目的就是為了讓程序運(yùn)行得更快,但是,并不是啟動(dòng)更多的線程就能讓程序更大限度的并發(fā)執(zhí)行。對(duì)于軟件資源限制考慮使用資源池將資源復(fù)用,例如數(shù)據(jù)庫連接池等資源限制情況下進(jìn)行并發(fā)編程根據(jù)不同的資源限制調(diào)整程序的并發(fā)度。

關(guān)于并發(fā)編程,其目的就是為了讓程序運(yùn)行得更快,但是,并不是啟動(dòng)更多的線程就能讓程序更大限度的并發(fā)執(zhí)行。有哪些影響并發(fā)編程的因素呢?

一、文章導(dǎo)圖

二、挑戰(zhàn) 1、上下文切換

單核處理器也支持多線程執(zhí)行代碼,CPU通過給每個(gè)線程分配CPU時(shí)間片來實(shí)現(xiàn)這個(gè)機(jī)制,只是時(shí)間片的時(shí)間短,感覺CPU能同時(shí)處理多個(gè)任務(wù)。時(shí)間片一般是幾十毫秒(ms)。
CPU通過時(shí)間片輪訓(xùn)的方式處理任務(wù),當(dāng)前任務(wù)執(zhí)行一個(gè)時(shí)間片會(huì)切換到下一個(gè)任務(wù)。注意,當(dāng)CPU從一個(gè)任務(wù)切換到另一個(gè)任務(wù)前,會(huì)保留上一個(gè)任務(wù)的狀態(tài),以便再切回來是可以繼續(xù)執(zhí)行。所以任務(wù)從保持狀態(tài)到再加載的過程就是一次上下文切換。

多線程執(zhí)行耗時(shí)測(cè)試

電腦配置:?jiǎn)翁幚砥麟p核8G內(nèi)存
public class Demo1_1_1 {

    private static final long count = 1000000001;

    public static void main(String[] args) throws InterruptedException {
        // 注釋一個(gè)進(jìn)行執(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次,取一個(gè)最大值和一個(gè)最小值

結(jié)果

循環(huán)次數(shù) 并行耗時(shí)/ms 串行耗時(shí)/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

分析
當(dāng)并發(fā)執(zhí)行不超過億級(jí)別時(shí),并行是比串行慢的,這就是因?yàn)榫€程有創(chuàng)建和上下文切換的開銷。按理說多個(gè)線程執(zhí)行應(yīng)該比單線程慢,實(shí)際并非如此。

如何減少上下文切換

1、無所并發(fā)編程:多線程競(jìng)爭(zhēng)鎖時(shí),會(huì)引發(fā)上下文切換
2、CAS算法:Java中的Atomic包使用CAS算法更新數(shù)據(jù),無需加鎖
3、使用最少線程:任務(wù)少,但線程多,導(dǎo)致很多線程都處于等待狀態(tài)
4、協(xié)程:在線程里實(shí)現(xiàn)多線程的調(diào)度

2、死鎖

java中的鎖主要用來解決并發(fā)編程資源競(jìng)爭(zhēng)的問題,如果編程不當(dāng),一旦產(chǎn)生死鎖,便會(huì)導(dǎo)致系統(tǒng)功能不可用。

例如,有兩個(gè)線程t1,t2;兩個(gè)資源A,B;當(dāng)出現(xiàn),t1持有A資源,t2持有B資源時(shí),t1嘗試獲取B資源,t2嘗試獲取A資源,此時(shí),便會(huì)出現(xiàn)死鎖的情況。

避免死鎖的辦法

1、避免一個(gè)線程同時(shí)獲取多個(gè)鎖
2、避免一個(gè)線程在鎖內(nèi)同時(shí)占有多個(gè)資源,盡力保證每個(gè)線程只占用一個(gè)資源
3、嘗試使用定時(shí)鎖,如lock.tryLock(timeout)

3、資源限制的挑戰(zhàn)

什么是資源限制

資源限制指在進(jìn)行并發(fā)編程時(shí),程序的執(zhí)行速度受限于計(jì)算機(jī)硬件資源或軟件資源。
硬件資源包括:帶寬的上傳下載速度、硬盤讀寫速度和CPU的處理速度等
軟件資源包括:線程池大小、數(shù)據(jù)庫的連接數(shù)等

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

在并發(fā)編程中,代碼執(zhí)行速度加快的原則是將代碼中的串行部分變成并行執(zhí)行,但有可能由于資源限制問題,導(dǎo)致程序仍按串行執(zhí)行,此時(shí)程序不僅不會(huì)變快,反而更慢,因?yàn)樵黾恿松舷挛那袚Q和資源調(diào)度的時(shí)間。

如何解決資源限制的問題

對(duì)于硬件資源限制:考慮使用集群方式并行執(zhí)行程序。
對(duì)于軟件資源限制:考慮使用資源池將資源復(fù)用,例如數(shù)據(jù)庫連接池等

資源限制情況下進(jìn)行并發(fā)編程

根據(jù)不同的資源限制調(diào)整程序的并發(fā)度。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75968.html

相關(guān)文章

  • 物聯(lián)網(wǎng)高并發(fā)編程單臺(tái)服務(wù)器最大并發(fā)TCP連接數(shù)

    摘要:對(duì)端,通過增加內(nèi)存修改最大文件描述符個(gè)數(shù)等參數(shù),單機(jī)最大并發(fā)連接數(shù)超過萬甚至上百萬是沒問題的,國(guó)外公司在產(chǎn)品環(huán)境中已做到萬并發(fā) [TOC] 前言 曾幾何時(shí)我們還在尋求網(wǎng)絡(luò)編程中C10K問題的解決方案,但是現(xiàn)在從硬件和操作系統(tǒng)支持來看單臺(tái)服務(wù)器支持上萬并發(fā)連接已經(jīng)沒有多少挑戰(zhàn)性了。 我們先假設(shè)單臺(tái)服務(wù)器最多只能支持萬級(jí)并發(fā)連接,其實(shí)對(duì)絕大多數(shù)應(yīng)用來說已經(jīng)遠(yuǎn)遠(yuǎn)足夠了,但是對(duì)于一些擁有很大用...

    leap_frog 評(píng)論0 收藏0
  • 【Java并發(fā)編程藝術(shù)】第一章讀書筆記

    摘要:前言并發(fā)編程的目的是讓程序跑的更快,但并不是啟動(dòng)更多的線程,這個(gè)程序就跑的更快。盡可能降低上下文切換的次數(shù),有助于提高并發(fā)效率。死鎖并發(fā)編程中的另一挑戰(zhàn)是死鎖,會(huì)造成系統(tǒng)功能不可用。 前言 并發(fā)編程的目的是讓程序跑的更快,但并不是啟動(dòng)更多的線程,這個(gè)程序就跑的更快。有以下幾種挑戰(zhàn)。 挑戰(zhàn)及方案 上下文切換 單核CPU上執(zhí)行多線程任務(wù),通過給每個(gè)線程分配CPU時(shí)間片的方式來實(shí)現(xiàn)這個(gè)機(jī)制。...

    馬忠志 評(píng)論0 收藏0
  • 并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)常可見它的使用,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個(gè)名詞,今天我們首先來說說分布式。 探究...

    supernavy 評(píng)論0 收藏0
  • 并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂?,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個(gè)名詞,今天我們首先來說說分布式。 探究...

    ddongjian0000 評(píng)論0 收藏0
  • 并發(fā)

    摘要:表示的是兩個(gè),當(dāng)其中任意一個(gè)計(jì)算完并發(fā)編程之是線程安全并且高效的,在并發(fā)編程中經(jīng)??梢娝氖褂?,在開始分析它的高并發(fā)實(shí)現(xiàn)機(jī)制前,先講講廢話,看看它是如何被引入的。電商秒殺和搶購(gòu),是兩個(gè)比較典型的互聯(lián)網(wǎng)高并發(fā)場(chǎng)景。 干貨:深度剖析分布式搜索引擎設(shè)計(jì) 分布式,高可用,和機(jī)器學(xué)習(xí)一樣,最近幾年被提及得最多的名詞,聽名字多牛逼,來,我們一步一步來擊破前兩個(gè)名詞,今天我們首先來說說分布式。 探究...

    wangdai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<