將單線程程序變成多線程程序并只有好處程拭。也有一些代價(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è)切換被稱為“上下文切換”。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喜德。