<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      java的上下文切換

      多線程一定比單線程快嗎?

      這個(gè)答案是否定的,在一定情況下,單線程是比多線程執(zhí)行效率更高的

      影響多線程執(zhí)行效率有一個(gè)關(guān)鍵因素:上下文切換

      什么是上下文切換?

      cpu通過給每個(gè)線程分配時(shí)間片來實(shí)現(xiàn)多線程,而時(shí)間片就是cpu分配給每個(gè)線程執(zhí)行的時(shí)間(通常為幾十毫秒);而在切換前,會(huì)保存程序當(dāng)前的執(zhí)行狀態(tài),以備cpu再次切換到該線程時(shí)候加載當(dāng)前狀態(tài)繼續(xù)往下執(zhí)行,保存與加載的這個(gè)過程被稱為是程序的上下文切換。

      public class SpeedTest {
          private static final Long count = 10000L;
      
          public static void main(String[] args) throws InterruptedException {
              concurrency();
              serial();
          }
      
          private static void concurrency() throws InterruptedException {
              long start = System.currentTimeMillis();
              Thread test = new Thread(new Runnable() {
                  public void run() {
                      int a = 0;
                      for (long i = 0; i < count; i++) {
                          a += 5;
                      }
                  }
              }, "test");
              test.start();
              int b = 0;
              for (long j = 0; j < count; j++) {
                  b--;
              }
              long end = System.currentTimeMillis() - start;
              test.join();
              System.out.println("多線程" + end);
          }
      
          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 j = 0; j < count; j++) {
                  b--;
              }
              long end = System.currentTimeMillis() - start;
              System.out.println("單線程" + end);
          }
      }

      以上代碼是java并發(fā)編程書籍上的測試案例

      循環(huán)次數(shù) 單線程執(zhí)行時(shí)間/ms 多線程執(zhí)行時(shí)間/ms 并發(fā)與單線程速度相比
      一億 111 74 多線程快37ms
      一千萬 15 11 多線程快34ms
      一百萬 8 7 多線程快1ms(幾乎接近了)
      十萬 4 4 速度相等
      一萬 1 2 單線程快1ms
      一千 0 2 單線程快2ms

      親測所得:單線程不一定就比多線程快,這是因?yàn)槎嗑€程有上下文切換的開銷

      在代碼中如何可以減少上下文切換的次數(shù)呢?

      1、無鎖并發(fā)編程:多線程競爭鎖時(shí)會(huì)產(chǎn)生上下文切換,所以在使用多線程處理數(shù)據(jù)時(shí),可以使用一些辦法來避免使用鎖,例如將數(shù)據(jù)的ID按照hash算法來取模分段,不同線程處理不同的數(shù)據(jù)。

      2、CAS算法:java的Atomic包使用CAS算法來更新數(shù)據(jù),而不使用加鎖

      3、是用最少線程:避免創(chuàng)建不必要的線程,比如任務(wù)很少,但是創(chuàng)建了很多的線程來處理,這樣會(huì)造成大量線程處于等待狀態(tài)

      4、協(xié)程:在單線程里面實(shí)現(xiàn)多任務(wù)的調(diào)度,并在單個(gè)線程里維持多個(gè)任務(wù)間的切換

      posted @ 2021-06-20 23:28  七月流星丶  閱讀(287)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 欧洲精品码一区二区三区| 国产精品久久久天天影视香蕉| 少妇极品熟妇人妻无码| 精品一区二区三区国产馆| 扬中市| 九九热视频精选在线播放| 逊克县| aaa少妇高潮大片免费看| 精品国产乱码久久久久APP下载| 久久亚洲精品11p| 亚洲欧美牲交| 亚洲国产成人无码av在线播放| 欧美高清freexxxx性| 亚洲 制服 丝袜 无码 | 国产精品亚洲二区在线看| 久久这里只精品热免费99| 欧美精品在线观看视频| 一区二区三区无码免费看| 亚洲av成人在线一区| 镇坪县| 亚洲第一国产综合| 二区三区亚洲精品国产| 国产精品99久久久久久董美香| 国产热A欧美热A在线视频| 色综合久久综合香蕉色老大| 国产精品中文第一字幕| 国产成人精品a视频一区| 欧美亚洲熟妇一区二区三区 | 久久精品国产九一九九九| 深田えいみ禁欲后被隔壁人妻| 国产精品成人久久电影| 亚洲国产精品高清线久久| 国产精品一区二区不卡视频 | 久久综合久中文字幕青草| 扎兰屯市| 亚洲精品国产字幕久久麻豆| 疯狂做受XXXX高潮国产| 国产又大又粗又爽的毛片| 熟女乱一区二区三区四区| 新平| 国产精品中文字幕av|