# å¹¶åç¼ç¨å
¥é¨
* [å¹¶åç¼ç¨å
¥é¨](#å¹¶åç¼ç¨å
¥é¨)
* [å¹¶ååå²](#å¹¶ååå²)
* [线ç¨](#线ç¨)
* [ä»ä¹æ¯å¤çº¿ç¨](#ä»ä¹æ¯å¤çº¿ç¨)
* [å¹¶ååå¹¶è¡çå
³ç³»](#å¹¶ååå¹¶è¡çå
³ç³»)
* [ä¼å¿åå£å¿](#ä¼å¿åå£å¿)
* [å¹¶å为ä»ä¹ä¼åºç°](#å¹¶å为ä»ä¹ä¼åºç°)
* [线ç¨å¸¦æ¥çå®å
¨æ§é®é¢](#线ç¨å¸¦æ¥çå®å
¨æ§é®é¢)
* [å¯è§æ§é®é¢](#å¯è§æ§é®é¢)
* [æåºæ§é®é¢](#æåºæ§é®é¢)
* [æ´»è·æ§é®é¢](#æ´»è·æ§é®é¢)
* [æ§è½é®é¢](#æ§è½é®é¢)
* [å¼èµ·çº¿ç¨åæ¢çå ç§æ¹å¼](#å¼èµ·çº¿ç¨åæ¢çå ç§æ¹å¼)
* [线ç¨å®å
¨æ§](#线ç¨å®å
¨æ§)
* [ä»ä¹æ¯çº¿ç¨å®å
¨æ§](#ä»ä¹æ¯çº¿ç¨å®å
¨æ§)
* [ååæ§](#ååæ§)
* [ç«ææ¡ä»¶](#ç«ææ¡ä»¶)
* [å éæºå¶](#å éæºå¶)
* [ç«ææ¡ä»¶åå
³é®åºå](#ç«ææ¡ä»¶åå
³é®åºå)
* [并忍¡åååå¸å¼ç³»ç»å¾ç¸ä¼¼](#并忍¡åååå¸å¼ç³»ç»å¾ç¸ä¼¼)
* [认è¯ä¸¤ä¸ªç¶æ](#认è¯ä¸¤ä¸ªç¶æ)
* [并忍¡å](#并忍¡å)
* [å¹¶è¡ Worker](#å¹¶è¡-worker)
* [å¹¶è¡ Worker çä¼ç¹](#å¹¶è¡-worker-çä¼ç¹)
* [å¹¶è¡ Worker ç缺ç¹](#å¹¶è¡-worker-ç缺ç¹)
* [æµæ°´çº¿](#æµæ°´çº¿)
* [ååºå¼ - äºä»¶é©±å¨ç³»ç»](#ååºå¼---äºä»¶é©±å¨ç³»ç»)
* [Actor 模å](#actor-模å)
* [Channels 模å](#channels-模å)
* [æµæ°´çº¿è®¾è®¡çä¼ç¹](#æµæ°´çº¿è®¾è®¡çä¼ç¹)
* [æµæ°´çº¿è®¾è®¡ç缺ç¹](#æµæ°´çº¿è®¾è®¡ç缺ç¹)
* [彿°æ§å¹¶è¡](#彿°æ§å¹¶è¡)
* [å建并å¯å¨çº¿ç¨](#å建并å¯å¨çº¿ç¨)
* [ç»§æ¿ Thread ç±»æ¥å建线ç¨](#ç»§æ¿-thread-ç±»æ¥å建线ç¨)
* [ä½¿ç¨ Runnable æ¥å£æ¥å建线ç¨](#使ç¨-runnable-æ¥å£æ¥å建线ç¨)
* [ä½¿ç¨ Callable æ¥å£æ¥å建线ç¨](#使ç¨-callable-æ¥å£æ¥å建线ç¨)
* [使ç¨çº¿ç¨æ± æ¥å建线ç¨](#使ç¨çº¿ç¨æ± æ¥å建线ç¨)
* [CachedThreadPool](#cachedthreadpool)
* [FixedThreadPool](#fixedthreadpool)
* [SingleThreadExecutor](#singlethreadexecutor)
* [ä¼ç ](#ä¼ç )
* [ä¼å
级](#ä¼å
级)
* [ä½åºè®©æ¥](#ä½åºè®©æ¥)
* [åå°çº¿ç¨](#åå°çº¿ç¨)
* [ThreadFactory](#threadfactory)
* [å å
¥ä¸ä¸ªçº¿ç¨](#å å
¥ä¸ä¸ªçº¿ç¨)
* [线ç¨å¼å¸¸æè·](#线ç¨å¼å¸¸æè·)
## å¹¶ååå²
å¨è®¡ç®æºææ©æçæ¶åï¼æ²¡ææä½ç³»ç»ï¼æ§è¡ç¨åºåªéè¦ä¸ç§æ¹å¼ï¼é£å°±æ¯ä»å¤´å°å°¾ä¾æ¬¡æ§è¡ãä»»ä½èµæºé½ä¼ä¸ºè¿ä¸ªç¨åºæå¡ï¼å¨è®¡ç®æºä½¿ç¨æäºèµæºæ¶ï¼å
¶ä»èµæºå°±ä¼ç©ºé²ï¼å°±ä¼åå¨ `æµªè´¹èµæº` çæ
åµã
>è¿éè¯´çæµªè´¹èµæºæçæ¯èµæºç©ºé²ï¼æ²¡æå
å使ç¨çæ
åµã
æä½ç³»ç»çåºç°ä¸ºæä»¬çç¨åºå¸¦æ¥äº `å¹¶åæ§`ï¼æä½ç³»ç»ä½¿æä»¬çç¨åºè½å¤åæ¶è¿è¡å¤ä¸ªç¨åºï¼ä¸ä¸ªç¨åºå°±æ¯ä¸ä¸ªè¿ç¨ï¼ä¹å°±ç¸å½äºåæ¶è¿è¡å¤ä¸ªè¿ç¨ã
æä½ç³»ç»æ¯ä¸ä¸ª`å¹¶åç³»ç»`ï¼å¹¶åæ§æ¯æä½ç³»ç»é常éè¦çç¹å¾ï¼æä½ç³»ç»å
·æåæ¶å¤çåè°åº¦å¤ä¸ªç¨åºçè½åï¼æ¯å¦å¤ä¸ª I/O 设å¤åæ¶å¨è¾å
¥è¾åºï¼è®¾å¤ I/O å CPU 计ç®åæ¶è¿è¡ï¼å
åä¸åæ¶æå¤ä¸ªç³»ç»åç¨æ·ç¨åºè¢«å¯å¨äº¤æ¿ãç©¿æå°æ§è¡ãæä½ç³»ç»å¨åè°ååé
è¿ç¨çåæ¶ï¼æä½ç³»ç»ä¹ä¼ä¸ºä¸åè¿ç¨åé
ä¸åçèµæºã
æä½ç³»ç»å®ç°å¤ä¸ªç¨åºåæ¶è¿è¡è§£å³äºå个ç¨åºæ æ³åå°çé®é¢ï¼ä¸»è¦æä¸é¢ä¸ç¹
* `èµæºå©ç¨ç`ï¼æä»¬ä¸é¢è¯´å°ï¼å个è¿ç¨åå¨èµæºæµªè´¹çæ
åµï¼ä¸¾ä¸ªä¾åï¼å½ä½ å¨ä¸ºæä¸ªæä»¶å¤¹èµäºæéçæ¶åï¼è¾å
¥ç¨åºæ æ³æ¥åå¤é¨çè¾å
¥å符ï¼åªæçå°æéèµäºå®æ¯åæè½æ¥åå¤é¨è¾å
¥ãæ»çæ¥è®²ï¼å°±æ¯å¨çå¾
ç¨åºæ¶æ æ³æ§è¡å
¶ä»å·¥ä½ã妿å¨çå¾
ç¨åºæ¶å¯ä»¥è¿è¡å¦ä¸ä¸ªç¨åºï¼é£ä¹å°ä¼å¤§å¤§æé«èµæºçå©ç¨çãï¼èµæºå¹¶ä¸ä¼è§å¾ç´¯ï¼å 为å®ä¸ä¼åæ°´ï½
* `å
¬å¹³æ§`ï¼ä¸åçç¨æ·åç¨åºé½è½å¤ä½¿ç¨è®¡ç®æºä¸çèµæºãä¸ç§é«æçè¿è¡æ¹å¼æ¯ä¸ºä¸åçç¨åºååæ¶é´çæ¥ä½¿ç¨èµæºï¼ä½æ¯æä¸ç¹éè¦æ³¨æï¼æä½ç³»ç»å¯ä»¥å³å®ä¸åè¿ç¨çä¼å
级ãè½ç¶æ¯ä¸ªè¿ç¨é½æè½å¤å
¬å¹³äº«æèµæºçæå©ï¼ä½æ¯å½æä¸ä¸ªè¿ç¨éæ¾èµæºåçåæ¶æä¸ä¸ªä¼å
级æ´é«çè¿ç¨æ¢å¤ºèµæºï¼å°±ä¼é æä¼å
级ä½çè¿ç¨æ æ³è·å¾èµæºï¼è¿è导è´è¿ç¨é¥¥é¥¿ã
* `ä¾¿å©æ§`ï¼å个è¿ç¨æ¯æ¯ä¸ç¨éä¿¡çï¼éä¿¡çæ¬è´¨å°±æ¯`ä¿¡æ¯äº¤æ¢`ï¼åæ¶è¿è¡ä¿¡æ¯äº¤æ¢è½å¤é¿å
`ä¿¡æ¯å¤å²`ï¼åé夿§çå·¥ä½ï¼ä»»ä½å¹¶åè½åçäºæ
ï¼åè¿ç¨ä¹è½å¤å®ç°ï¼åªä¸è¿è¿ç§æ¹å¼æçå¾ä½ï¼å®æ¯ä¸ç§`é¡ºåºæ§`çã
使¯ï¼é¡ºåºç¼ç¨ï¼ä¹ç§°ä¸º`串è¡ç¼ç¨`ï¼ä¹ä¸æ¯`䏿 æ¯å¤`çï¼ä¸²è¡ç¼ç¨çä¼å¿å¨äºå
¶**ç´è§æ§åç®åæ§**ï¼å®¢è§æ¥è®²ï¼ä¸²è¡ç¼ç¨æ´éåæä»¬äººèçæèæ¹å¼ï¼ä½æ¯æä»¬å¹¶ä¸ä¼æ»¡è¶³äºé¡ºåºç¼ç¨ï¼**we want it more!!!** ãèµæºå©ç¨çãå
¬å¹³æ§åä¾¿å©æ§ä¿ä½¿çè¿ç¨åºç°çåæ¶ï¼ä¹ä¿ä½¿ç`线ç¨`çåºç°ã
å¦æä½ è¿ä¸æ¯å¾çè§£è¿ç¨å线ç¨çåºå«çè¯ï¼é£ä¹æå°±ä»¥æå¤å¹´æä½ç³»ç»çç»éªï¼å¹çé¼ï¼å®ååå¹´ï¼æ¥ä¸ºä½ è§£éä¸ä¸ï¼**è¿ç¨æ¯ä¸ä¸ªåºç¨ç¨åºï¼èçº¿ç¨æ¯åºç¨ç¨åºä¸ç䏿¡é¡ºåºæµ**ã
è¿ç¨ä¸ä¼æå¤ä¸ªçº¿ç¨æ¥å®æä¸äºä»»å¡ï¼è¿äºä»»å¡æå¯è½ç¸åæå¯è½ä¸åãæ¯ä¸ªçº¿ç¨é½æèªå·±çæ§è¡é¡ºåºã
æ¯ä¸ªçº¿ç¨é½æèªå·±çæ 空é´ï¼è¿æ¯çº¿ç¨ç§æçï¼è¿æä¸äºå
¶ä»çº¿ç¨å
é¨çå线ç¨å
±äº«çèµæºï¼å¦ä¸æç¤ºã
>å¨è®¡ç®æºä¸ï¼ä¸è¬å æ æçå°±æ¯æ ï¼èå æçææ¯å
线ç¨ä¼å
±äº«è¿ç¨èå´å
çèµæºï¼ä¾å¦å
ååæä»¶å¥æï¼ä½æ¯æ¯ä¸ªçº¿ç¨ä¹æèªå·±ç§æçå
å®¹ï¼æ¯å¦ç¨åºè®¡æ°å¨ãæ 以åå±é¨åéãä¸é¢æ±æ»äºè¿ç¨å线ç¨å
±äº«èµæºçåºå«
çº¿ç¨æ¯ä¸ç§`è½»é级`çè¿ç¨ï¼è½»é级ä½ç°å¨çº¿ç¨çå建åéæ¯è¦æ¯è¿ç¨çå¼éå°å¾å¤ã
>注æï¼ä»»ä½æ¯è¾é½æ¯ç¸å¯¹çã
å¨å¤§å¤æ°ç°ä»£æä½ç³»ç»ä¸ï¼é½ä»¥çº¿ç¨ä¸ºåºæ¬çè°åº¦åä½ï¼æä»¥æä»¬çè§è§çéæ¾å¨å¯¹`线ç¨`çæ¢ç©¶ã
## 线ç¨
### ä»ä¹æ¯å¤çº¿ç¨
å¤çº¿ç¨æå³çä½ è½å¤å¨åä¸ä¸ªåºç¨ç¨åºä¸è¿è¡å¤ä¸ªçº¿ç¨ï¼æä»¬ç¥éï¼æä»¤æ¯å¨ CPU 䏿§è¡çï¼å¤çº¿ç¨åºç¨ç¨åºå°±åæ¯å
·æå¤ä¸ª CPU å¨åæ¶æ§è¡åºç¨ç¨åºç代ç ã
å
¶å®è¿æ¯ä¸ç§å象ï¼çº¿ç¨æ°éå¹¶ä¸çäº CPU æ°éï¼å个 CPU å°å¨å¤ä¸ªçº¿ç¨ä¹é´å
±äº« CPU çæ¶é´çï¼å¨ç»å®çæ¶é´çå
æ§è¡æ¯ä¸ªçº¿ç¨ä¹é´çåæ¢ï¼æ¯ä¸ªçº¿ç¨ä¹å¯ä»¥ç±ä¸åç CPU æ§è¡ï¼å¦ä¸å¾æç¤º
### å¹¶ååå¹¶è¡çå
³ç³»
`å¹¶å`æå³çåºç¨ç¨åºä¼æ§è¡å¤ä¸ªçä»»å¡ï¼ä½æ¯å¦æè®¡ç®æºåªæä¸ä¸ª CPU çè¯ï¼é£ä¹åºç¨ç¨åºæ æ³åæ¶æ§è¡å¤ä¸ªçä»»å¡ï¼ä½æ¯åºç¨ç¨åºåéè¦æ§è¡å¤ä¸ªä»»å¡ï¼æä»¥è®¡ç®æºå¨å¼å§æ§è¡ä¸ä¸ä¸ªä»»å¡ä¹åï¼å®å¹¶æ²¡æå®æå½åçä»»å¡ï¼åªæ¯æç¶ææåï¼è¿è¡ä»»å¡åæ¢ï¼CPU å¨å¤ä¸ªä»»å¡ä¹é´è¿è¡åæ¢ï¼ç´å°ä»»å¡å®æãå¦ä¸å¾æç¤º
`å¹¶è¡`æ¯æåºç¨ç¨åºå°å
¶ä»»å¡å解为è¾å°çåä»»å¡ï¼è¿äºåä»»å¡å¯ä»¥å¹¶è¡å¤çï¼ä¾å¦å¨å¤ä¸ªCPUä¸åæ¶è¿è¡ã
### ä¼å¿åå£å¿
åç使ç¨çº¿ç¨æ¯ä¸é¨èºæ¯ï¼åçç¼åä¸éåç¡®æ 误çå¤çº¿ç¨ç¨åºæ´æ¯ä¸é¨èºæ¯ï¼å¦æçº¿ç¨ä½¿ç¨å¾å½ï¼è½å¤ææçéä½ç¨åºçå¼ååç»´æ¤ææ¬ã
Java å¾å¥½çå¨ç¨æ·ç©ºé´å®ç°äºå¼åå·¥å
·å
ï¼å¹¶å¨å
æ ¸ç©ºé´æä¾ç³»ç»è°ç¨æ¥æ¯æå¤çº¿ç¨ç¼ç¨ï¼Java æ¯æäºä¸°å¯çç±»åº `java.util.concurrent` å跨平å°ç`å
忍¡å`ï¼åæ¶ä¹æé«äºå¼å人åç鍿§ï¼å¹¶åä¸ç´ä»¥æ¥æ¯ä¸ä¸ªé«é¶ç主é¢ï¼ä½æ¯ç°å¨ï¼å¹¶åä¹æä¸ºäºä¸»æµå¼å人åçå¿
å¤ç´ è´¨ã
è½ç¶çº¿ç¨å¸¦æ¥ç好å¤å¾å¤ï¼ä½æ¯ç¼åæ£ç¡®çå¤çº¿ç¨ï¼å¹¶åï¼ç¨åºæ¯ä¸ä»¶æå°é¾çäºæ
ï¼å¹¶åç¨åºç Bug å¾å¾ä¼è¯¡å¼å°åºç°å诡å¼çæ¶å¤±ï¼å¨å½ä½ 认为没æé®é¢çæ¶åå®å°±åºç°äºï¼`é¾ä»¥å®ä½` æ¯å¹¶åç¨åºçä¸ä¸ªç¹å¾ï¼æä»¥å¨æ¤åºç¡ä¸ä½ éè¦ææå®çå¹¶ååºæ¬åãé£ä¹ï¼å¹¶å为ä»ä¹ä¼åºç°å¢ï¼
### å¹¶å为ä»ä¹ä¼åºç°
è®¡ç®æºä¸ççå¿«éåå±ç¦»ä¸å¼ CPUãå
åå I/O 设å¤çé«éåå±ï¼ä½æ¯è¿ä¸è
ä¸ç´åå¨éåº¦å·®å¼æ§é®é¢ï¼æä»¬å¯ä»¥ä»åå¨å¨ç屿¬¡ç»æå¯ä»¥çåº
CPU å
鍿¯å¯åå¨çæé ï¼å¯åå¨ç访é®é度è¦é«äº`é«éç¼å`ï¼é«éç¼åç访é®é度è¦é«äºå
åï¼ææ
¢çæ¯ç£ç访é®ã
ç¨åºæ¯å¨å
å䏿§è¡çï¼ç¨åºé大é¨åè¯å¥é½è¦è®¿é®å
åï¼æäºè¿éè¦è®¿é® I/O 设å¤ï¼æ ¹æ®æ¼æ¡¶ç论æ¥è¯´ï¼ç¨åºæ´ä½çæ§è½åå³äºææ
¢çæä½ä¹å°±æ¯ç£ç访é®é度ã
å 为 CPU é度太快äºï¼æä»¥ä¸ºäºåæ¥ CPU çé度ä¼å¿ï¼å¹³è¡¡è¿ä¸è
çé度差å¼ï¼è®¡ç®æºä½ç³»æºæãæä½ç³»ç»ãç¼è¯ç¨åºé½ååºäºè´¡ç®ï¼ä¸»è¦ä½ç°ä¸ºï¼
* CPU 使ç¨ç¼åæ¥ä¸ååå
åç访é®é度差å¼
* æä½ç³»ç»æä¾è¿ç¨å线ç¨è°åº¦ï¼è®© CPU 卿§è¡æä»¤çåæ¶åæ¶å¤ç¨çº¿ç¨ï¼è®©å
ååç£çä¸æäº¤äºï¼ä¸åç `CPU æ¶é´ç` è½å¤æ§è¡ä¸åçä»»å¡ï¼ä»èåè¡¡è¿ä¸è
çå·®å¼
* ç¼è¯ç¨åºæä¾ä¼åæä»¤çæ§è¡é¡ºåºï¼è®©ç¼åè½å¤åçç使ç¨
æä»¬å¨äº«åè¿äºä¾¿å©çåæ¶ï¼å¤çº¿ç¨ä¹ä¸ºæä»¬å¸¦æ¥äºææï¼ä¸é¢æä»¬å°±æ¥æ¢è®¨ä¸ä¸å¹¶åé®é¢ä¸ºä»ä¹ä¼åºç°ä»¥åå¤çº¿ç¨çæºå¤´æ¯ä»ä¹
### 线ç¨å¸¦æ¥çå®å
¨æ§é®é¢
线ç¨å®å
¨æ§æ¯é叏夿çï¼å¨æ²¡æéç¨`忥æºå¶`çæ
åµä¸ï¼å¤ä¸ªçº¿ç¨ä¸çæ§è¡æä½å¾å¾æ¯ä¸å¯é¢æµçï¼è¿ä¹æ¯å¤çº¿ç¨å¸¦æ¥çææä¹ä¸ï¼ä¸é¢æä»¬ç»åºä¸æ®µä»£ç ï¼æ¥ççå®å
¨æ§é®é¢ä½ç°å¨åª
```java
public class TSynchronized implements Runnable{
static int i = 0;
public void increase(){
i++;
}
@Override
public void run() {
for(int i = 0;i < 1000;i++) {
increase();
}
}
public static void main(String[] args) throws InterruptedException {
TSynchronized tSynchronized = new TSynchronized();
Thread aThread = new Thread(tSynchronized);
Thread bThread = new Thread(tSynchronized);
aThread.start();
bThread.start();
System.out.println("i = " + i);
}
}
```
è¿æ®µç¨åºè¾åºåä¼åç°ï¼i ç弿¯æ¬¡é½ä¸ä¸æ ·ï¼è¿ä¸ç¬¦åæä»¬ç颿µï¼é£ä¹ä¸ºä»ä¹ä¼åºç°è¿ç§æ
åµå¢ï¼æä»¬å
æ¥åæä¸ä¸ç¨åºçè¿è¡è¿ç¨ã
`TSynchronized` å®ç°äº Runnable æ¥å£ï¼å¹¶å®ä¹äºä¸ä¸ªéæåé `i`ï¼ç¶åå¨ `increase` æ¹æ³ä¸æ¯æ¬¡é½å¢å i çå¼ï¼å¨å
¶å®ç°ç run æ¹æ³ä¸è¿è¡å¾ªç¯è°ç¨ï¼å
±æ§è¡ 1000 次ã
#### å¯è§æ§é®é¢
å¨åæ ¸ CPU æ¶ä»£ï¼ææç线ç¨å
±ç¨ä¸ä¸ª CPUï¼CPU ç¼ååå
åçä¸è´æ§é®é¢å®¹æè§£å³ï¼CPU å å
åä¹é´
妿ç¨å¾æ¥è¡¨ç¤ºçè¯ææ³ä¼æ¯ä¸é¢è¿æ ·
å¨å¤æ ¸æ¶ä»£ï¼å 为æå¤æ ¸çåå¨ï¼æ¯ä¸ªæ ¸é½è½å¤ç¬ç«çè¿è¡ä¸ä¸ªçº¿ç¨ï¼æ¯é¢ CPU 齿èªå·±çç¼åï¼è¿æ¶ CPU ç¼åä¸å
åçæ°æ®ä¸è´æ§å°±æ²¡é£ä¹å®¹æè§£å³äºï¼å½å¤ä¸ªçº¿ç¨å¨ä¸åç CPU 䏿§è¡æ¶ï¼è¿äºçº¿ç¨æä½çæ¯ä¸åç CPU ç¼å
å 为 i æ¯éæåéï¼æ²¡æç»è¿ä»»ä½çº¿ç¨å®å
¨æªæ½çä¿æ¤ï¼å¤ä¸ªçº¿ç¨ä¼å¹¶åä¿®æ¹ i çå¼ï¼æä»¥æä»¬è®¤ä¸º i 䏿¯çº¿ç¨å®å
¨çï¼å¯¼è´è¿ç§ç»æçåºç°æ¯ç±äº aThread å bThread ä¸è¯»åç i å¼å½¼æ¤ä¸å¯è§ï¼æä»¥è¿æ¯ç±äº `å¯è§æ§` 导è´ç线ç¨å®å
¨é®é¢ã
####ååæ§é®é¢
çèµ·æ¥å¾æ®éç䏿®µç¨åºå´å ä¸ºä¸¤ä¸ªçº¿ç¨ `aThread` å `bThread` äº¤æ¿æ§è¡äº§çäºä¸åçç»æã使¯æ ¹æºä¸æ¯å 为å建äºä¸¤ä¸ªçº¿ç¨å¯¼è´çï¼å¤çº¿ç¨åªæ¯äº§ç线ç¨å®å
¨æ§çå¿
è¦æ¡ä»¶ï¼æç»çæ ¹æºåºç°å¨ `i++` è¿ä¸ªæä½ä¸ã
è¿ä¸ªæä½æä¹äºï¼è¿ä¸å°±æ¯ä¸ä¸ªç» i éå¢çæä½åï¼ä¹å°±æ¯ **i++ => i = i + 1**ï¼è¿æä¹å°±ä¼äº§çé®é¢äºï¼
å 为 `i++` 䏿¯ä¸ä¸ª `ååæ§` æä½ï¼ä»ç»æ³ä¸ä¸ï¼i++ å
¶å®æä¸ä¸ªæ¥éª¤ï¼è¯»å i çå¼ï¼æ§è¡ i + 1 æä½ï¼ç¶åæ i + 1 å¾åºçå¼éæ°èµç» iï¼å°ç»æåå
¥å
åï¼ã
å½ä¸¤ä¸ªçº¿ç¨å¼å§è¿è¡åï¼æ¯ä¸ªçº¿ç¨é½ä¼æ i çå¼è¯»å
¥å° CPU ç¼åä¸ï¼ç¶åæ§è¡ + 1 æä½ï¼åæ + 1 ä¹åçå¼åå
¥å
åãå 为线ç¨é´é½æåèªçèææºæ åç¨åºè®¡æ°å¨ï¼ä»ä»¬å½¼æ¤ä¹é´æ²¡ææ°æ®äº¤æ¢ï¼æä»¥å½ aThread æ§è¡ + 1 æä½åï¼ä¼ææ°æ®åå
¥å°å
åï¼åæ¶ bThread æ§è¡ + 1 æä½åï¼ä¹ä¼ææ°æ®åå
¥å°å
åï¼å 为 CPU æ¶é´ççæ§è¡å¨ææ¯ä¸ç¡®å®çï¼æä»¥ä¼åºç°å½ aThread è¿æ²¡æææ°æ®åå
¥å
åæ¶ï¼bThread å°±ä¼è¯»åå
åä¸çæ°æ®ï¼ç¶åæ§è¡ + 1æä½ï¼åååå
åï¼ä»èè¦ç i çå¼ï¼å¯¼è´ aThread æåçåªåç½è´¹ã
为ä»ä¹ä¸é¢ç线ç¨åæ¢ä¼åºç°é®é¢å¢ï¼
æä»¬å
æ¥èèä¸ä¸æ£å¸¸æ
åµä¸ï¼å³ä¸ä¼åºç°çº¿ç¨å®å
¨æ§é®é¢çæ
åµä¸ï¼ä¸¤æ¡çº¿ç¨çæ§è¡é¡ºåº
å¯ä»¥çå°ï¼å½ aThread 卿§è¡å®æ´ä¸ª i++ çæä½åï¼æä½ç³»ç»å¯¹çº¿ç¨è¿è¡åæ¢ï¼ç± aThread -> bThreadï¼è¿æ¯æçæ³çæä½ï¼ä¸æ¦æä½ç³»ç»å¨ä»»æ `读å/å¢å /åå
¥` é¶æ®µäº§ç线ç¨åæ¢ï¼é½ä¼äº§ç线ç¨å®å
¨é®é¢ãä¾å¦å¦ä¸å¾æç¤º
æå¼å§çæ¶åï¼å
åä¸ i = 0ï¼aThread 读åå
åä¸çå¼å¹¶æå®è¯»åå°èªå·±çå¯åå¨ä¸ï¼æ§è¡ +1 æä½ï¼æ¤æ¶åç线ç¨åæ¢ï¼bThread å¼å§æ§è¡ï¼è¯»åå
åä¸çå¼å¹¶æå®è¯»åå°èªå·±çå¯åå¨ä¸ï¼æ¤æ¶åç线ç¨åæ¢ï¼çº¿ç¨åæ¢è³ aThread å¼å§è¿è¡ï¼aThread æèªå·±å¯åå¨çå¼ååå°å
åä¸ï¼æ¤æ¶ååç线ç¨åæ¢ï¼ç± aThread -> bThreadï¼çº¿ç¨ bThread æèªå·±å¯åå¨çå¼ +1 ç¶åååå
åï¼åå®åå
åä¸çå¼ä¸æ¯ 2 ï¼èæ¯ 1ï¼ å
åä¸ç i å¼è¢«è¦çäºã
æä»¬ä¸é¢æå° `ååæ§` è¿ä¸ªæ¦å¿µï¼é£ä¹ä»ä¹æ¯ååæ§å¢ï¼
> å¹¶åç¼ç¨çååæ§æä½æ¯å®å
¨ç¬ç«äºä»»ä½å
¶ä»è¿ç¨è¿è¡çæä½ï¼ååæä½å¤ç¨äºç°ä»£æä½ç³»ç»åå¹¶è¡å¤çç³»ç»ä¸ã
>
> ååæä½é常å¨å
æ ¸ä¸ä½¿ç¨ï¼å 为å
æ ¸æ¯æä½ç³»ç»ç主è¦ç»ä»¶ã使¯ï¼å¤§å¤æ°è®¡ç®æºç¡¬ä»¶ï¼ç¼è¯å¨ååºä¹æä¾ååæ§æä½ã
>
> å¨å è½½ååå¨ä¸ï¼è®¡ç®æºç¡¬ä»¶å¯¹åå¨å¨åè¿è¡è¯»åååå
¥ã为äºå¯¹å¼è¿è¡å¹é
ãå¢å æè
åå°æä½ï¼ä¸è¬éè¿ååæä½è¿è¡ãå¨ååæä½æé´ï¼å¤çå¨å¯ä»¥å¨å䏿°æ®ä¼ è¾æé´å®æè¯»åååå
¥ã è¿æ ·ï¼å
¶ä»è¾å
¥/è¾åºæºå¶æå¤ç卿 æ³æ§è¡åå¨å¨è¯»åæåå
¥ä»»å¡ï¼ç´å°ååæä½å®æä¸ºæ¢ã
ç®åæ¥è®²ï¼å°±æ¯**ååæä½è¦ä¹å
¨é¨æ§è¡ï¼è¦ä¹å
¨é¨ä¸æ§è¡**ãæ°æ®åºäºå¡çå忧乿¯åºäºè¿ä¸ªæ¦å¿µæ¼è¿çã
#### æåºæ§é®é¢
å¨å¹¶åç¼ç¨ä¸è¿æå¸¦æ¥è®©äººé常头ç¼ç `æåºæ§` é®é¢ï¼æåºæ§é¡¾åæä¹å°±æ¯é¡ºåºæ§ï¼å¨è®¡ç®æºä¸æçå°±æ¯æä»¤çå
åæ§è¡é¡ºåºãä¸ä¸ªé常æ¾èæè§çä¾åå°±æ¯ JVM ä¸ç`ç±»å è½½`
è¿æ¯ä¸ä¸ª JVM å 载类çè¿ç¨å¾ï¼ä¹ç§°ä¸ºç±»ççå½å¨æï¼ç±»ä»å è½½å° JVM å°å¸è½½ä¸å
±ä¼ç»åäºä¸ªé¶æ®µ **å è½½ãè¿æ¥ãåå§åã使ç¨ãå¸è½½**ãè¿äºä¸ªè¿ç¨çæ§è¡é¡ºåºæ¯ä¸å®çï¼ä½æ¯å¨è¿æ¥é¶æ®µï¼ä¹ä¼å为ä¸ä¸ªè¿ç¨ï¼å³ **éªè¯ãåå¤ãè§£æ** é¶æ®µï¼è¿ä¸ä¸ªé¶æ®µçæ§è¡é¡ºåºä¸æ¯ç¡®å®çï¼é常交åè¿è¡ï¼å¨ä¸ä¸ªé¶æ®µçæ§è¡è¿ç¨ä¸ä¼æ¿æ´»å¦ä¸ä¸ªé¶æ®µã
æåºæ§é®é¢ä¸è¬æ¯ç¼è¯å¨å¸¦æ¥çï¼ç¼è¯å¨æçæ¶åç¡®å®æ¯ **好å¿ååäº**ï¼å®ä¸ºäºä¼åç³»ç»æ§è½ï¼å¾å¾æ´æ¢æä»¤çæ§è¡é¡ºåºã
#### æ´»è·æ§é®é¢
å¤çº¿ç¨è¿ä¼å¸¦æ¥`æ´»è·æ§`é®é¢ï¼å¦ä½å®ä¹æ´»è·æ§é®é¢å¢ï¼æ´»è·æ§é®é¢å
³æ³¨çæ¯ **æä»¶äºæ
æ¯å¦ä¼åç**ã
**妿ä¸ç»çº¿ç¨ä¸çæ¯ä¸ªçº¿ç¨é½å¨çå¾
ä¸ä¸ªäºä»¶çåçï¼èè¿ä¸ªäºä»¶åªè½ç±è¯¥ç»ä¸æ£å¨çå¾
ç线ç¨è§¦åï¼è¿ç§æ
åµä¼å¯¼è´æ»é**ã
ç®åä¸ç¹æ¥è¡¨è¿°ä¸ä¸ï¼å°±æ¯æ¯ä¸ªçº¿ç¨é½å¨çå¾
å
¶ä»çº¿ç¨éæ¾èµæºï¼èå
¶ä»èµæºä¹å¨çå¾
æ¯ä¸ªçº¿ç¨éæ¾èµæºï¼è¿æ ·æ²¡æçº¿ç¨æ¢å
éæ¾èªå·±çèµæºï¼è¿ç§æ
åµä¼äº§çæ»éï¼ææçº¿ç¨é½ä¼æ éççå¾
ä¸å»ã
**æ»éçå¿
è¦æ¡ä»¶**
é ææ»éçåå æå个ï¼ç ´åå
¶ä¸ä¸ä¸ªå³å¯ç ´åæ»é
* äºæ¥æ¡ä»¶ï¼æè¿ç¨å¯¹æåé
å°çèµæºè¿è¡æå®æ§ä½¿ç¨ï¼å³å¨ä¸æ®µæ¶é´å
æèµæºåªç±ä¸ä¸ªè¿ç¨å ç¨ãå¦ææ¤æ¶è¿æå
¶å®è¿ç¨è¯·æ±èµæºï¼å请æ±è
åªè½çå¾
ï¼ç´è³å æèµæºçè¿ç¨éæ¾ã
* 请æ±åä¿ææ¡ä»¶ï¼æè¿ç¨å·²ç»ä¿æè³å°ä¸ä¸ªèµæºï¼ä½åæåºäºæ°çèµæºè¯·æ±ï¼èè¯¥èµæºå·²è¢«å
¶å®è¿ç¨å æï¼æ¤æ¶è¯·æ±è¿ç¨é»å¡ï¼ä½å对èªå·±å·²è·å¾çå
¶å®èµæºä¿æå æã
* ä¸å¥å¤ºæ¡ä»¶ï¼æè¿ç¨å·²è·å¾çèµæºï¼å¨æªä½¿ç¨å®ä¹åï¼ä¸è½è¢«å¥å¤ºï¼åªè½å¨ä½¿ç¨å®æ¶ç±èªå·±éæ¾ã
* 循ç¯çå¾
ï¼æå¨åçæ»éæ¶ï¼å¿
ç¶åå¨ä¸ä¸ªè¿ç¨å¯¹åºçç¯å½¢é¾ã
æ¢å¥è¯è¯´ï¼æ»é线ç¨éåä¸çæ¯ä¸ªçº¿ç¨é½å¨çå¾
å¦ä¸ä¸ªæ»é线ç¨å æçèµæºã使¯ç±äºææçº¿ç¨é½ä¸è½è¿è¡ï¼å®ä»¬ä¹ä¸ä»»ä½ä¸ä¸ªèµæºé½æ æ³éæ¾èµæºï¼æä»¥æ²¡æä¸ä¸ªçº¿ç¨å¯ä»¥è¢«å¤éã
å¦æè¯´æ»éå¾`ç´æ
`çè¯ï¼é£ä¹`æ´»é`ç¨ä¸åæè¯æ¥è¡¨ç¤ºå°±æ¯ `å¼å·§ææ`ã
æäºæ
åµä¸ï¼å½çº¿ç¨æè¯å°å®ä¸è½è·åæéè¦çä¸ä¸ä¸ªéæ¶ï¼å°±ä¼å°è¯ç¤¼è²ç鿾已ç»è·å¾çéï¼ç¶åçå¾
é常ççæ¶é´å次å°è¯è·åãå¯ä»¥æ³åä¸ä¸è¿ä¸ªåºæ¯ï¼å½ä¸¤ä¸ªäººå¨çè·¯ç¸é¢çæ¶åï¼é½æ³ç»å¯¹æ¹è®©è·¯ï¼ç¸åçæ¥è°ä¼å¯¼è´åæ¹é½æ æ³åè¿ã
ç°å¨åæ³æä¸å¯¹å¹¶è¡ç线ç¨ç¨å°äºä¸¤ä¸ªèµæºãå®ä»¬åå«å°è¯è·åå¦ä¸ä¸ªé失败åï¼ä¸¤ä¸ªçº¿ç¨é½ä¼éæ¾èªå·±ææçéï¼å次è¿è¡å°è¯ï¼è¿ä¸ªè¿ç¨ä¼ä¸ç´è¿è¡éå¤ã徿æ¾ï¼è¿ä¸ªè¿ç¨ä¸æ²¡æçº¿ç¨é»å¡ï¼ä½æ¯çº¿ç¨ä»ç¶ä¸ä¼å䏿§è¡ï¼è¿ç§ç¶åµæä»¬ç§°ä¹ä¸º `æ´»é(livelock)`ã
妿æä»¬ææçäºæ
ä¸ç´ä¸ä¼åçï¼å°±ä¼äº§çæ´»è·æ§é®é¢ï¼æ¯å¦å线ç¨ä¸çæ é循ç¯
```java
while(true){...}
for(;;){}
```
å¨å¤çº¿ç¨ä¸ï¼æ¯å¦ aThread å bThread é½éè¦æç§èµæºï¼aThread ä¸ç´å ç¨èµæºä¸éæ¾ï¼bThread ä¸ç´å¾ä¸å°æ§è¡ï¼å°±ä¼é ææ´»è·æ§é®é¢ï¼bThread 线ç¨ä¼äº§ç`饥饿`ï¼æä»¬åé¢ä¼è¯´ã
#### æ§è½é®é¢
䏿´»è·æ§é®é¢å¯åç¸å
³çæ¯ `æ§è½` é®é¢ï¼å¦æè¯´æ´»è·æ§é®é¢å
³æ³¨çæ¯æç»çç»æï¼é£ä¹æ§è½é®é¢å
³æ³¨çå°±æ¯é æç»æçè¿ç¨ï¼æ§è½é®é¢æå¾å¤æ¹é¢ï¼æ¯å¦**æå¡æ¶é´è¿é¿ï¼ååçè¿ä½ï¼èµæºæ¶èè¿é«**ï¼å¨å¤çº¿ç¨ä¸è¿æ ·çé®é¢åæ ·åå¨ã
å¨å¤çº¿ç¨ä¸ï¼æä¸ä¸ªé常éè¦çæ§è½å ç´ é£å°±æ¯æä»¬ä¸é¢æå°ç `线ç¨åæ¢`ï¼ä¹ç§°ä¸º `ä¸ä¸æåæ¢(Context Switch)`ï¼è¿ç§æä½å¼éå¾å¤§ã
>å¨è®¡ç®æºä¸çä¸ï¼èå¤é½åæ¬¢ç¨ context ä¸ä¸æè¿ä¸ªè¯ï¼è¿ä¸ªè¯æ¶µççå
容å¾å¤ï¼å
æ¬ä¸ä¸æåæ¢çèµæºï¼å¯åå¨çç¶æãç¨åºè®¡æ°å¨çãcontext switch ä¸è¬æçå°±æ¯è¿äºä¸ä¸æåæ¢çèµæºãå¯åå¨ç¶æãç¨åºè®¡æ°å¨çååçã
å¨ä¸ä¸æåæ¢ä¸ï¼ä¼ä¿å忢å¤ä¸ä¸æï¼ä¸¢å¤±å±é¨æ§ï¼æå¤§éçæ¶é´æ¶èå¨çº¿ç¨åæ¢ä¸è䏿¯çº¿ç¨è¿è¡ä¸ã
为ä»ä¹çº¿ç¨åæ¢ä¼å¼é妿¤ä¹å¤§å¢ï¼çº¿ç¨é´ç忢伿¶åå°ä»¥ä¸å 个æ¥éª¤
å° CPU ä»ä¸ä¸ªçº¿ç¨åæ¢å°å¦ä¸çº¿ç¨æ¶åæèµ·å½å线ç¨ï¼ä¿åå
¶ç¶æï¼ä¾å¦å¯åå¨ï¼ç¶åæ¢å¤å°è¦åæ¢ç线ç¨çç¶æï¼å è½½æ°çç¨åºè®¡æ°å¨ï¼æ¤æ¶çº¿ç¨åæ¢å®é
ä¸å°±å·²ç»å®æäºï¼æ¤æ¶ï¼CPU ä¸å¨æ§è¡çº¿ç¨åæ¢ä»£ç ï¼è¿èæ§è¡æ°çå线ç¨å
³èç代ç ã
### å¼èµ·çº¿ç¨åæ¢çå ç§æ¹å¼
线ç¨é´ç忢ä¸è¬æ¯æä½ç³»ç»å±é¢éè¦èèçé®é¢ï¼é£ä¹å¼èµ·çº¿ç¨ä¸ä¸æåæ¢æåªå ç§æ¹å¼å¢ï¼æè
说线ç¨åæ¢æåªå ç§è¯±å å¢ï¼ä¸»è¦æä¸é¢å ç§å¼èµ·ä¸ä¸æåæ¢çæ¹å¼
* å½åæ£å¨æ§è¡çä»»å¡å®æï¼ç³»ç»ç CPU æ£å¸¸è°åº¦ä¸ä¸ä¸ªéè¦è¿è¡ç线ç¨
* å½åæ£å¨æ§è¡çä»»å¡éå° I/O çé»å¡æä½ï¼çº¿ç¨è°åº¦å¨æèµ·æ¤ä»»å¡ï¼ç»§ç»è°åº¦ä¸ä¸ä¸ªä»»å¡ã
* å¤ä¸ªä»»å¡å¹¶åæ¢å éèµæºï¼å½å任塿²¡æè·å¾éèµæºï¼è¢«çº¿ç¨è°åº¦å¨æèµ·ï¼ç»§ç»è°åº¦ä¸ä¸ä¸ªä»»å¡ã
* ç¨æ·çä»£ç æèµ·å½åä»»å¡ï¼æ¯å¦çº¿ç¨æ§è¡ sleep æ¹æ³ï¼è®©åºCPUã
* 使ç¨ç¡¬ä»¶ä¸æçæ¹å¼å¼èµ·ä¸ä¸æåæ¢
## 线ç¨å®å
¨æ§
å¨ Java ä¸ï¼è¦å®ç°çº¿ç¨å®å
¨æ§ï¼å¿
é¡»è¦æ£ç¡®ç使ç¨çº¿ç¨åéï¼ä½æ¯è¿äºåªæ¯æ»¡è¶³çº¿ç¨å®å
¨çä¸ç§æ¹å¼ï¼è¦ç¼åæ£ç¡®æ 误ç线ç¨å®å
¨ç代ç ï¼å
¶æ ¸å¿å°±æ¯å¯¹ç¶æè®¿é®æä½è¿è¡ç®¡çãæéè¦çå°±æ¯æ `å
±äº«(Shared)`ç å `å¯å(Mutable)`çç¶æãåªæå
±äº«åå¯åçåéæä¼åºç°é®é¢ï¼ç§æåéä¸ä¼åºç°é®é¢ï¼åè`ç¨åºè®¡æ°å¨`ã
对象çç¶æå¯ä»¥ç解为åå¨å¨å®ä¾åéæè
éæåéä¸çæ°æ®ï¼å
±äº«æå³çæä¸ªåéå¯ä»¥è¢«å¤ä¸ªçº¿ç¨åæ¶è®¿é®ãå¯åæå³çåéå¨çå½å¨æå
ä¼åçååãä¸ä¸ªå鿝妿¯çº¿ç¨å®å
¨çï¼åå³äºå®æ¯å¦è¢«å¤ä¸ªçº¿ç¨è®¿é®ãè¦ä½¿åéè½å¤è¢«å®å
¨è®¿é®ï¼å¿
é¡»éè¿åæ¥æºå¶æ¥å¯¹åéè¿è¡ä¿®é¥°ã
妿ä¸éç¨åæ¥æºå¶çè¯ï¼é£ä¹å°±è¦é¿å
å¤çº¿ç¨å¯¹å
±äº«åéç访é®ï¼ä¸»è¦æä¸é¢ä¸¤ç§æ¹å¼
* ä¸è¦å¨å¤çº¿ç¨ä¹é´å
±äº«åé
* å°å
±äº«åé置为ä¸å¯åç
æä»¬è¯´äºè¿ä¹å¤æ¬¡çº¿ç¨å®å
¨æ§ï¼é£ä¹ä»ä¹æ¯çº¿ç¨å®å
¨æ§å¢ï¼
### ä»ä¹æ¯çº¿ç¨å®å
¨æ§
å¤ä¸ªçº¿ç¨å¯ä»¥åæ¶å®å
¨è°ç¨ç代ç 称为线ç¨å®å
¨çï¼å¦æä¸æ®µä»£ç æ¯å®å
¨çï¼é£ä¹è¿æ®µä»£ç å°±ä¸åå¨ `ç«ææ¡ä»¶`ãä»
ä»
å½å¤ä¸ªçº¿ç¨å
±äº«èµæºæ¶ï¼æä¼åºç°ç«ææ¡ä»¶ã
æ ¹æ®ä¸é¢çæ¢è®¨ï¼æä»¬å¯ä»¥å¾åºä¸ä¸ªç®åçç»è®ºï¼**å½å¤ä¸ªçº¿ç¨è®¿é®æä¸ªç±»æ¶ï¼è¿ä¸ªç±»å§ç»é½è½è¡¨ç°åºæ£ç¡®çè¡ä¸ºï¼é£ä¹å°±ç§°è¿ä¸ªç±»æ¯çº¿ç¨å®å
¨ç**ã
å线ç¨å°±æ¯ä¸ä¸ªçº¿ç¨æ°é为 1 çå¤çº¿ç¨ï¼å线ç¨ä¸å®æ¯çº¿ç¨å®å
¨çã读åæä¸ªåéçå¼ä¸ä¼äº§çå®å
¨æ§é®é¢ï¼å 为ä¸ç®¡è¯»åå¤å°æ¬¡ï¼è¿ä¸ªåéçå¼é½ä¸ä¼è¢«ä¿®æ¹ã
### ååæ§
æä»¬ä¸é¢æå°äºååæ§çæ¦å¿µï¼ä½ å¯ä»¥æ`ååæ§`æä½æ³è±¡æä¸ºä¸ä¸ª`ä¸å¯åå²` çæ´ä½ï¼å®çç»æåªæä¸¤ç§ï¼è¦ä¹å
¨é¨æ§è¡ï¼è¦ä¹å
¨é¨åæ»ãä½ å¯ä»¥æååæ§è®¤ä¸ºæ¯ `å©å§»å
³ç³»` çä¸ç§ï¼ç·äººå女人åªä¼äº§ç两ç§ç»æï¼`好好ç` å `说æ£å°±æ£`ï¼ä¸è¬ç·äººçä¸çé½å¯ä»¥æä»çææ¯ååæ§çä¸ç§ï¼å½ç¶æä»¬ä¸æé¤`æ¶é´ç®¡ç(线ç¨åæ¢)`ç个ä¾ï¼æä»¬ç¥é线ç¨åæ¢å¿
ç¶ä¼ä¼´éçå®å
¨æ§é®é¢ï¼ç·äººè¦åºå»æµªä¹ä¼é æä¸¤ç§ç»æï¼è¿ä¸¤ç§ç»æåå«å¯¹åºå®å
¨æ§çä¸¤ä¸ªç»æï¼çº¿ç¨å®å
¨ï¼å¥½å¥½çï¼å线ç¨ä¸å®å
¨ï¼è¯´æ£å°±æ£ï¼ã
### ç«ææ¡ä»¶
æäºä¸é¢ç线ç¨åæ¢çååºï¼é£ä¹ç«ææ¡ä»¶ä¹å°±å¥½å®ä¹äºï¼å®æçå°±æ¯**两个æå¤ä¸ªçº¿ç¨åæ¶å¯¹ä¸å
±äº«æ°æ®è¿è¡ä¿®æ¹ï¼ä»èå½±åç¨åºè¿è¡çæ£ç¡®æ§æ¶ï¼è¿ç§å°±è¢«ç§°ä¸ºç«ææ¡ä»¶(race condition)** ï¼çº¿ç¨åæ¢æ¯å¯¼è´ç«ææ¡ä»¶åºç°ç诱导å ç´ ï¼æä»¬éè¿ä¸ä¸ªç¤ºä¾æ¥è¯´æï¼æ¥ç䏿®µä»£ç
```java
public class RaceCondition {
private Signleton single = null;
public Signleton newSingleton(){
if(single == null){
single = new Signleton();
}
return single;
}
}
```
å¨ä¸é¢ç代ç ä¸ï¼æ¶åå°ä¸ä¸ªç«ææ¡ä»¶ï¼é£å°±æ¯å¤æ `single` çæ¶åï¼å¦æ single å¤æä¸ºç©ºï¼æ¤æ¶åçäºçº¿ç¨åæ¢ï¼å¦å¤ä¸ä¸ªçº¿ç¨æ§è¡ï¼å¤æ single çæ¶åï¼ä¹æ¯ç©ºï¼æ§è¡ new æä½ï¼ç¶å线ç¨åæ¢åä¹åç线ç¨ï¼åæ§è¡ new æä½ï¼é£ä¹å
åä¸å°±ä¼æä¸¤ä¸ª Singleton 对象ã
### å éæºå¶
å¨ Java ä¸ï¼æå¾å¤ç§æ¹å¼æ¥å¯¹å
±äº«åå¯åçèµæºè¿è¡å éåä¿æ¤ãJava æä¾ä¸ç§å
ç½®çæºå¶å¯¹èµæºè¿è¡ä¿æ¤ï¼`synchronized` å
³é®åï¼å®æä¸ç§ä¿æ¤æºå¶
* å¯¹æ¹æ³è¿è¡å éï¼ç¡®ä¿å¤ä¸ªçº¿ç¨ä¸åªæä¸ä¸ªçº¿ç¨æ§è¡æ¹æ³ï¼
* 对æä¸ªå¯¹è±¡å®ä¾ï¼å¨æä»¬ä¸é¢çæ¢è®¨ä¸ï¼åéå¯ä»¥ä½¿ç¨å¯¹è±¡æ¥æ¿æ¢ï¼è¿è¡å éï¼ç¡®ä¿å¤ä¸ªçº¿ç¨ä¸åªæä¸ä¸ªçº¿ç¨å¯¹å¯¹è±¡å®ä¾è¿è¡è®¿é®ï¼
* 对类对象è¿è¡å éï¼ç¡®ä¿å¤ä¸ªçº¿ç¨åªæä¸ä¸ªçº¿ç¨è½å¤è®¿é®ç±»ä¸çèµæºã
synchronized å
³é®åå¯¹èµæºè¿è¡ä¿æ¤ç代ç åä¿ç§° `忥代ç å(Synchronized Block)`ï¼ä¾å¦
```java
synchronized(lock){
// 线ç¨å®å
¨ç代ç
}
```
æ¯ä¸ª Java 对象é½å¯ä»¥ç¨åä¸ä¸ªå®ç°åæ¥çéï¼è¿äºé被称为 `å
ç½®é(Instrinsic Lock)`æè
`çè§å¨é(Monitor Lock)`ã线ç¨å¨è¿å
¥åæ¥ä»£ç ä¹åä¼èªå¨è·å¾éï¼å¹¶ä¸å¨éåºåæ¥ä»£ç æ¶èªå¨éæ¾éï¼èæ 论æ¯éè¿æ£å¸¸æ§è¡è·¯å¾éåºè¿æ¯éè¿å¼å¸¸è·¯å¾éåºï¼è·å¾å
ç½®éçå¯ä¸éå¾å°±æ¯è¿å
¥è¿ä¸ªç±éä¿æ¤ç忥代ç åææ¹æ³ã
synchronized çå¦ä¸ç§éå«çè¯ä¹å°±æ¯ `äºæ¥`ï¼äºæ¥æå³ç`ç¬å `ï¼æå¤åªæä¸ä¸ªçº¿ç¨ææéï¼å½çº¿ç¨ A å°è¯è·å¾ä¸ä¸ªç±çº¿ç¨ B ææçéæ¶ï¼çº¿ç¨ A å¿
é¡»çå¾
æè
é»å¡ï¼ç´å°çº¿ç¨ B éæ¾è¿ä¸ªéï¼å¦æçº¿ç¨ B ä¸éæ¾éçè¯ï¼é£ä¹çº¿ç¨ A å°ä¼ä¸ç´çå¾
ä¸å»ã
çº¿ç¨ A è·å¾çº¿ç¨ B ææçéæ¶ï¼çº¿ç¨ A å¿
é¡»çå¾
æè
é»å¡ï¼ä½æ¯è·åéççº¿ç¨ B å¯ä»¥éå
¥ï¼éå
¥çææå¯ä»¥ç¨ä¸æ®µä»£ç 表示
```java
public class Retreent {
public synchronized void doSomething(){
doSomethingElse();
System.out.println("doSomething......");
}
public synchronized void doSomethingElse(){
System.out.println("doSomethingElse......");
}
```
è·å doSomething() æ¹æ³éç线ç¨å¯ä»¥æ§è¡ doSomethingElse() æ¹æ³ï¼æ§è¡å®æ¯åå¯ä»¥éæ°æ§è¡ doSomething() æ¹æ³ä¸çå
容ãééå
¥ä¹æ¯æåç±»åç¶ç±»ä¹é´çéå
¥ï¼å
·ä½çæä»¬åé¢ä¼è¿è¡ä»ç»ã
`volatile` æ¯ä¸ç§è½»é级ç `synchronized`ï¼ä¹å°±æ¯ä¸ç§è½»é级çå éæ¹å¼ï¼volatile éè¿ä¿è¯å
±äº«åéçå¯è§æ§æ¥ä»ä¾§é¢å¯¹å¯¹è±¡è¿è¡å éãå¯è§æ§çææå°±æ¯å½ä¸ä¸ªçº¿ç¨ä¿®æ¹ä¸ä¸ªå
±äº«åéæ¶ï¼å¦å¤ä¸ä¸ªçº¿ç¨è½å¤ `çè§` è¿ä¸ªä¿®æ¹çå¼ãvolatile çæ§è¡ææ¬è¦æ¯ `synchronized` ä½å¾å¤ï¼å 为 volatile ä¸ä¼å¼èµ·çº¿ç¨çä¸ä¸æåæ¢ã
æä»¬è¿å¯ä»¥ä½¿ç¨`ååç±»` æ¥ä¿è¯çº¿ç¨å®å
¨ï¼ååç±»å
¶å®å°±æ¯ `rt.jar` ä¸é¢ä»¥ `atomic` å¼å¤´çç±»
餿¤ä¹å¤ï¼æä»¬è¿å¯ä»¥ä½¿ç¨ `java.util.concurrent` å·¥å
·å
ä¸ç线ç¨å®å
¨çéåç±»æ¥ç¡®ä¿çº¿ç¨å®å
¨ï¼å
·ä½çå®ç°ç±»åå
¶åçæä»¬åé¢ä¼è¯´ã
å¯ä»¥ä½¿ç¨ä¸åç并忍¡åæ¥å®ç°å¹¶åç³»ç»ï¼å¹¶å模åè¯´çæ¯ç³»ç»ä¸ç线ç¨å¦ä½åä½å®æå¹¶åä»»å¡ãä¸åç并忍¡å以ä¸åçæ¹å¼æåä»»å¡ï¼çº¿ç¨å¯ä»¥ä»¥ä¸åçæ¹å¼è¿è¡éä¿¡ååä½ã
## ç«ææ¡ä»¶åå
³é®åºå
ç«ææ¡ä»¶æ¯å¨å
³é®ä»£ç åºååççä¸ç§ç¹æ®æ¡ä»¶ãå
³é®åºåæ¯ç±å¤ä¸ªçº¿ç¨åæ¶æ§è¡ç代ç é¨åï¼å
³é®åºåä¸çä»£ç æ§è¡é¡ºåºä¼å¯¹é æä¸ä¸æ ·çç»æã妿å¤ä¸ªçº¿ç¨æ§è¡ä¸æ®µå
³é®ä»£ç ï¼èè¿æ®µå
³é®ä»£ç ä¼å 为æ§è¡é¡ºåºä¸åèé æä¸åçç»ææ¶ï¼é£ä¹è¿æ®µä»£ç å°±ä¼å
å«ç«äºæ¡ä»¶ã
## 并忍¡åååå¸å¼ç³»ç»å¾ç¸ä¼¼
并忍¡åå
¶å®ååå¸å¼ç³»ç»æ¨¡åé常ç¸ä¼¼ï¼å¨å¹¶å模å䏿¯`线ç¨`å½¼æ¤è¿è¡éä¿¡ï¼èå¨åå¸å¼ç³»ç»æ¨¡å䏿¯ `è¿ç¨` å½¼æ¤è¿è¡éä¿¡ãç¶èæ¬è´¨ä¸ï¼è¿ç¨å线ç¨ä¹é常ç¸ä¼¼ãè¿ä¹å°±æ¯ä¸ºä»ä¹å¹¶å模åååå¸å¼æ¨¡åé常ç¸ä¼¼çåå ã
åå¸å¼ç³»ç»éå¸¸è¦æ¯å¹¶åç³»ç»é¢ä¸´æ´å¤çææåé®é¢æ¯å¦è¿ç¨éä¿¡ãç½ç»å¯è½åºç°å¼å¸¸ï¼æè
è¿ç¨æºå¨ææççã使¯ä¸ä¸ªå¹¶å模ååæ ·é¢ä¸´çæ¯å¦ CPU æ
éãç½å¡åºç°é®é¢ã硬çåºç°é®é¢çã
å ä¸ºå¹¶åæ¨¡åååå¸å¼æ¨¡åå¾ç¸ä¼¼ï¼å æ¤ä»ä»¬å¯ä»¥ç¸äºåé´ï¼ä¾å¦ç¨äºçº¿ç¨åé
çæ¨¡å就类似äºåå¸å¼ç³»ç»ç¯å¢ä¸çè´è½½å衡模åã
å
¶å®è¯´ç½äºï¼åå¸å¼æ¨¡åçææ³å°±æ¯åé´å¹¶å模åçåºç¡ä¸æ¨æ¼å屿¥çã
## 认è¯ä¸¤ä¸ªç¶æ
并忍¡åçä¸ä¸ªéè¦çæ¹é¢æ¯ï¼çº¿ç¨æ¯å¦åºè¯¥`å
±äº«ç¶æ`ï¼æ¯å
·æ`å
±äº«ç¶æ`è¿æ¯`ç¬ç«ç¶æ`ãå
±äº«ç¶æä¹å°±æå³çå¨ä¸å线ç¨ä¹é´å
±äº«æäºç¶æ
ç¶æå
¶å®å°±æ¯`æ°æ®`ï¼æ¯å¦ä¸ä¸ªæè
å¤ä¸ªå¯¹è±¡ãå½çº¿ç¨è¦å
±äº«æ°æ®æ¶ï¼å°±ä¼é æ `ç«ææ¡ä»¶` æè
`æ»é` çé®é¢ãå½ç¶ï¼è¿äºé®é¢åªæ¯å¯è½ä¼åºç°ï¼å
·ä½å®ç°æ¹å¼åå³äºä½ æ¯å¦å®å
¨ç使ç¨å访é®å
±äº«å¯¹è±¡ã
ç¬ç«çç¶æè¡¨æç¶æä¸ä¼å¨å¤ä¸ªçº¿ç¨ä¹é´å
±äº«ï¼å¦æçº¿ç¨ä¹é´éè¦éä¿¡çè¯ï¼ä»ä»¬å¯ä»¥è®¿é®ä¸å¯åç对象æ¥å®ç°ï¼è¿æ¯æææçé¿å
å¹¶åé®é¢çä¸ç§æ¹å¼ï¼å¦ä¸å¾æç¤º
使ç¨ç¬ç«ç¶æè®©æä»¬ç设计æ´å ç®åï¼å ä¸ºåªæä¸ä¸ªçº¿ç¨è½å¤è®¿é®å¯¹è±¡ï¼å³ä½¿äº¤æ¢å¯¹è±¡ï¼ä¹æ¯ä¸å¯åç对象ã
## 并忍¡å
### å¹¶è¡ Worker
第ä¸ä¸ªå¹¶åæ¨¡åæ¯å¹¶è¡ worker 模åï¼å®¢æ·ç«¯ä¼æä»»å¡äº¤ç» `代ç人(Delegator)`ï¼ç¶åç±ä»£ç人æå·¥ä½åé
ç»ä¸åç `工人(worker)`ãå¦ä¸å¾æç¤º
å¹¶è¡ worker çæ ¸å¿ææ³æ¯ï¼å®ä¸»è¦æä¸¤ä¸ªè¿ç¨å³ä»£ç人å工人ï¼Delegator è´è´£æ¥æ¶æ¥èªå®¢æ·ç«¯çä»»å¡å¹¶æä»»å¡ä¸åï¼äº¤ç»å
·ä½ç Worker è¿è¡å¤çï¼Worker å¤ç宿åæç»æè¿åç» Delegatorï¼å¨ Delegator æ¥æ¶å° Worker å¤ççç»æå对å
¶è¿è¡æ±æ»ï¼ç¶å交ç»å®¢æ·ç«¯ã
å¹¶è¡ Worker æ¨¡åæ¯ Java 并忍¡åä¸é常常è§çä¸ç§æ¨¡åãè®¸å¤ `java.util.concurrent` å
ä¸çå¹¶åå·¥å
·é½ä½¿ç¨äºè¿ç§æ¨¡åã
#### å¹¶è¡ Worker çä¼ç¹
å¹¶è¡ Worker 模åçä¸ä¸ªéå¸¸ææ¾çç¹ç¹å°±æ¯å¾å®¹æçè§£ï¼ä¸ºäºæé«ç³»ç»çå¹¶è¡åº¦ä½ å¯ä»¥å¢å å¤ä¸ª Worker 宿任å¡ã
å¹¶è¡ Worker 模åçå¦å¤ä¸ä¸ªå¥½å¤å°±æ¯ï¼å®ä¼å°ä¸ä¸ªä»»å¡æåæå¤ä¸ªå°ä»»å¡ï¼å¹¶åæ§è¡ï¼Delegator 卿¥åå° Worker çå¤çç»æåå°±ä¼è¿åç» Clientï¼æ´ä¸ª Worker -> Delegator -> Client çè¿ç¨æ¯`弿¥`çã
#### å¹¶è¡ Worker ç缺ç¹
åæ ·çï¼å¹¶è¡ Worker 模å¼åæ ·ä¼æä¸äºéèç缺ç¹
**å
±äº«ç¶æä¼åå¾å¾å¤æ**
å®é
çå¹¶è¡ Worker è¦æ¯æä»¬å¾ä¸ç»åºçæ´å¤æï¼ä¸»è¦æ¯å¹¶è¡ Worker é常ä¼è®¿é®å
åæå
±äº«æ°æ®åºä¸çæäºå
±äº«æ°æ®ã
è¿äºå
±äº«ç¶æå¯è½ä¼ä½¿ç¨ä¸äºå·¥ä½é忥ä¿åä¸å¡æ°æ®ãæ°æ®ç¼åãæ°æ®åºçè¿æ¥æ± çãå¨çº¿ç¨éä¿¡ä¸ï¼çº¿ç¨éè¦ç¡®ä¿å
±äº«ç¶ææ¯å¦è½å¤è®©å
¶ä»çº¿ç¨å
±äº«ï¼è䏿¯ä»
ä»
åçå¨ CPU ç¼åä¸è®©èªå·±å¯ç¨ï¼å½ç¶è¿äºé½æ¯ç¨åºåå¨è®¾è®¡æ¶å°±éè¦èèçé®é¢ã线ç¨éè¦é¿å
`ç«ææ¡ä»¶`ï¼`æ»é` å许å¤å
¶ä»å
±äº«ç¶æé æçå¹¶åé®é¢ã
å¤çº¿ç¨å¨è®¿é®å
±äº«æ°æ®æ¶ï¼ä¼ä¸¢å¤±å¹¶åæ§ï¼å 为æä½ç³»ç»è¦ä¿è¯åªæä¸ä¸ªçº¿ç¨è½å¤è®¿é®æ°æ®ï¼è¿ä¼å¯¼è´å
±äº«æ°æ®çäºç¨åæ¢å ãæªæ¢å å°èµæºç线ç¨ä¼ `é»å¡`ã
ç°ä»£çéé»å¡å¹¶åç®æ³å¯ä»¥åå°äºç¨æé«æ§è½ï¼ä½æ¯éé»å¡ç®æ³æ¯è¾é¾ä»¥å®ç°ã
`坿ä¹
åçæ°æ®ç»æ(Persistent data structures)` æ¯å¦å¤ä¸ä¸ªéæ©ã坿ä¹
åçæ°æ®ç»æå¨ä¿®æ¹åå§ç»ä¼ä¿çå
åçæ¬ãå æ¤ï¼å¦æå¤ä¸ªçº¿ç¨åæ¶ä¿®æ¹ä¸ä¸ªå¯æä¹
åçæ°æ®ç»æï¼å¹¶ä¸ä¸ä¸ªçº¿ç¨å¯¹å
¶è¿è¡äºä¿®æ¹ï¼åä¿®æ¹ç线ç¨ä¼è·å¾å¯¹æ°æ°æ®ç»æçå¼ç¨ã
è½ç¶å¯æä¹
åçæ°æ®ç»ææ¯ä¸ä¸ªæ°çè§£å³æ¹æ³ï¼ä½æ¯è¿ç§æ¹æ³å®è¡èµ·æ¥å´æä¸äºé®é¢ï¼æ¯å¦ï¼ä¸ä¸ªæä¹
å表ä¼å°æ°å
ç´ æ·»å å°å表çå¼å¤´ï¼å¹¶è¿åææ·»å çæ°å
ç´ çå¼ç¨ï¼ä½æ¯å
¶ä»çº¿ç¨ä»ç¶åªææå表ä¸å
åç第ä¸ä¸ªå
ç´ çå¼ç¨ï¼ä»ä»¬çä¸å°æ°æ·»å çå
ç´ ã
æä¹
åçæ°æ®ç»ææ¯å¦ `é¾è¡¨(LinkedList)` å¨ç¡¬ä»¶æ§è½ä¸è¡¨ç°ä¸ä½³ãå表ä¸çæ¯ä¸ªå
ç´ é½æ¯ä¸ä¸ªå¯¹è±¡ï¼è¿äºå¯¹è±¡æ£å¸å¨è®¡ç®æºå
åä¸ãç°ä»£ CPU ç顺åºè®¿é®å¾å¾è¦å¿«çå¤ï¼å æ¤ä½¿ç¨æ°ç»ç顺åºè®¿é®çæ°æ®ç»æåè½å¤è·å¾æ´é«çæ§è½ãCPU é«éç¼åå¯ä»¥å°ä¸ä¸ªå¤§çç©éµåå è½½å°é«éç¼åä¸ï¼å¹¶è®© CPU å¨å è½½åç´æ¥è®¿é® CPU é«éç¼åä¸çæ°æ®ã对äºé¾è¡¨ï¼å°å
ç´ åæ£å¨æ´ä¸ª RAM ä¸ï¼è¿å®é
䏿¯ä¸å¯è½çã
**æ ç¶æç worker**
å
±äº«ç¶æå¯ä»¥ç±å
¶ä»çº¿ç¨æä¿®æ¹ï¼å æ¤ï¼worker å¿
须卿¯æ¬¡æä½å
±äº«ç¶ææ¶éæ°è¯»åï¼ä»¥ç¡®ä¿å¨å¯æ¬ä¸è½å¤æ£ç¡®å·¥ä½ãä¸å¨çº¿ç¨å
é¨ä¿æç¶æç worker æä¸ºæ ç¶æç workerã
**ä½ä¸é¡ºåºæ¯ä¸ç¡®å®ç**
å¹¶è¡å·¥ä½æ¨¡åçå¦ä¸ä¸ªç¼ºç¹æ¯ä½ä¸ç顺åºä¸ç¡®å®ï¼æ æ³ä¿è¯é¦å
æ§è¡ææåæ§è¡åªäºä½ä¸ãä»»å¡ A å¨ä»»å¡ B ä¹ååé
ç» workerï¼ä½æ¯ä»»å¡ B å¯è½å¨ä»»å¡ A ä¹åæ§è¡ã
### æµæ°´çº¿
第äºç§å¹¶å模åå°±æ¯æä»¬ç»å¸¸å¨ç产车é´éå°ç `æµæ°´çº¿å¹¶å模å`ï¼ä¸é¢æ¯æµæ°´çº¿è®¾è®¡æ¨¡åçæµç¨å¾
è¿ç§ç»ç»æ¶æå°±åæ¯å·¥åä¸è£
é
线ä¸ç workerï¼æ¯ä¸ª worker åªå®æå
¨é¨å·¥ä½çä¸é¨åï¼å®æä¸é¨ååï¼worker ä¼å°å·¥ä½è½¬åç»ä¸ä¸ä¸ª workerã
æ¯éç¨åºé½å¨èªå·±ç线ç¨ä¸è¿è¡ï¼å½¼æ¤ä¹é´ä¸ä¼å
±äº«ç¶æï¼è¿ç§æ¨¡åä¹è¢«ç§°ä¸ºæ å
±äº«å¹¶å模åã
ä½¿ç¨æµæ°´çº¿å¹¶å模åé常被设计为`éé»å¡I/O`ï¼ä¹å°±æ¯è¯´ï¼å½æ²¡æç» worker åé
任塿¶ï¼worker ä¼åå
¶ä»å·¥ä½ãéé»å¡I/O æå³çå½ worker å¼å§ I/O æä½ï¼ä¾å¦ä»ç½ç»ä¸è¯»åæä»¶ï¼worker ä¸ä¼çå¾
I/O è°ç¨å®æãå 为 I/O æä½å¾æ
¢ï¼æä»¥çå¾
I/O é常èè´¹æ¶é´ãå¨çå¾
I/O çåæ¶ï¼CPU å¯ä»¥åå
¶ä»äºæ
ï¼I/O æä½å®æåçç»æå°ä¼ éç»ä¸ä¸ä¸ª workerãä¸é¢æ¯éé»å¡ I/O çæµç¨å¾
å¨å®é
æ
åµä¸ï¼ä»»å¡é常ä¸ä¼æç䏿¡è£
é
线æµå¨ï¼ç±äºå¤§å¤æ°ç¨åºéè¦åå¾å¤äºæ
ï¼å æ¤éè¦æ ¹æ®å®æçä¸åå·¥ä½å¨ä¸åç worker ä¹é´æµå¨ï¼å¦ä¸å¾æç¤º
ä»»å¡è¿å¯è½éè¦å¤ä¸ª worker å
±ååä¸å®æ
#### ååºå¼ - äºä»¶é©±å¨ç³»ç»
ä½¿ç¨æµæ°´çº¿æ¨¡åçç³»ç»ææ¶ä¹è¢«ç§°ä¸º `ååºå¼` æè
`äºä»¶é©±å¨ç³»ç»`ï¼è¿ç§æ¨¡å伿 ¹æ®å¤é¨çäºä»¶ä½åºååºï¼äºä»¶å¯è½æ¯æä¸ª HTTP è¯·æ±æè
æä¸ªæä»¶å®æå è½½å°å
åä¸ã
#### Actor 模å
å¨ Actor 模åä¸ï¼æ¯ä¸ä¸ª Actor å
¶å®å°±æ¯ä¸ä¸ª Workerï¼ æ¯ä¸ä¸ª Actor é½è½å¤å¤çä»»å¡ã
ç®åæ¥è¯´ï¼Actor æ¨¡åæ¯ä¸ä¸ªå¹¶å模åï¼å®å®ä¹äºä¸ç³»åç³»ç»ç»ä»¶åºè¯¥å¦ä½å¨ä½å交äºçéç¨è§åï¼æèåç使ç¨è¿å¥è§åçç¼ç¨è¯è¨æ¯ Erlangãä¸ä¸ªåä¸è
`Actor`å¯¹æ¥æ¶å°çæ¶æ¯ååºååºï¼ç¶åå¯ä»¥åå»ºåºæ´å¤ç Actor æåéæ´å¤çæ¶æ¯ï¼åæ¶å夿¥æ¶ä¸ä¸æ¡æ¶æ¯ã
#### Channels 模å
å¨ Channel 模åä¸ï¼worker é常ä¸ä¼ç´æ¥éä¿¡ï¼ä¸æ¤ç¸å¯¹çï¼ä»ä»¬é常å°äºä»¶åéå°ä¸åç `éé(Channel)`ä¸ï¼ç¶åå
¶ä» worker å¯ä»¥å¨è¿äºééä¸è·åæ¶æ¯ï¼ä¸é¢æ¯ Channel çæ¨¡åå¾
æçæ¶å worker ä¸éè¦æç¡®ç¥éæ¥ä¸æ¥ç worker æ¯è°ï¼ä»ä»¬åªéè¦å°ä½è
åå
¥ééä¸ï¼çå¬ Channel ç worker å¯ä»¥è®¢é
æè
åæ¶è®¢é
ï¼è¿ç§æ¹å¼éä½äº worker å worker ä¹é´çè¦åæ§ã
#### æµæ°´çº¿è®¾è®¡çä¼ç¹
ä¸å¹¶è¡è®¾è®¡æ¨¡åç¸æ¯ï¼æµæ°´çº¿æ¨¡åå
·æä¸äºä¼å¿ï¼å
·ä½ä¼å¿å¦ä¸
**ä¸ä¼åå¨å
±äº«ç¶æ**
å ä¸ºæµæ°´çº¿è®¾è®¡è½å¤ä¿è¯ worker å¨å¤ç宿ååä¼ éç»ä¸ä¸ä¸ª workerï¼æä»¥ worker ä¸ worker ä¹é´ä¸éè¦å
±äº«ä»»ä½ç¶æï¼ä¹å°±æ éèèå¹¶åé®é¢ãä½ çè³å¯ä»¥å¨å®ç°ä¸ææ¯ä¸ª worker çææ¯å线ç¨çä¸ç§ã
**æç¶æ worker**
å 为 worker ç¥é没æå
¶ä»çº¿ç¨ä¿®æ¹èªèº«çæ°æ®ï¼æä»¥æµæ°´çº¿è®¾è®¡ä¸ç worker æ¯æç¶æçï¼æç¶æçæææ¯ä»ä»¬å¯ä»¥å°éè¦æä½çæ°æ®ä¿çå¨å
åä¸ï¼æç¶æéå¸¸æ¯æ ç¶ææ´å¿«ã
**æ´å¥½ç硬件æ´å**
å ä¸ºä½ å¯ä»¥ææµæ°´çº¿çææ¯å线ç¨çï¼èå线ç¨çå·¥ä½ä¼å¿å¨äºå®è½å¤å硬件ç工使¹å¼ç¸åãå 为æç¶æç worker éå¸¸å¨ CPU ä¸ç¼åæ°æ®ï¼è¿æ ·å¯ä»¥æ´å¿«å°è®¿é®ç¼åçæ°æ®ã
**ä½¿ä»»å¡æ´å ææçè¿è¡**
å¯ä»¥å¯¹æµæ°´çº¿å¹¶å模åä¸çä»»å¡è¿è¡æåºï¼ä¸è¬ç¨æ¥æ¥å¿çåå
¥åæ¢å¤ã
#### æµæ°´çº¿è®¾è®¡ç缺ç¹
æµæ°´çº¿å¹¶å模åçç¼ºç¹æ¯ä»»å¡ä¼æ¶åå¤ä¸ª workerï¼å æ¤å¯è½ä¼åæ£å¨é¡¹ç®ä»£ç çå¤ä¸ªç±»ä¸ãå æ¤å¾é¾ç¡®å®æ¯ä¸ª worker é½å¨æ§è¡åªä¸ªä»»å¡ãæµæ°´çº¿ç代ç ç¼å乿¯è¾å°é¾ï¼è®¾è®¡è®¸å¤åµå¥åè°å¤çç¨åºç代ç é常被称为 `åè°å°ç±`ãåè°å°ç±å¾é¾è¿½è¸ª debugã
## 彿°æ§å¹¶è¡
彿°æ§å¹¶è¡æ¨¡åæ¯æè¿ææåºçä¸ç§å¹¶å模åï¼å®çåºæ¬æè·¯æ¯ä½¿ç¨å½æ°è°ç¨æ¥å®ç°ãæ¶æ¯çä¼ éå°±ç¸å½äºæ¯å½æ°çè°ç¨ãä¼ éç»å½æ°çåæ°é½ä¼è¢«æ·è´ï¼å æ¤å¨å½æ°ä¹å¤çä»»ä½å®ä½é½æ æ³æçºµå½æ°å
çæ°æ®ãè¿ä½¿å¾å½æ°æ§è¡ç±»ä¼¼äº`åå`æä½ãæ¯ä¸ªå½æ°è°ç¨é½å¯ä»¥ç¬ç«äºä»»ä½å
¶ä»å½æ°è°ç¨æ§è¡ã
彿¯ä¸ªå½æ°è°ç¨ç¬ç«æ§è¡æ¶ï¼æ¯ä¸ªå½æ°é½å¯ä»¥å¨åç¬ç CPU 䏿§è¡ãè¿ä¹å°±æ¯è¯´ï¼å½æ°å¼å¹¶è¡å¹¶è¡ç¸å½äºæ¯å个 CPU åç¬æ§è¡åèªçä»»å¡ã
JDK 1.7 ä¸ç `ForkAndJoinPool` 类就å®ç°äºå½æ°æ§å¹¶è¡çåè½ãJava 8 æåºäº stream çæ¦å¿µï¼ä½¿ç¨å¹¶è¡æµä¹è½å¤å®ç°å¤§ééåçè¿ä»£ã
彿°æ§å¹¶è¡çé¾ç¹æ¯è¦ç¥é彿°çè°ç¨æµç¨ä»¥ååªäº CPU æ§è¡äºåªäºå½æ°ï¼è·¨ CPU 彿°è°ç¨ä¼å¸¦æ¥é¢å¤çå¼éã
æä»¬ä¹å说è¿ï¼çº¿ç¨å°±æ¯è¿ç¨ä¸ç䏿¡`é¡ºåºæµ`ï¼å¨ Java ä¸ï¼æ¯ä¸æ¡ Java 线ç¨å°±åæ¯ JVM ç䏿¡é¡ºåºæµï¼å°±åæ¯èæ CPU 䏿 ·æ¥æ§è¡ä»£ç ãJava ä¸ç `main()` æ¹æ³æ¯ä¸æ¡ç¹æ®ç线ç¨ï¼JVM å建ç main çº¿ç¨æ¯ä¸æ¡`主æ§è¡çº¿ç¨`ï¼å¨ Java ä¸ï¼æ¹æ³é½æ¯ç± main æ¹æ³åèµ·çãå¨ main æ¹æ³ä¸ï¼ä½ ç
§æ ·å¯ä»¥å建å
¶ä»ç`线ç¨`(æ§è¡é¡ºåºæµ)ï¼è¿äºçº¿ç¨å¯ä»¥å main æ¹æ³å
±åæ§è¡åºç¨ä»£ç ã
Java 线ç¨ä¹æ¯ä¸ç§å¯¹è±¡ï¼å®åå
¶ä»å¯¹è±¡ä¸æ ·ãJava ä¸ç Thread 表示线ç¨ï¼Thread æ¯ `java.lang.Thread` ç±»æå
¶åç±»çå®ä¾ãé£ä¹ä¸é¢æä»¬å°±æ¥ä¸èµ·æ¢è®¨ä¸ä¸å¨ Java ä¸å¦ä½å建åå¯å¨çº¿ç¨ã
## å建并å¯å¨çº¿ç¨
å¨ Java ä¸ï¼å建线ç¨çæ¹å¼ä¸»è¦æä¸ç§
* éè¿ç»§æ¿ `Thread` ç±»æ¥å建线ç¨
* éè¿å®ç° `Runnable` æ¥å£æ¥å建线ç¨
* éè¿ `Callable` å `Future` æ¥å建线ç¨
ä¸é¢æä»¬å嫿¢è®¨ä¸ä¸è¿å ç§å建æ¹å¼
### ç»§æ¿ Thread ç±»æ¥å建线ç¨
第ä¸ç§æ¹å¼æ¯ç»§æ¿ Thread ç±»æ¥å建线ç¨ï¼å¦ä¸ç¤ºä¾
```java
public class TJavaThread extends Thread{
static int count;
@Override
public synchronized void run() {
for(int i = 0;i < 10000;i++){
count++;
}
}
public static void main(String[] args) throws InterruptedException {
TJavaThread tJavaThread = new TJavaThread();
tJavaThread.start();
tJavaThread.join();
System.out.println("count = " + count);
}
}
```
线ç¨ç主è¦å建æ¥éª¤å¦ä¸
* å®ä¹ä¸ä¸ªçº¿ç¨ç±»ä½¿å
¶ç»§æ¿ Thread ç±»ï¼å¹¶éåå
¶ä¸ç run æ¹æ³ï¼run æ¹æ³å
é¨å°±æ¯çº¿ç¨è¦å®æçä»»å¡ï¼å æ¤ run æ¹æ³ä¹è¢«ç§°ä¸º `æ§è¡ä½`
* åå»ºäº Thread çåç±»ï¼ä¸é¢ä»£ç ä¸çåç±»æ¯ `TJavaThread`
* å¯å¨æ¹æ³éè¦æ³¨æï¼å¹¶ä¸æ¯ç´æ¥è°ç¨ `run` æ¹æ³æ¥å¯å¨çº¿ç¨ï¼èæ¯ä½¿ç¨ `start ` æ¹æ³æ¥å¯å¨çº¿ç¨ãå½ç¶ run æ¹æ³å¯ä»¥è°ç¨ï¼è¿æ ·çè¯å°±ä¼åææ®éæ¹æ³è°ç¨ï¼è䏿¯æ°å建ä¸ä¸ªçº¿ç¨æ¥è°ç¨äºã
```java
public static void main(String[] args) throws InterruptedException {
TJavaThread tJavaThread = new TJavaThread();
tJavaThread.run();
System.out.println("count = " + count);
}
```
è¿æ ·çè¯ï¼æ´ä¸ª main æ¹æ³åªæä¸æ¡æ§è¡çº¿ç¨ä¹å°±æ¯ main 线ç¨ï¼ç±ä¸¤æ¡æ§è¡çº¿ç¨åä¸ºä¸æ¡æ§è¡çº¿ç¨
Thread æé å¨åªéè¦ä¸ä¸ª Runnable 对象ï¼è°ç¨ Thread 对象ç start() æ¹æ³ä¸ºè¯¥çº¿ç¨æ§è¡å¿
é¡»çåå§åæä½ï¼ç¶åè°ç¨ Runnable ç run æ¹æ³ï¼ä»¥ä¾¿å¨è¿ä¸ªçº¿ç¨ä¸å¯å¨ä»»å¡ãæä»¬ä¸é¢ä½¿ç¨äºçº¿ç¨ç `join` æ¹æ³ï¼å®ç¨æ¥çå¾
线ç¨çæ§è¡ç»æï¼å¦ææä»¬ä¸å join æ¹æ³ï¼å®å°±ä¸ä¼çå¾
tJavaThread çæ§è¡å®æ¯ï¼è¾åºçç»æå¯è½å°±ä¸æ¯ `10000`
å¯ä»¥çå°ï¼å¨ run æ¹æ³è¿æ²¡æç»æåï¼run 就被è¿åäºãä¹å°±æ¯è¯´ï¼ç¨åºä¸ä¼çå° run æ¹æ³æ§è¡å®æ¯å°±ä¼æ§è¡ä¸é¢çæä»¤ã
使ç¨ç»§æ¿æ¹å¼å建线ç¨çä¼å¿ï¼ç¼åæ¯è¾ç®åï¼å¯ä»¥ä½¿ç¨ `this` å
³é®åç´æ¥æåå½å线ç¨ï¼èæ éä½¿ç¨ `Thread.currentThread()` æ¥è·åå½å线ç¨ã
使ç¨ç»§æ¿æ¹å¼å建线ç¨çå£å¿ï¼å¨ Java ä¸ï¼åªå
许åç»§æ¿ï¼æç»è精说使ç¨å
é¨ç±»å¯ä»¥å®ç°å¤ç»§æ¿ï¼çååï¼æä»¥ä½¿ç¨ç»§æ¿çæ¹å¼ï¼å类就ä¸è½åç»§æ¿å
¶ä»ç±»ã
### ä½¿ç¨ Runnable æ¥å£æ¥å建线ç¨
ç¸å¯¹çï¼è¿å¯ä»¥ä½¿ç¨ `Runnable` æ¥å£æ¥å建线ç¨ï¼å¦ä¸ç¤ºä¾
```java
public class TJavaThreadUseImplements implements Runnable{
static int count;
@Override
public synchronized void run() {
for(int i = 0;i < 10000;i++){
count++;
}
}
public static void main(String[] args) throws InterruptedException {
new Thread(new TJavaThreadUseImplements()).start();
System.out.println("count = " + count);
}
}
```
线ç¨ç主è¦å建æ¥éª¤å¦ä¸
* é¦å
å®ä¹ Runnable æ¥å£ï¼å¹¶éå Runnable æ¥å£ç run æ¹æ³ï¼run æ¹æ³çæ¹æ³ä½åæ ·æ¯è¯¥çº¿ç¨ççº¿ç¨æ§è¡ä½ã
* å建线ç¨å®ä¾ï¼å¯ä»¥ä½¿ç¨ä¸é¢ä»£ç è¿ç§ç®åçæ¹å¼å建ï¼ä¹å¯ä»¥éè¿ new åºçº¿ç¨çå®ä¾æ¥å建ï¼å¦ä¸æç¤º
```java
TJavaThreadUseImplements tJavaThreadUseImplements = new TJavaThreadUseImplements();
new Thread(tJavaThreadUseImplements).start();
```
* åè°ç¨çº¿ç¨å¯¹è±¡ç start æ¹æ³æ¥å¯å¨è¯¥çº¿ç¨ã
线ç¨å¨ä½¿ç¨å®ç° `Runnable` çåæ¶ä¹è½å®ç°å
¶ä»æ¥å£ï¼é常éåå¤ä¸ªç¸åçº¿ç¨æ¥å¤çåä¸ä»½èµæºçæ
åµï¼ä½ç°äºé¢åå¯¹è±¡çææ³ã
ä½¿ç¨ Runnable å®ç°çå£å¿æ¯ç¼ç¨ç¨å¾®ç¹çï¼å¦æè¦è®¿é®å½å线ç¨ï¼åå¿
é¡»ä½¿ç¨ `Thread.currentThread()` æ¹æ³ã
### ä½¿ç¨ Callable æ¥å£æ¥å建线ç¨
Runnable æ¥å£æ§è¡çæ¯ç¬ç«çä»»å¡ï¼Runnable æ¥å£ä¸ä¼äº§çä»»ä½è¿åå¼ï¼å¦æä½ 叿å¨ä»»å¡å®æåè½å¤è¿åä¸ä¸ªå¼çè¯ï¼é£ä¹ä½ å¯ä»¥å®ç° `Callable` æ¥å£è䏿¯ Runnable æ¥å£ãJava SE5 å¼å
¥äº Callable æ¥å£ï¼å®ç示ä¾å¦ä¸
```java
public class CallableTask implements Callable {
static int count;
public CallableTask(int count){
this.count = count;
}
@Override
public Object call() {
return count;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask