將單線程程序變成多線程程序并只有好處。也有一些代價(jià)。不要僅僅因?yàn)槟隳茏龅骄蛯?yīng)用程序多線程化。你需要確定這樣做的好處大于代價(jià)。如果有疑問(wèn),就測(cè)試程序的性能和響應(yīng)能力,不要靠猜。
More complex design
盡管多線程程序的某些部分比單線程程序簡(jiǎn)單,但其他部分則要復(fù)雜得多。由多線程執(zhí)行的訪問(wèn)共享數(shù)據(jù)的代碼需要格外小心。線程交互并不總是簡(jiǎn)單。由不正確的同步引起的錯(cuò)誤往往很難檢測(cè)、復(fù)現(xiàn)和修復(fù)。
Context Switching Overhead
當(dāng)線程從一個(gè)執(zhí)行線程切換到另一個(gè)時(shí),需要保存當(dāng)前線程的本地?cái)?shù)據(jù)、程序計(jì)數(shù)器等。然后加載另一個(gè)線程的本地?cái)?shù)據(jù)、程序計(jì)數(shù)器等。這個(gè)切換被稱(chēng)為“上下文切換”。CPU從執(zhí)行線程的上下文切換到另一個(gè)線程的上下文。
上下文切換并不便宜。你不會(huì)想在不必要的情況下進(jìn)行切換的。
關(guān)于上下文切換,你可以在維基百科上了解更詳細(xì)的內(nèi)容:http://en.wikipedia.org/wiki/Context_switch
Increased Resource Consumption
線程需要計(jì)算機(jī)中的一些資源才能運(yùn)行。除了CPU時(shí)間,它還需要一些內(nèi)存來(lái)存其本地棧。它還會(huì)消耗一些操作系統(tǒng)資源來(lái)管理它。你可以整個(gè)程序,創(chuàng)建100個(gè)線程,啥也不干,看看會(huì)占用多少內(nèi)存。
有必要說(shuō)明下,這個(gè)Java Concurrency系列來(lái)源于jenkov.com,本文只是翻譯,希望大家千萬(wàn)不要誤會(huì),本文不是原創(chuàng)。原文地址:Java Concurrency。