最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關于Java多線程上下文切換的總結

 更新時間:2023年05月09日 09:39:15   作者:九月木碼  
CPU通過時間片分配算法來循環(huán)執(zhí)行任務,當前任務執(zhí)行一個時間片后會切換到下一個任務。但是,在切換前會保存上一個任務的狀態(tài),以便下次切換回這個任務時,可以再次加載這個任務的狀態(tài),從任務保存到再加載的過程就是一次上下文切換,需要的朋友可以參考下

什么是上下文切換

即使是單核CPU也支持多線程執(zhí)行代碼,CPU通過給每個線程分配CPU時間片來實現(xiàn)這個機制。時間片是CPU分配給各個線程的時間,因為時間片非常短,所以CPU通過不停地切換線程執(zhí)行,讓我們感覺多個線程時同時執(zhí)行的,時間片一般是幾十毫秒(ms)。

CPU通過時間片分配算法來循環(huán)執(zhí)行任務,當前任務執(zhí)行一個時間片后會切換到下一個任務。但是,在切換前會保存上一個任務的狀態(tài),以便下次切換回這個任務時,可以再次加載這個任務的狀態(tài),從任務保存到再加載的過程就是一次上下文切換。

這就像我們同時讀兩本書,當我們在讀一本英文的技術書籍時,發(fā)現(xiàn)某個單詞不認識,于是便打開中英文詞典,但是在放下英文書籍之前,大腦必須先記住這本書讀到了多少頁的第多少行,等查完單詞之后,能夠繼續(xù)讀這本書。這樣的切換是會影響讀書效率的,同樣上下文切換也會影響多線程的執(zhí)行速度。

上下文切換代碼測試

下面的代碼演示串行和并發(fā)執(zhí)行并累加操作的時間:

public class ContextSwitchTest
{
    private static final long count = 10000;
    public static void main(String[] args) throws Exception
    {
        concurrency();
        serial();
    }
    private static void concurrency() throws Exception
    {
        long start = System.currentTimeMillis();
        Thread thread = new Thread(new Runnable(){
            public void run()
            {
                int a = 0;
                for (int i = 0; i < count; i++)
                {
                    a += 5;
                }
            }
        });
        thread.start();
        int b = 0;
        for (long i = 0; i < count; i++)
        {
            b --;
        }
        thread.join();
        long time = System.currentTimeMillis() - start;
        System.out.println("Concurrency:" + time + "ms, b = " + b);
    }
    private static void serial()
    {
        long start = System.currentTimeMillis();
        int a = 0;
        for (long i = 0; i < count; i++)
        {
            a += 5;
        }
        int b = 0;
        for (int i = 0; i < count; i++)
        {
            b --;
        }
        long time = System.currentTimeMillis() - start;
        System.out.println("Serial:" + time + "ms, b = " + b + ", a = " + a);
    }
}

修改上面的count值,即修改循環(huán)次數(shù),看一下串行運行和并發(fā)運行的時間測試結果:

從表中可以看出,100次并發(fā)執(zhí)行累加以下,串行執(zhí)行和并發(fā)執(zhí)行的運行速度總體而言差不多,1萬次以下串行執(zhí)行甚至還可以說是略快。為什么并發(fā)執(zhí)行的速度會比串行慢呢?這就是因為線程有創(chuàng)建和上下文切換的開銷。

引起線程上下文切換的原因

對于我們經(jīng)常使用的搶占式操作系統(tǒng)而言,引起線程上下文切換的原因大概有以下幾種:

  • 當前執(zhí)行任務的時間片用完之后,系統(tǒng)CPU正常調(diào)度下一個任務
  • 當前執(zhí)行任務碰到IO阻塞,調(diào)度器將此任務掛起,繼續(xù)下一任務
  • 多個任務搶占鎖資源,當前任務沒有搶到鎖資源,被調(diào)度器掛起,繼續(xù)下一任務
  • 用戶代碼掛起當前任務,讓出CPU時間
  • 硬件中斷

如何減少上下文切換

