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

很多時候我們都以為要想處理速度更快,那就多開幾個線程跑!

確實多線程在一定情況下比單線程更快。

下面的代碼演示串行和併發執行並累加操作的時間,請分析:下面的代碼併發執行一定比串行執行快嗎?當count的數量增加 1萬 -> 10萬 -> 100萬 -> 1000萬 -> 1億

public class ConcurrencyTest {
private static final long count = 10000l;
public static void main(String[] args) throws InterruptedException {
for(int i=0; i<10; i++) {
concurrency();
serial();
System.out.println("------------------------------------------");
}
}
private static void concurrency() throws InterruptedException {
long start = System.currentTimeMillis();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
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--;
}
long time = System.currentTimeMillis() - start;
thread.join();
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 (long i = 0; i < count; i++) {
b--;

}
long time = System.currentTimeMillis() - start;
System.out.println("serial:" + time + "ms,b=" + b + ",a=" + a);
}
}

測試結果

這是count=1萬的結果,基本上串行要快些

併發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
併發 :0ms,b=-10000
串行:1ms,b=-10000,a=50000
------------------------------------------
併發 :0ms,b=-10000
串行:1ms,b=-10000,a=50000
------------------------------------------
併發 :0ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
併發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
併發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
併發 :0ms,b=-10000
串行:1ms,b=-10000,a=50000
------------------------------------------
併發 :0ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------
併發 :1ms,b=-10000
串行:0ms,b=-10000,a=50000
------------------------------------------

這是count=10萬l的結果,基本上串行要快點點

併發 :4ms,b=-100000
串行:3ms,b=-100000,a=500000
------------------------------------------
併發 :0ms,b=-100000
串行:1ms,b=-100000,a=500000
------------------------------------------
併發 :1ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
併發 :0ms,b=-100000
串行:1ms,b=-100000,a=500000
------------------------------------------
併發 :1ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
併發 :0ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
併發 :1ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
併發 :0ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------
併發 :0ms,b=-100000
串行:1ms,b=-100000,a=500000
------------------------------------------
併發 :0ms,b=-100000
串行:0ms,b=-100000,a=500000
------------------------------------------

這是count=100萬l的結果,基本上併發就要比串行要快了

併發 :5ms,b=-1000000
串行:5ms,b=-1000000,a=5000000
------------------------------------------
併發 :3ms,b=-1000000
串行:7ms,b=-1000000,a=5000000
------------------------------------------
併發 :1ms,b=-1000000
串行:7ms,b=-1000000,a=5000000

------------------------------------------
併發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
併發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
併發 :2ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
併發 :1ms,b=-1000000
串行:3ms,b=-1000000,a=5000000
------------------------------------------
併發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------
併發 :1ms,b=-1000000
串行:3ms,b=-1000000,a=5000000
------------------------------------------
併發 :1ms,b=-1000000
串行:2ms,b=-1000000,a=5000000
------------------------------------------

餘下的讀者可以自己去調試哦。

結論

  1. 在數量比較小的時候,很明顯串行要比並發更快。
  2. 因為數量較小的時候,併發會花費很多時間在線程調度上。

最後

感謝大家的耐心閱讀,喜歡文章的可以關注我,持續為大家推送更多技術乾貨,資料,面試題~

需要面試題和架構資料的可以私信【面試題】或【架構】可獲取Java架構資源合集以及600道面試題+答案。

最後祝福所有遇到瓶疾且不知道怎麼辦的Java程序員們,在往後的工作與面試中一切順利。


分享到:


相關文章: