多线程一定比单线程快吗
多線程似乎一直給我們這樣的印象就是多線程比單線程快,其實(shí)這是一個(gè)偽命題.事無(wú)絕對(duì),多線程有時(shí)候確實(shí)比單線程快,但也有很多時(shí)候沒(méi)有單線程那么快. 首先簡(jiǎn)單區(qū)分一下并發(fā)性(concurrency)和并行性(parallel).并行是說(shuō)同一時(shí)刻有多條命令在多個(gè)處理器上同時(shí)執(zhí)行.并發(fā)是說(shuō)同一時(shí)刻只有一條指令執(zhí)行,只不過(guò)進(jìn)程(線程)指令在CPU中快速輪換,速度極快,給人看起來(lái)就是”同時(shí)運(yùn)行”的印象,實(shí)際上同一時(shí)刻只有一條指令進(jìn)行. 但實(shí)際上如果我們?cè)谝粋€(gè)應(yīng)用程序中使用了多線程,線程之間的輪換以及上下文切換是需要花費(fèi)很多時(shí)間的,這樣的話當(dāng)我們執(zhí)行類(lèi)似循環(huán)之類(lèi)的操作的時(shí)候,是不是就意味著單線程一定會(huì)比多線程快呢(因?yàn)閱尉€程的執(zhí)行沒(méi)有線程切換的時(shí)間消耗),
public class ConcurrencyTest {private static final long count = 1000000000;public static void main(String[] args) {try {concurrency();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}serial();}private static void concurrency() throws InterruptedException {long start = System.currentTimeMillis();Thread thread = new Thread(new Runnable() {@Overridepublic 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--;}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 (long i = 0; i < count; i++){b--;}long time = System.currentTimeMillis() - start;System.out.println("concurrency : " + time + "ms,b=" + b);}}這段代碼的運(yùn)行結(jié)果是當(dāng)count值比較小的時(shí)候單線程的運(yùn)行速度比多線程要快,當(dāng)count的值比較大的時(shí)候多線程的速度大概會(huì)是單線程的兩倍為什么會(huì)這樣呢,理論上來(lái)說(shuō)執(zhí)行上述這種代碼操作單線程不需要上下文切換應(yīng)該肯定比多線程要快才對(duì)呀. 其實(shí)是因?yàn)槲覀儺愊胩扉_(kāi)了,CPU的資源又不是全部都給你這個(gè)Java程序使用的,別的程序也要占用CPU資源啊.比如說(shuō)當(dāng)我們這個(gè)程序還沒(méi)有運(yùn)行的時(shí)候其實(shí)可能操作系統(tǒng)中已經(jīng)有50個(gè)線程在運(yùn)行了,那么當(dāng)我們這個(gè)程序運(yùn)行的時(shí)候,單線程就會(huì)占用CPU51分之1的時(shí)間(假設(shè)每個(gè)線程占用時(shí)間相等),多線程就會(huì)占用CPU52分之2的時(shí)間,你說(shuō)哪個(gè)會(huì)運(yùn)行的更快呢.當(dāng)然當(dāng)數(shù)量比較少的時(shí)候上下文之間的輪換會(huì)占用相對(duì)較多的時(shí)間所以這個(gè)時(shí)候雖然多線程占用CPU52分之2的時(shí)間,但是切換也需要很多的時(shí)間所以就比單線程要慢
 .
總結(jié)
以上是生活随笔為你收集整理的多线程一定比单线程快吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: post请求参数格式
- 下一篇: 什么是守护进程?