既然上下文切換會導致額外的開銷,因此減少上下文切換次數(shù)便可以提高多線程程序的運行效率。減少上下文切換的方法有無鎖并發(fā)編程、CAS算法、使用最少線程和使用協(xié)程。

  • 無鎖并發(fā)編程。多線程競爭時,會引起上下文切換,所以多線程處理數(shù)據(jù)時,可以用一些辦法來避免使用鎖,如將數(shù)據(jù)的ID按照Hash取模分段,不同的線程處理不同段的數(shù)據(jù)
  • CAS算法。Java的Atomic包使用CAS算法來更新數(shù)據(jù),而不需要加鎖
  • 使用最少線程。避免創(chuàng)建不需要的線程,比如任務很少,但是創(chuàng)建了很多線程來處理,這樣會造成大量線程都處于等待狀態(tài)
  • 協(xié)程。在單線程里實現(xiàn)多任務的調(diào)度,并在單線程里維持多個任務間的切換

到此這篇關于關于Java多線程上下文切換的總結的文章就介紹到這了,更多相關Java多線程上下文切換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)字符串和日期類型相互轉(zhuǎn)換的方法

    java實現(xiàn)字符串和日期類型相互轉(zhuǎn)換的方法

    這篇文章主要介紹了java實現(xiàn)字符串和日期類型相互轉(zhuǎn)換的方法,涉及java針對日期與字符串的轉(zhuǎn)換與運算相關操作技巧,需要的朋友可以參考下
    2017-02-02
  • 分布式鎖實例教程之防止重復提交

    分布式鎖實例教程之防止重復提交

    訂單重復問題已經(jīng)是老生常談的問題了,下面這篇文章主要給大家介紹了關于分布式鎖實例教程之防止重復提交的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-11-11
  • Java安全后端返回文件流方式

    Java安全后端返回文件流方式

    這篇文章主要介紹了Java安全后端返回文件流方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 使用SpringBoot讀取Windows共享文件的代碼示例

    使用SpringBoot讀取Windows共享文件的代碼示例

    在現(xiàn)代企業(yè)環(huán)境中,文件共享是一個常見的需求,Windows共享文件夾(SMB/CIFS協(xié)議)因其易用性和廣泛的兼容性,成為了許多企業(yè)的首選,在Java應用中,尤其是使用Spring Boot框架時,如何讀取Windows共享文件是一個值得探討的話題,本文介紹了使用SpringBoot讀取Windows共享文件
    2024-11-11
  • Java編程倒計時實現(xiàn)方法示例

    Java編程倒計時實現(xiàn)方法示例

    這篇文章主要介紹了Java編程倒計時實現(xiàn)的三個示例,三種實現(xiàn)方法,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • knife4j3.0.3整合gateway和注冊中心的詳細過程

    knife4j3.0.3整合gateway和注冊中心的詳細過程

    這篇文章主要介紹了knife4j3.0.3整合gateway和注冊中心的詳細過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Hibernate的各種保存方式的區(qū)別詳解

    Hibernate的各種保存方式的區(qū)別詳解

    今天小編就為大家分享一篇關于Hibernate的各種保存方式的區(qū)別詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Spring Boot 通過注解實現(xiàn)數(shù)據(jù)校驗的方法

    Spring Boot 通過注解實現(xiàn)數(shù)據(jù)校驗的方法

    這篇文章主要介紹了Spring Boot 通過注解實現(xiàn)數(shù)據(jù)校驗的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 給Java文件打成獨立JAR包的詳細步驟記錄

    給Java文件打成獨立JAR包的詳細步驟記錄

    這篇文章主要介紹了給Java文件打成獨立JAR包的相關資料,文中將Java文件打包成獨立的JAR包,包括非Maven和Maven項目的打包步驟,需要的朋友可以參考下
    2024-12-12
  • java token生成和校驗的實例代碼

    java token生成和校驗的實例代碼

    這篇文章主要介紹了java token生成和校驗的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

宝兴县| 白山市| 武定县| 香港 | 沙洋县| 福鼎市| 醴陵市| 吕梁市| 慈溪市| 花莲县| 津市市| 镇雄县| 清河县| 寿阳县| 灯塔市| 桓台县| 岚皋县| 宁强县| 阿图什市| 龙海市| 万年县| 汉川市| 泸定县| 武夷山市| 乐山市| 会昌县| 乳山市| 安达市| 舟曲县| 无棣县| 仁布县| 灵台县| 吉隆县| 麟游县| 邹城市| 伊宁县| 台山市| 子洲县| 丽江市| 怀来县| 南投市|