1import{_ as n,c as l,b as s,d as t,r as e,o as h}from"./app-BX6j4ZW7.js";const p={};function r(k,i){const a=e("ProjectCta");return h(),l("div",null,[i[0]||(i[0]=s('<h1 id="java-å¹¶åç¼ç¨é¢è¯é¢" tabindex="-1"><a class="header-anchor" href="#java-å¹¶åç¼ç¨é¢è¯é¢"><span>Java å¹¶åç¼ç¨é¢è¯é¢</span></a></h1><h2 id="ä¸ãåºç¡ç¥è¯" tabindex="-1"><a class="header-anchor" href="#ä¸ãåºç¡ç¥è¯"><span>ä¸ãåºç¡ç¥è¯</span></a></h2><h3 id="_1-为ä»ä¹è¦ä½¿ç¨å¹¶åç¼ç¨" tabindex="-1"><a class="header-anchor" href="#_1-为ä»ä¹è¦ä½¿ç¨å¹¶åç¼ç¨"><span>1. 为ä»ä¹è¦ä½¿ç¨å¹¶åç¼ç¨</span></a></h3><ul><li>æå夿 ¸CPUçå©ç¨çï¼ä¸è¬æ¥è¯´ä¸å°ä¸»æºä¸ç伿å¤ä¸ªCPUæ ¸å¿ï¼æä»¬å¯ä»¥å建å¤ä¸ªçº¿ç¨ï¼ç论ä¸è®²æä½ç³»ç»å¯ä»¥å°å¤ä¸ªçº¿ç¨åé
ç»ä¸åçCPU廿§è¡ï¼æ¯ä¸ªCPUæ§è¡ä¸ä¸ªçº¿ç¨ï¼è¿æ ·å°±æé«äºCPUçä½¿ç¨æçï¼å¦æä½¿ç¨å线ç¨å°±åªè½æä¸ä¸ªCPUæ ¸å¿è¢«ä½¿ç¨ã</li><li>æ¯å¦å½æä»¬å¨ç½ä¸è´ç©æ¶ï¼ä¸ºäºæåååºé度ï¼éè¦æåï¼ååºåï¼çæè®¢åççè¿äºæä½ï¼å°±å¯ä»¥è¿è¡æåå©ç¨å¤çº¿ç¨çææ¯å®æãé¢å¯¹å¤æä¸å¡æ¨¡åï¼å¹¶è¡ç¨åºä¼æ¯ä¸²è¡ç¨åºæ´éåºä¸å¡éæ±ï¼èå¹¶åç¼ç¨æ´è½å»åè¿ç§ä¸å¡æå ã</li></ul><p>ç®åæ¥è¯´å°±æ¯ï¼</p><ul><li>å
åå©ç¨å¤æ ¸CPUç计ç®è½åï¼</li><li>æ¹ä¾¿è¿è¡ä¸å¡æåï¼æååºç¨æ§è½</li></ul>',6)),t(a,{compact:"",from:"md_8000_javaconcurrency_1"}),i[1]||(i[1]=s(`<h3 id="_2-å¤çº¿ç¨åºç¨åºæ¯" tabindex="-1"><a class="header-anchor" href="#_2-å¤çº¿ç¨åºç¨åºæ¯"><span>2. å¤çº¿ç¨åºç¨åºæ¯</span></a></h3><ul><li>ä¾å¦: è¿
é·å¤çº¿ç¨ä¸è½½ãæ°æ®åºè¿æ¥æ± ãåæ¹åéçä¿¡çã</li></ul><h3 id="_3-å¹¶åç¼ç¨æä»ä¹ç¼ºç¹" tabindex="-1"><a class="header-anchor" href="#_3-å¹¶åç¼ç¨æä»ä¹ç¼ºç¹"><span>3. å¹¶åç¼ç¨æä»ä¹ç¼ºç¹</span></a></h3><ul><li>å¹¶åç¼ç¨çç®çå°±æ¯ä¸ºäºè½æé«ç¨åºçæ§è¡æçï¼æé«ç¨åºè¿è¡é度ï¼ä½æ¯å¹¶åç¼ç¨å¹¶ä¸æ»æ¯è½æé«ç¨åºè¿è¡é度çï¼èä¸å¹¶åç¼ç¨å¯è½ä¼éå°å¾å¤é®é¢ï¼æ¯å¦ï¼å
åæ³æ¼ãä¸ä¸æåæ¢ã线ç¨å®å
¨ãæ»éçé®é¢ã</li></ul><h3 id="_4-å¹¶åç¼ç¨ä¸ä¸ªå¿
è¦å ç´ æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_4-å¹¶åç¼ç¨ä¸ä¸ªå¿
è¦å ç´ æ¯ä»ä¹"><span>4. å¹¶åç¼ç¨ä¸ä¸ªå¿
è¦å ç´ æ¯ä»ä¹ï¼</span></a></h3><ul><li>ååæ§ï¼ååï¼å³ä¸ä¸ªä¸å¯å被åå²çé¢ç²ãååæ§æçæ¯ä¸ä¸ªæå¤ä¸ªæä½è¦ä¹å
¨é¨æ§è¡æåè¦ä¹å
¨é¨æ§è¡å¤±è´¥ã</li><li>å¯è§æ§ï¼ä¸ä¸ªçº¿ç¨å¯¹å
±äº«åéçä¿®æ¹,å¦ä¸ä¸ªçº¿ç¨è½å¤ç«å»çå°ãï¼synchronized,volatileï¼</li><li>æåºæ§ï¼ç¨åºæ§è¡çé¡ºåºæç
§ä»£ç çå
åé¡ºåºæ§è¡ãï¼å¤çå¨å¯è½ä¼å¯¹æä»¤è¿è¡éæåºï¼</li></ul><h3 id="_5-java-ç¨åºä¸æä¹ä¿è¯å¤çº¿ç¨çè¿è¡å®å
¨" tabindex="-1"><a class="header-anchor" href="#_5-java-ç¨åºä¸æä¹ä¿è¯å¤çº¿ç¨çè¿è¡å®å
¨"><span>5. Java ç¨åºä¸æä¹ä¿è¯å¤çº¿ç¨çè¿è¡å®å
¨ï¼</span></a></h3><ul><li><p>åºç°çº¿ç¨å®å
¨é®é¢çåå ä¸è¬é½æ¯ä¸ä¸ªåå ï¼</p></li><li><p>线ç¨åæ¢å¸¦æ¥çååæ§é®é¢ è§£å³åæ³ï¼ä½¿ç¨å¤çº¿ç¨ä¹é´åæ¥synchronizedæä½¿ç¨é(lock)ã</p></li><li><p>ç¼å导è´çå¯è§æ§é®é¢ è§£å³åæ³ï¼synchronizedãvolatileãLOCKï¼å¯ä»¥è§£å³å¯è§æ§é®é¢</p></li><li><p>ç¼è¯ä¼å带æ¥çæåºæ§é®é¢ è§£å³åæ³ï¼Happens-Before è§åå¯ä»¥è§£å³æåºæ§é®é¢</p></li></ul><h3 id="_6-å¹¶è¡åå¹¶åæä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_6-å¹¶è¡åå¹¶åæä»ä¹åºå«"><span>6. å¹¶è¡åå¹¶åæä»ä¹åºå«ï¼</span></a></h3><ul><li>å¹¶åï¼å¤ä¸ªä»»å¡å¨åä¸ä¸ª CPU æ ¸ä¸ï¼æç»åçæ¶é´çè½®æµ(交æ¿)æ§è¡ï¼ä»é»è¾ä¸æ¥çé£äºä»»å¡æ¯åæ¶æ§è¡ã</li><li>å¹¶è¡ï¼å使¶é´å
ï¼å¤ä¸ªå¤ç卿夿 ¸å¤çå¨åæ¶å¤çå¤ä¸ªä»»å¡ï¼æ¯çæ£æä¹ä¸çâåæ¶è¿è¡âã</li><li>串è¡ï¼æn个任å¡ï¼ç±ä¸ä¸ªçº¿ç¨æé¡ºåºæ§è¡ãç±äºä»»å¡ãæ¹æ³é½å¨ä¸ä¸ªçº¿ç¨æ§è¡æä»¥ä¸åå¨çº¿ç¨ä¸å®å
¨æ
åµï¼ä¹å°±ä¸åå¨ä¸´çåºçé®é¢ã</li></ul><p><strong>åä¸ä¸ªå½¢è±¡çæ¯å»ï¼</strong></p><ul><li>å¹¶å = 俩个人ç¨ä¸å°çµèã</li><li>å¹¶è¡ = 俩个人åé
äºä¿©å°çµèã</li><li>ä¸²è¡ = 俩个人æé使ç¨ä¸å°çµèã</li></ul><h3 id="_7-ä»ä¹æ¯å¤çº¿ç¨" tabindex="-1"><a class="header-anchor" href="#_7-ä»ä¹æ¯å¤çº¿ç¨"><span>7. ä»ä¹æ¯å¤çº¿ç¨</span></a></h3><ul><li>å¤çº¿ç¨ï¼å¤çº¿ç¨æ¯æç¨åºä¸å
å«å¤ä¸ªæ§è¡æµï¼å³å¨ä¸ä¸ªç¨åºä¸å¯ä»¥åæ¶è¿è¡å¤ä¸ªä¸åççº¿ç¨æ¥æ§è¡ä¸åçä»»å¡ã</li></ul><h3 id="_8-å¤çº¿ç¨ç好å¤" tabindex="-1"><a class="header-anchor" href="#_8-å¤çº¿ç¨ç好å¤"><span>8. å¤çº¿ç¨ç好å¤</span></a></h3><ul><li>å¯ä»¥æé« CPU çå©ç¨çãå¨å¤çº¿ç¨ç¨åºä¸ï¼ä¸ä¸ªçº¿ç¨å¿
é¡»çå¾
çæ¶åï¼CPU å¯ä»¥è¿è¡å
¶å®ç线ç¨è䏿¯çå¾
ï¼è¿æ ·å°±å¤§å¤§æé«äºç¨åºçæçãä¹å°±æ¯è¯´å
许å个ç¨åºå建å¤ä¸ªå¹¶è¡æ§è¡ççº¿ç¨æ¥å®æåèªçä»»å¡ã</li></ul><h3 id="_9-å¤çº¿ç¨çå£å¿" tabindex="-1"><a class="header-anchor" href="#_9-å¤çº¿ç¨çå£å¿"><span>9. å¤çº¿ç¨çå£å¿ï¼</span></a></h3><ul><li>线ç¨ä¹æ¯ç¨åºï¼æä»¥çº¿ç¨éè¦å ç¨å
åï¼çº¿ç¨è¶å¤å ç¨å
åä¹
1è¶å¤ï¼</li><li>å¤çº¿ç¨éè¦åè°å管çï¼æä»¥éè¦ CPU æ¶é´è·è¸ªçº¿ç¨ï¼</li><li>线ç¨ä¹é´å¯¹å
±äº«èµæºç访é®ä¼ç¸äºå½±åï¼å¿
须解å³ç«ç¨å
±äº«èµæºçé®é¢ã</li></ul><h3 id="_10-线ç¨åè¿ç¨åºå«" tabindex="-1"><a class="header-anchor" href="#_10-线ç¨åè¿ç¨åºå«"><span>10. 线ç¨åè¿ç¨åºå«</span></a></h3><ul><li>ä»ä¹æ¯çº¿ç¨åè¿ç¨?</li><li>è¿ç¨ä¸ä¸ªå¨å
åä¸è¿è¡çåºç¨ç¨åºã æ¯ä¸ªæ£å¨ç³»ç»ä¸è¿è¡çç¨åºé½æ¯ä¸ä¸ªè¿ç¨</li><li>线ç¨è¿ç¨ä¸çä¸ä¸ªæ§è¡ä»»å¡ï¼æ§å¶åå
ï¼ï¼ å®è´è´£å¨ç¨åºéç¬ç«æ§è¡ã</li></ul><p>ä¸ä¸ªè¿ç¨è³å°æä¸ä¸ªçº¿ç¨ï¼ä¸ä¸ªè¿ç¨å¯ä»¥è¿è¡å¤ä¸ªçº¿ç¨ï¼å¤ä¸ªçº¿ç¨å¯å
±äº«æ°æ®ã</p><p><strong>è¿ç¨ä¸çº¿ç¨çåºå«</strong></p><ul><li>æ ¹æ¬åºå«ï¼è¿ç¨æ¯æä½ç³»ç»èµæºåé
çåºæ¬åä½ï¼èçº¿ç¨æ¯å¤çå¨ä»»å¡è°åº¦åæ§è¡çåºæ¬åä½</li><li>èµæºå¼éï¼æ¯ä¸ªè¿ç¨é½æç¬ç«ç代ç åæ°æ®ç©ºé´ï¼ç¨åºä¸ä¸æï¼ï¼ç¨åºä¹é´ç忢伿è¾å¤§çå¼éï¼çº¿ç¨å¯ä»¥çåè½»é级çè¿ç¨ï¼åä¸ç±»çº¿ç¨å
±äº«ä»£ç åæ°æ®ç©ºé´ï¼æ¯ä¸ªçº¿ç¨é½æèªå·±ç¬ç«çè¿è¡æ åç¨åºè®¡æ°å¨ï¼PCï¼ï¼çº¿ç¨ä¹é´åæ¢çå¼éå°ã</li><li>å
å«å
³ç³»ï¼å¦æä¸ä¸ªè¿ç¨å
æå¤ä¸ªçº¿ç¨ï¼åæ§è¡è¿ç¨ä¸æ¯ä¸æ¡çº¿çï¼èæ¯å¤æ¡çº¿ï¼çº¿ç¨ï¼å
±å宿çï¼çº¿ç¨æ¯è¿ç¨çä¸é¨åï¼æä»¥çº¿ç¨ä¹è¢«ç§°ä¸ºè½»æè¿ç¨æè
è½»é级è¿ç¨ã</li><li>å
ååé
ï¼åä¸è¿ç¨ç线ç¨å
±äº«æ¬è¿ç¨çå°å空é´åèµæºï¼èè¿ç¨ä¸è¿ç¨ä¹é´çå°å空é´åèµæºæ¯ç¸äºç¬ç«ç</li><li>å½±åå
³ç³»ï¼ä¸ä¸ªè¿ç¨å´©æºåï¼å¨ä¿æ¤æ¨¡å¼ä¸ä¸ä¼å¯¹å
¶ä»è¿ç¨äº§çå½±åï¼ä½æ¯ä¸ä¸ªçº¿ç¨å´©æºæå¯è½å¯¼è´æ´ä¸ªè¿ç¨é½æ»æãæä»¥å¤è¿ç¨è¦æ¯å¤çº¿ç¨å¥å£®ã</li><li>æ§è¡è¿ç¨ï¼æ¯ä¸ªç¬ç«çè¿ç¨æç¨åºè¿è¡çå
¥å£ãé¡ºåºæ§è¡åºååç¨åºåºå£ã使¯çº¿ç¨ä¸è½ç¬ç«æ§è¡ï¼å¿
é¡»ä¾åå¨åºç¨ç¨åºä¸ï¼ç±åºç¨ç¨åºæä¾å¤ä¸ªçº¿ç¨æ§è¡æ§å¶ï¼ä¸¤è
åå¯å¹¶åæ§è¡</li></ul><h3 id="_11-ä»ä¹æ¯ä¸ä¸æåæ¢" tabindex="-1"><a class="header-anchor" href="#_11-ä»ä¹æ¯ä¸ä¸æåæ¢"><span>11. ä»ä¹æ¯ä¸ä¸æåæ¢?</span></a></h3><ul><li>å¤çº¿ç¨ç¼ç¨ä¸ä¸è¬çº¿ç¨ç个æ°é½å¤§äº CPU æ ¸å¿ç个æ°ï¼èä¸ä¸ª CPU æ ¸å¿å¨ä»»ææ¶å»åªè½è¢«ä¸ä¸ªçº¿ç¨ä½¿ç¨ï¼ä¸ºäºè®©è¿äºçº¿ç¨é½è½å¾å°æææ§è¡ï¼CPU éåççç¥æ¯ä¸ºæ¯ä¸ªçº¿ç¨åé
æ¶é´ç并轮转çå½¢å¼ãå½ä¸ä¸ªçº¿ç¨çæ¶é´çç¨å®çæ¶åå°±ä¼éæ°å¤äºå°±ç»ªç¶æè®©ç»å
¶ä»çº¿ç¨ä½¿ç¨ï¼è¿ä¸ªè¿ç¨å°±å±äºä¸æ¬¡ä¸ä¸æåæ¢ã</li><li>æ¦æ¬æ¥è¯´å°±æ¯ï¼å½åä»»å¡å¨æ§è¡å® CPU æ¶é´ç忢å°å¦ä¸ä¸ªä»»å¡ä¹åä¼å
ä¿åèªå·±çç¶æï¼ä»¥ä¾¿ä¸æ¬¡å忢åè¿ä¸ªä»»å¡æ¶ï¼å¯ä»¥åå è½½è¿ä¸ªä»»å¡çç¶æãä»»å¡ä»ä¿åå°åå è½½çè¿ç¨å°±æ¯ä¸æ¬¡ä¸ä¸æåæ¢ã</li><li>ä¸ä¸æåæ¢é常æ¯è®¡ç®å¯éåçãä¹å°±æ¯è¯´ï¼å®éè¦ç¸å½å¯è§çå¤ç卿¶é´ï¼å¨æ¯ç§å åä¸ç¾æ¬¡ç忢ä¸ï¼æ¯æ¬¡åæ¢é½éè¦çº³ç§éçº§çæ¶é´ãæä»¥ï¼ä¸ä¸æåæ¢å¯¹ç³»ç»æ¥è¯´æå³çæ¶è大éç CPUæ¶é´ï¼äºå®ä¸ï¼å¯è½æ¯æä½ç³»ç»ä¸æ¶é´æ¶èæå¤§çæä½ã</li><li>Linux ç¸æ¯ä¸å
¶ä»æä½ç³»ç»ï¼å
æ¬å
¶ä»ç±» Unix ç³»ç»ï¼æå¾å¤çä¼ç¹ï¼å
¶ä¸æä¸é¡¹å°±æ¯ï¼å
¶ä¸ä¸æåæ¢å模å¼åæ¢çæ¶é´æ¶èé常å°ã</li></ul><h3 id="_12-宿¤çº¿ç¨åç¨æ·çº¿ç¨æä»ä¹åºå«å¢" tabindex="-1"><a class="header-anchor" href="#_12-宿¤çº¿ç¨åç¨æ·çº¿ç¨æä»ä¹åºå«å¢"><span>12. 宿¤çº¿ç¨åç¨æ·çº¿ç¨æä»ä¹åºå«å¢ï¼</span></a></h3><ul><li>ç¨æ· (User) 线ç¨ï¼è¿è¡å¨åå°ï¼æ§è¡å
·ä½çä»»å¡ï¼å¦ç¨åºç主线ç¨ãè¿æ¥ç½ç»çå线ç¨ç齿¯ç¨æ·çº¿ç¨</li><li>宿¤ (Daemon) 线ç¨ï¼è¿è¡å¨åå°ï¼ä¸ºå
¶ä»åå°çº¿ç¨æå¡ãä¹å¯ä»¥è¯´å®æ¤çº¿ç¨æ¯ JVM ä¸é宿¤çº¿ç¨ç â佣人âã䏿¦ææç¨æ·çº¿ç¨é½ç»æè¿è¡ï¼å®æ¤çº¿ç¨ä¼é JVM ä¸èµ·ç»æå·¥ä½</li></ul><h3 id="_13-å¦ä½å¨-windows-å-linux-䏿¥æ¾åªä¸ªçº¿ç¨cpuå©ç¨çæé«" tabindex="-1"><a class="header-anchor" href="#_13-å¦ä½å¨-windows-å-linux-䏿¥æ¾åªä¸ªçº¿ç¨cpuå©ç¨çæé«"><span>13. å¦ä½å¨ Windows å Linux 䏿¥æ¾åªä¸ªçº¿ç¨cpuå©ç¨çæé«ï¼</span></a></h3><ul><li>windowsä¸é¢ç¨ä»»å¡ç®¡çå¨çï¼linuxä¸å¯ä»¥ç¨ top è¿ä¸ªå·¥å
·çã</li><li>æ¾åºcpuèç¨å害çè¿ç¨pidï¼ ç»ç«¯æ§è¡topå½ä»¤ï¼ç¶åæä¸shift+p (shift+mæ¯æ¾åºæ¶èå
åæé«)æ¥æ¾åºcpuå©ç¨æå害çpidå·</li><li>æ ¹æ®ä¸é¢ç¬¬ä¸æ¥æ¿å°çpidå·ï¼top -H -p pid ãç¶åæä¸shift+pï¼æ¥æ¾åºcpuå©ç¨çæå害ç线ç¨å·ï¼æ¯å¦top -H -p 1328å°è·åå°ç线ç¨å·è½¬æ¢æ16è¿å¶ï¼å»ç¾åº¦è½¬æ¢ä¸ä¸å°±è¡</li><li>使ç¨jstackå·¥å
·å°è¿ç¨ä¿¡æ¯æå°è¾åºï¼jstack pidå· > /tmp/t.datï¼æ¯å¦jstack 31365 >/tmp/t.dat</li><li>ç¼è¾/tmp/t.datæä»¶ï¼æ¥æ¾çº¿ç¨å·å¯¹åºçä¿¡æ¯æè
ç´æ¥ä½¿ç¨JDKèªå¸¦çå·¥å
·æ¥çâjconsoleâ ãâvisualVmâï¼è¿é½æ¯JDKèªå¸¦çï¼å¯ä»¥ç´æ¥å¨JDKçbinç®å½ä¸æ¾å°ç´æ¥ä½¿ç¨</li></ul><h3 id="_14-ä»ä¹æ¯çº¿ç¨æ»é" tabindex="-1"><a class="header-anchor" href="#_14-ä»ä¹æ¯çº¿ç¨æ»é"><span>14. ä»ä¹æ¯çº¿ç¨æ»é</span></a></h3><ul><li>æ»éæ¯æä¸¤ä¸ªæä¸¤ä¸ªä»¥ä¸çè¿ç¨ï¼çº¿ç¨ï¼å¨æ§è¡è¿ç¨ä¸ï¼ç±äºç«äºèµæºæè
ç±äºå½¼æ¤éä¿¡èé æçä¸ç§é»å¡çç°è±¡ï¼è¥æ å¤åä½ç¨ï¼å®ä»¬é½å°æ æ³æ¨è¿ä¸å»ãæ¤æ¶ç§°ç³»ç»å¤äºæ»éç¶ææç³»ç»äº§çäºæ»éï¼è¿äºæ°¸è¿å¨äºç¸çå¾
çè¿ç¨ï¼çº¿ç¨ï¼ç§°ä¸ºæ»éè¿ç¨ï¼çº¿ç¨ï¼ã</li><li>å¤ä¸ªçº¿ç¨åæ¶è¢«é»å¡ï¼å®ä»¬ä¸çä¸ä¸ªæè
å
¨é¨é½å¨çå¾
æä¸ªèµæºè¢«éæ¾ãç±äºçº¿ç¨è¢«æ éæå°é»å¡ï¼å æ¤ç¨åºä¸å¯è½æ£å¸¸ç»æ¢ã</li><li>å¦ä¸å¾æç¤ºï¼çº¿ç¨ A ææèµæº 2ï¼çº¿ç¨ B ææèµæº 1ï¼ä»ä»¬åæ¶é½æ³ç³è¯·å¯¹æ¹çèµæºï¼æä»¥è¿ä¸¤ä¸ªçº¿ç¨å°±ä¼äºç¸çå¾
èè¿å
¥æ»éç¶æã</li></ul><h3 id="_15-å½¢ææ»éçå个å¿
è¦æ¡ä»¶æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_15-å½¢ææ»éçå个å¿
è¦æ¡ä»¶æ¯ä»ä¹"><span>15. å½¢ææ»éçå个å¿
è¦æ¡ä»¶æ¯ä»ä¹</span></a></h3><ul><li>äºæ¥æ¡ä»¶ï¼å¨ä¸æ®µæ¶é´å
æèµæºåªç±ä¸ä¸ªè¿ç¨å ç¨ãå¦ææ¤æ¶è¿æå
¶å®è¿ç¨è¯·æ±èµæºï¼å°±åªè½çå¾
ï¼ç´è³å æèµæºçè¿ç¨ç¨æ¯éæ¾ã</li><li>å æä¸çå¾
æ¡ä»¶ï¼æè¿ç¨å·²ç»ä¿æè³å°ä¸ä¸ªèµæºï¼ä½åæåºäºæ°çèµæºè¯·æ±ï¼èè¯¥èµæºå·²è¢«å
¶å®è¿ç¨å æï¼æ¤æ¶è¯·æ±è¿ç¨é»å¡ï¼ä½å对èªå·±å·²è·å¾çå
¶å®èµæºä¿æä¸æ¾ã</li><li>
1ä¸å¯æ¢å æ¡ä»¶ï¼å«äººå·²ç»å æäºæé¡¹èµæºï¼ä½ ä¸è½å 为èªå·±ä¹éè¦è¯¥èµæºï¼å°±å»æå«äººçèµæºæ¢è¿æ¥ã</li><li>循ç¯çå¾ æ¡ä»¶ï¼è¥å¹²è¿ç¨ä¹é´å½¢æä¸ç§å¤´å°¾ç¸æ¥ç循ç¯çå¾ èµæºå ³ç³»ãï¼æ¯å¦ä¸ä¸ªè¿ç¨éåï¼Aå¨çBï¼Bå¨çCï¼Cå¨çAï¼</li></ul><h3 id="_16-å¦ä½é¿å çº¿ç¨æ»é" tabindex="-1"><a class="header-anchor" href="#_16-å¦ä½é¿å çº¿ç¨æ»é"><span>16. å¦ä½é¿å çº¿ç¨æ»é</span></a></h3><p><strong>1ã</strong> é¿å ä¸ä¸ªçº¿ç¨åæ¶è·å¾å¤ä¸ªéï¼</p><p><strong>2ã</strong> é¿å ä¸ä¸ªçº¿ç¨å¨éå åæ¶å ç¨å¤ä¸ªèµæºï¼å°½éä¿è¯æ¯ä¸ªéåªå ç¨ä¸ä¸ªèµæºï¼</p><p><strong>3ã</strong> å°è¯ä½¿ç¨å®æ¶éï¼ä½¿ç¨lock.tryLock(timeout)æ¥æ¿ä»£ä½¿ç¨å é¨éæºå¶ï¼</p><h3 id="_17-å建线ç¨çåç§æ¹å¼" tabindex="-1"><a class="header-anchor" href="#_17-å建线ç¨çåç§æ¹å¼"><span>17. å建线ç¨çåç§æ¹å¼</span></a></h3><ul><li>ç»§æ¿ Thread ç±»ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> MyThread</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> extends</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 2<span class="line"></span> 3<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Override</span></span> 4<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 5<span class="line"></span> 6<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">currentThread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> " run()æ¹æ³æ£å¨æ§è¡..."</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 7<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul><li>å®ç° Runnable æ¥å£ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> MyRunnable</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> implements</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Runnable</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 8<span class="line"></span> 9<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">
9Override</span></span> 10<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 11<span class="line"></span> 12<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">currentThread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> " run()æ¹æ³æ§è¡ä¸..."</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 13<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul><li>å®ç° Callable æ¥å£ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> MyCallable</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> implements</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Callable</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF;"><</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Integer</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF;">></span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 14<span class="line"></span> 15<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Override</span></span> 16<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Integer</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> call</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 17<span class="line"></span> 18<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">currentThread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> " call()æ¹æ³æ§è¡ä¸..."</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 19<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 20<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 21<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul><li>使ç¨å¿åå é¨ç±»æ¹å¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">
21 CreateRunnable</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 22<span class="line"></span> 23<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> static</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">[] </span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">args</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 24<span class="line"></span> 25<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //å建å¤çº¿ç¨å建å¼å§</span></span> 26<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Thread</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> thread</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> Runnable</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() {</span></span> 27<span class="line"></span> 28<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 29<span class="line"></span> 30<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"><</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i++) {</span></span> 31<span class="line"></span> 32<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"i:"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> i);</span></span> 33<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 34<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 35<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> });</span></span> 36<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">start</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span></span> 37<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 38<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_18-说ä¸ä¸-runnable-å-callable-æä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_18-说ä¸ä¸-runnable-å-callable-æä»ä¹åºå«"><span>18. 说ä¸ä¸ runnable å callable æä»ä¹åºå«</span></a></h3><p><strong>ç¸åç¹ï¼</strong></p><ul><li>齿¯æ¥å£</li><li>é½å¯ä»¥ç¼åå¤çº¿ç¨ç¨åº</li><li>é½éç¨Thread.start()å¯å¨çº¿ç¨<strong>主è¦åºå«ï¼</strong></li><li>Runnable æ¥å£ run æ¹æ³æ è¿åå¼ï¼Callable æ¥å£ call æ¹æ³æè¿åå¼ï¼æ¯ä¸ªæ³åï¼åFutureãFutureTaské åå¯ä»¥ç¨æ¥è·å弿¥æ§è¡çç»æ</li><li>Runnable æ¥å£ run æ¹æ³åªè½æåºè¿è¡æ¶å¼å¸¸ï¼ä¸æ æ³æè·å¤çï¼Callable æ¥å£ call æ¹æ³å 许æåºå¼å¸¸ï¼å¯ä»¥è·åå¼å¸¸ä¿¡æ¯ 注ï¼Callalbeæ¥å£æ¯æè¿åæ§è¡ç»æï¼éè¦è°ç¨FutureTask.get()å¾å°ï¼æ¤æ¹æ³ä¼é»å¡ä¸»è¿ç¨çç»§ç»å¾ä¸æ§è¡ï¼å¦æä¸è°ç¨ä¸ä¼é»å¡ã</li></ul><h3 id="_19-线ç¨ç-run-å-start-æä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_19-线ç¨ç-run-å-start-æä»ä¹åºå«"><span>19. 线ç¨ç run()å start()æä»ä¹åºå«ï¼</span></a></h3><ul><li>
38æ¯ä¸ªçº¿ç¨é½æ¯éè¿æä¸ªç¹å®Thread对象æå¯¹åºçæ¹æ³run()æ¥å®æå
¶æä½çï¼run()æ¹æ³ç§°ä¸ºçº¿ç¨ä½ãéè¿è°ç¨Threadç±»çstart()æ¹æ³æ¥å¯å¨ä¸ä¸ªçº¿ç¨ã</li><li>start() æ¹æ³ç¨äºå¯å¨çº¿ç¨ï¼run() æ¹æ³ç¨äºæ§è¡çº¿ç¨çè¿è¡æ¶ä»£ç ãrun() å¯ä»¥éå¤è°ç¨ï¼è start()åªè½è°ç¨ä¸æ¬¡ã</li><li>start()æ¹æ³æ¥å¯å¨ä¸ä¸ªçº¿ç¨ï¼çæ£å®ç°äºå¤çº¿ç¨è¿è¡ãè°ç¨start()æ¹æ³æ éçå¾
runæ¹æ³ä½ä»£ç æ§è¡å®æ¯ï¼å¯ä»¥ç´æ¥ç»§ç»æ§è¡å
¶ä»ç代ç ï¼ æ¤æ¶çº¿ç¨æ¯å¤äºå°±ç»ªç¶æï¼å¹¶æ²¡æè¿è¡ã ç¶åéè¿æ¤Threadç±»è°ç¨æ¹æ³run()æ¥å®æå
¶è¿è¡ç¶æï¼ run()æ¹æ³è¿è¡ç»æï¼ æ¤çº¿ç¨ç»æ¢ãç¶åCPUåè°åº¦å
¶å®çº¿ç¨ã</li><li>run()æ¹æ³æ¯å¨æ¬çº¿ç¨éçï¼åªæ¯çº¿ç¨éçä¸ä¸ªå½æ°ï¼è䏿¯å¤çº¿ç¨çã å¦æç´æ¥è°ç¨run()ï¼å
¶å®å°±ç¸å½äºæ¯è°ç¨äºä¸ä¸ªæ®é彿°èå·²ï¼ç´æ¥å¾
ç¨run()æ¹æ³å¿
é¡»çå¾
run()æ¹æ³æ§è¡å®æ¯æè½æ§è¡ä¸é¢ç代ç ï¼æä»¥æ§è¡è·¯å¾è¿æ¯åªæä¸æ¡ï¼æ ¹æ¬å°±æ²¡æçº¿ç¨çç¹å¾ï¼æä»¥å¨å¤çº¿ç¨æ§è¡æ¶è¦ä½¿ç¨start()æ¹æ³è䏿¯run()æ¹æ³ã</li></ul><h3 id="_20-为ä»ä¹æä»¬è°ç¨-start-æ¹æ³æ¶ä¼æ§è¡-run-æ¹æ³-为ä»ä¹æä»¬ä¸è½ç´æ¥è°ç¨run-æ¹æ³" tabindex="-1"><a class="header-anchor" href="#_20-为ä»ä¹æä»¬è°ç¨-start-æ¹æ³æ¶ä¼æ§è¡-run-æ¹æ³-为ä»ä¹æä»¬ä¸è½ç´æ¥è°ç¨run-æ¹æ³"><span>20. 为ä»ä¹æä»¬è°ç¨ start() æ¹æ³æ¶ä¼æ§è¡ run() æ¹æ³ï¼ä¸ºä»ä¹æä»¬ä¸è½ç´æ¥è°ç¨run() æ¹æ³ï¼</span></a></h3><p>è¿æ¯å¦ä¸ä¸ªé常ç»å
¸ç java å¤çº¿ç¨é¢è¯é®é¢ï¼èä¸å¨é¢è¯ä¸ä¼ç»å¸¸è¢«é®å°ãå¾ç®åï¼ä½æ¯å¾å¤äººé½ä¼çä¸ä¸æ¥ï¼</p><ul><li>new ä¸ä¸ª Threadï¼çº¿ç¨è¿å
¥äºæ°å»ºç¶æãè°ç¨ start() æ¹æ³ï¼ä¼å¯å¨ä¸ä¸ªçº¿ç¨å¹¶ä½¿çº¿ç¨è¿å
¥äºå°±ç»ªç¶æï¼å½åé
å° æ¶é´ç åå°±å¯ä»¥å¼å§è¿è¡äºã start() 伿§è¡çº¿ç¨çç¸åºåå¤å·¥ä½ï¼ç¶åèªå¨æ§è¡run() æ¹æ³çå
容ï¼è¿æ¯çæ£çå¤çº¿ç¨å·¥ä½ã</li><li>èç´æ¥æ§è¡ run() æ¹æ³ï¼ä¼æ run æ¹æ³å½æä¸ä¸ª main 线ç¨ä¸çæ®éæ¹æ³å»æ§è¡ï¼å¹¶ä¸ä¼å¨æä¸ªçº¿ç¨ä¸æ§è¡å®ï¼æä»¥è¿å¹¶ä¸æ¯å¤çº¿ç¨å·¥ä½ã</li></ul><p>æ»ç»ï¼è°ç¨ start æ¹æ³æ¹å¯å¯å¨çº¿ç¨å¹¶ä½¿çº¿ç¨è¿å
¥å°±ç»ªç¶æï¼è run æ¹æ³åªæ¯ thread çä¸ä¸ªæ®éæ¹æ³è°ç¨ï¼è¿æ¯å¨ä¸»çº¿ç¨éæ§è¡ã</p><h3 id="_21-ä»ä¹æ¯-callable-å-future" tabindex="-1"><a class="header-anchor" href="#_21-ä»ä¹æ¯-callable-å-future"><span>21. ä»ä¹æ¯ Callable å Future?</span></a></h3><ul><li>Callable æ¥å£ç±»ä¼¼äº Runnableï¼ä»ååå°±å¯ä»¥çåºæ¥äºï¼ä½æ¯ Runnable ä¸ä¼è¿åç»æï¼å¹¶ä¸æ æ³æåºè¿åç»æçå¼å¸¸ï¼è Callable åè½æ´å¼ºå¤§ä¸äºï¼è¢«çº¿ç¨æ§è¡åï¼å¯ä»¥è¿åå¼ï¼è¿ä¸ªè¿åå¼å¯ä»¥è¢« Future æ¿å°ï¼ä¹å°±æ¯è¯´ï¼Future å¯ä»¥æ¿å°å¼æ¥æ§è¡ä»»å¡çè¿åå¼ã</li><li>Future æ¥å£è¡¨ç¤ºå¼æ¥ä»»å¡ï¼æ¯ä¸ä¸ªå¯è½è¿æ²¡æå®æç弿¥ä»»å¡çç»æãæä»¥è¯´ Callableç¨äºäº§çç»æï¼Future ç¨äºè·åç»æã</li></ul><h3 id="_22-ä»ä¹æ¯-futuretask" tabindex="-1"><a class="header-anchor" href="#_22-ä»ä¹æ¯-futuretask"><span>22. ä»ä¹æ¯ FutureTask</span></a></h3><ul><li>FutureTask 表示ä¸ä¸ªå¼æ¥è¿ç®çä»»å¡ãFutureTask éé¢å¯ä»¥ä¼ å
¥ä¸ä¸ª Callable çå
·ä½å®ç°ç±»ï¼å¯ä»¥å¯¹è¿ä¸ªå¼æ¥è¿ç®çä»»å¡çç»æè¿è¡çå¾
è·åã夿æ¯å¦å·²ç»å®æãåæ¶ä»»å¡çæä½ãåªæå½è¿ç®å®æçæ¶åç»ææè½ååï¼å¦æè¿ç®å°æªå®æ get æ¹æ³å°ä¼é»å¡ãä¸ä¸ª FutureTask 对象å¯ä»¥å¯¹è°ç¨äº Callable å Runnable ç对象è¿è¡å
è£
ï¼ç±äº FutureTask 乿¯Runnable æ¥å£çå®ç°ç±»ï¼æä»¥ FutureTask ä¹å¯ä»¥æ¾å
¥çº¿ç¨æ± ä¸ã</li></ul><h3 id="_23-线ç¨çç¶æ" tabindex="-1"><a class="header-anchor" href="#_23-线ç¨çç¶æ"><span>23. 线ç¨çç¶æ</span></a></h3><p>![ ][nbsp 1]</p><ul><li><p>æ°å»º(new)ï¼æ°å建äºä¸ä¸ªçº¿ç¨å¯¹è±¡ã</p></li><li><p>就绪ï¼å¯è¿è¡ç¶æï¼(runnable)ï¼çº¿ç¨å¯¹è±¡å建åï¼å½è°ç¨çº¿ç¨å¯¹è±¡ç start()æ¹æ³ï¼è¯¥çº¿ç¨å¤äºå°±ç
38»ªç¶æï¼çå¾ è¢«çº¿ç¨è°åº¦éä¸ï¼è·åcpuçä½¿ç¨æã</p></li><li><p>è¿è¡(running)ï¼å¯è¿è¡ç¶æ(runnable)ç线ç¨è·å¾äºcpuæ¶é´çï¼timesliceï¼ï¼æ§è¡ç¨åºä»£ç ãæ³¨ï¼å°±ç»ªç¶ææ¯è¿å ¥å°è¿è¡ç¶æçå¯ä¸å ¥å£ï¼ä¹å°±æ¯è¯´ï¼çº¿ç¨è¦æ³è¿å ¥è¿è¡ç¶ææ§è¡ï¼é¦å å¿ é¡»å¤äºå°±ç»ªç¶æä¸ï¼</p></li><li><p>é»å¡(block)ï¼å¤äºè¿è¡ç¶æä¸ç线ç¨ç±äºæç§åå ï¼ææ¶æ¾å¼å¯¹ CPUçä½¿ç¨æï¼åæ¢æ§è¡ï¼æ¤æ¶è¿å ¥é»å¡ç¶æï¼ç´å°å ¶è¿å ¥å°å°±ç»ªç¶æï¼æ ææºä¼å次被 CPU è°ç¨ä»¥è¿å ¥å°è¿è¡ç¶æã</p></li><li><p>é»å¡çæ åµåä¸ç§ï¼</p></li><li><p>(ä¸). çå¾ é»å¡ï¼è¿è¡ç¶æä¸ççº¿ç¨æ§è¡ wait()æ¹æ³ï¼JVMä¼æè¯¥çº¿ç¨æ¾å ¥çå¾ éå(waittingqueue)ä¸ï¼ä½¿æ¬çº¿ç¨è¿å ¥å°çå¾ é»å¡ç¶æï¼</p></li><li><p>(äº). 忥é»å¡ï¼çº¿ç¨å¨è·å synchronized 忥é失败(å 为éè¢«å ¶å®çº¿ç¨æå ç¨)ï¼ï¼åJVMä¼æè¯¥çº¿ç¨æ¾å ¥éæ± (lock pool)ä¸ï¼çº¿ç¨ä¼è¿å ¥åæ¥é»å¡ç¶æï¼</p></li><li><p>(ä¸). å ¶ä»é»å¡: éè¿è°ç¨çº¿ç¨ç sleep()æ join()æååºäº I/O è¯·æ±æ¶ï¼çº¿ç¨ä¼è¿å ¥å°é»å¡ç¶æãå½ sleep()ç¶æè¶ æ¶ãjoin()çå¾ çº¿ç¨ç»æ¢æè è¶ æ¶ãæè I/O å¤ç宿¯æ¶ï¼çº¿ç¨éæ°è½¬å ¥å°±ç»ªç¶æã</p></li><li><p>æ»äº¡(dead)(ç»æ)ï¼çº¿ç¨run()ãmain()æ¹æ³æ§è¡ç»æï¼æè å å¼å¸¸éåºäºrun()æ¹æ³ï¼å该线ç¨ç»æçå½å¨æãæ»äº¡ç线ç¨ä¸å¯å次å¤çã</p></li></ul><h3 id="_24-java-ä¸ç¨å°ç线ç¨è°åº¦ç®æ³æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_24-java-ä¸ç¨å°ç线ç¨è°åº¦ç®æ³æ¯ä»ä¹"><span>24. Java ä¸ç¨å°ç线ç¨è°åº¦ç®æ³æ¯ä»ä¹ï¼</span></a></h3><ul><li><p>è®¡ç®æºéå¸¸åªæä¸ä¸ª CPUï¼å¨ä»»ææ¶å»åªè½æ§è¡ä¸æ¡æºå¨æä»¤ï¼æ¯ä¸ªçº¿ç¨åªæè·å¾CPU çä½¿ç¨ææè½æ§è¡æä»¤ãæè°å¤çº¿ç¨çå¹¶åè¿è¡ï¼å ¶å®æ¯æä»å®è§ä¸çï¼å个线ç¨è½®æµè·å¾ CPU çä½¿ç¨æï¼å嫿§è¡åèªçä»»å¡ãå¨è¿è¡æ± ä¸ï¼ä¼æå¤ä¸ªå¤äºå°±ç»ªç¶æç线ç¨å¨çå¾ CPUï¼JAVA èææºçä¸é¡¹ä»»å¡å°±æ¯è´è´£çº¿ç¨çè°åº¦ï¼çº¿ç¨è°åº¦æ¯ææç §ç¹å®æºå¶ä¸ºå¤ä¸ªçº¿ç¨åé CPU çä½¿ç¨æãï¼Javaæ¯ç±JVMä¸ç线ç¨è®¡æ°å¨æ¥å®ç°çº¿ç¨è°åº¦ï¼</p></li><li><p>æä¸¤ç§è°åº¦æ¨¡åï¼åæ¶è°åº¦æ¨¡å忢å å¼è°åº¦æ¨¡åã</p></li><li><p>åæ¶è°åº¦æ¨¡åæ¯æè®©ææç线ç¨è½®æµè·å¾ cpu çä½¿ç¨æï¼å¹¶ä¸å¹³ååé æ¯ä¸ªçº¿ç¨å ç¨ç CPUçæ¶é´çè¿ä¸ªä¹æ¯è¾å¥½çè§£ã</p></li><li><p>Javaèææºéç¨æ¢å å¼è°åº¦æ¨¡åï¼æ¯æä¼å 让å¯è¿è¡æ± ä¸ä¼å 级é«ç线ç¨å ç¨CPUï¼å¦æå¯è¿è¡æ± ä¸ç线ç¨ä¼å 级ç¸åï¼é£ä¹å°±éæºéæ©ä¸ä¸ªçº¿ç¨ï¼ä½¿å ¶å ç¨CPUãå¤äºè¿è¡ç¶æç线ç¨ä¼ä¸ç´è¿è¡ï¼ç´è³å®ä¸å¾ä¸æ¾å¼ CPUã</p></li></ul><h3 id="_25-线ç¨çè°åº¦çç¥" tabindex="-1"><a class="header-anchor" href="#_25-线ç¨çè°åº¦çç¥"><span>25. 线ç¨çè°åº¦çç¥</span></a></h3><p>线ç¨è°åº¦å¨éæ©ä¼å 级æé«ç线ç¨è¿è¡ï¼ä½æ¯ï¼å¦æåç以䏿 åµï¼å°±ä¼ç»æ¢çº¿ç¨çè¿è¡ï¼ï¼1ï¼çº¿ç¨ä½ä¸è°ç¨äº yield æ¹æ³è®©åºäºå¯¹ cpu çå ç¨æå©ï¼2ï¼çº¿ç¨ä½ä¸è°ç¨äº sleep æ¹æ³ä½¿çº¿ç¨è¿å ¥ç¡ç ç¶æï¼3ï¼çº¿ç¨ç±äº IO æä½åå°é»å¡ï¼4ï¼å¦å¤ä¸ä¸ªæ´é«ä¼å 级线ç¨åºç°ï¼5ï¼å¨æ¯ææ¶é´ççç³»ç»ä¸ï¼è¯¥çº¿ç¨çæ¶é´çç¨å®</p><h3 id="_26-ä»ä¹æ¯çº¿ç¨è°åº¦å¨-thread-scheduler-åæ¶é´åç-time-slicing" tabindex="-1"><a class="header-anchor" href="#_26-ä»ä¹æ¯çº¿ç¨è°åº¦å¨-thread-scheduler-åæ¶é´åç-time-slicing"><span>26. ä»ä¹æ¯çº¿ç¨è°åº¦å¨(Thread Scheduler)åæ¶é´åç(Time Slicing )ï¼</span></a></h3><ul><li>线ç¨è°åº¦å¨æ¯ä¸ä¸ªæä½ç³»ç»æå¡ï¼å®è´è´£ä¸º Runnable ç¶æç线ç¨åé CPU æ¶é´ã䏿¦æä»¬å建ä¸ä¸ªçº¿ç¨å¹¶å¯å¨å®ï¼å®çæ§è¡ä¾¿ä¾èµäºçº¿ç¨è°åº¦å¨çå®ç°ã</li><li>æ¶é´åçæ¯æå°å¯ç¨ç CPU æ¶é´åé ç»å¯ç¨ç Runnable 线ç¨çè¿ç¨ãåé CPU æ¶é´å¯ä»¥åºäºçº¿ç¨ä¼å 级æè 线ç¨çå¾ çæ¶é´ã</li><li>线ç¨è°åº¦å¹¶ä¸åå° Java èææºæ§å¶ï¼æä»¥ç±åºç¨ç¨åºæ¥æ§å¶å®æ¯æ´å¥½çéæ©ï¼ä¹å°±æ¯è¯´ä¸è¦è®©ä½ çç¨åºä¾èµäºçº¿ç¨çä¼å 级ï¼ã</li></ul><h3 id="_27-请说åºä¸çº¿ç¨åæ¥ä»¥å线ç¨è°åº¦ç¸å ³çæ¹æ³ã" tabindex="-1"><a class="header-anchor" href="#_27-请说åºä¸çº¿ç¨åæ¥ä»¥å线ç¨è°åº¦ç¸å ³çæ¹æ³ã"><span>27. 请说åºä¸çº¿ç¨åæ¥ä»¥å线ç¨è°åº¦ç¸å ³çæ¹æ³ã</span></a></h3><p>ï¼1ï¼wait()ï¼ä½¿ä¸ä¸ªçº¿ç¨å¤äºçå¾ ï¼é»å¡ï¼ç¶æï¼å¹¶ä¸éæ¾æææç对象çéï¼ï¼2ï¼sleep()ï¼ä½¿ä¸ä¸ªæ£å¨è¿è¡ç线ç¨å¤äºç¡ç ç¶æï¼æ¯ä¸ä¸ªéææ¹æ³ï¼è°ç¨æ¤æ¹æ³è¦å¤çInterruptedException å¼å¸¸ï¼ï¼3ï¼notify()ï¼å¤éä¸ä¸ªå¤äºçå¾ ç¶æç线ç¨ï¼å½ç¶å¨è°ç¨æ¤æ¹æ³çæ¶åï¼å¹¶ä¸è½ç¡®åçå¤éæä¸ä¸ªçå¾ ç¶æç线ç¨ï¼èæ¯ç± JVM ç¡®å®å¤éåªä¸ªçº¿ç¨ï¼èä¸ä¸ä¼å 级æ å ³ï¼ï¼4ï¼notityAll()ï¼å¤éææå¤äºçå¾ ç¶æç线ç¨ï¼è¯¥æ¹æ³å¹¶ä¸æ¯å°å¯¹è±¡çéç»ææçº¿ç¨ï¼èæ¯è®©å®ä»¬ç«äºï¼åªæè·å¾éççº¿ç¨æè½è¿å ¥å°±ç»ªç¶æï¼</p><h3 id="_28-sleep-å-wait-æä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_28-sleep-å-wait-æä»ä¹åºå«"><span>28. sleep() å wait() æä»ä¹åºå«ï¼</span></a></h3><p>两è é½å¯ä»¥æå线ç¨çæ§è¡</p><ul><li>ç±»çä¸åï¼sleep() æ¯ Thread线ç¨ç±»çéææ¹æ³ï¼wait() æ¯ Objectç±»çæ¹æ³ã</li><li>æ¯å¦éæ¾éï¼sleep() ä¸éæ¾éï¼wait() éæ¾éã</li><li>ç¨éä¸åï¼Wait é常被ç¨äºçº¿ç¨é´äº¤äº/éä¿¡ï¼sleep é常被ç¨äºæåæ§è¡ã</li><li>ç¨æ³ä¸åï¼wait() æ¹æ³è¢«è°ç¨åï¼çº¿ç¨ä¸ä¼èªå¨èéï¼éè¦å«ç线ç¨è°ç¨åä¸ä¸ªå¯¹è±¡ä¸ç notify()æè notifyAll() æ¹æ³ãsleep() æ¹æ³æ§è¡å®æåï¼çº¿ç¨ä¼èªå¨èéãæè å¯ä»¥ä½¿ç¨wait(longtimeout)è¶ æ¶å线ç¨ä¼èªå¨èéã</li></ul><h3 id="_29-ä½ æ¯å¦ä½è°ç¨-wait-æ¹æ³ç-使ç¨-if-åè¿æ¯å¾ªç¯-为ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_29-ä½ æ¯å¦ä½è°ç¨-wait-æ¹æ³ç-使ç¨-if-åè¿æ¯å¾ªç¯-为ä»ä¹"><span>29. ä½ æ¯å¦ä½è°ç¨ wait() æ¹æ³çï¼ä½¿ç¨ if åè¿æ¯å¾ªç¯ï¼ä¸ºä»ä¹ï¼</span></a></h3><ul><li>å¤äºçå¾ ç¶æç线ç¨å¯è½ä¼æ¶å°éè¯¯è¦æ¥å伪å¤éï¼å¦æä¸å¨å¾ªç¯ä¸æ£æ¥çå¾ æ¡ä»¶ï¼ç¨åºå°±ä¼å¨æ²¡ææ»¡è¶³ç»ææ¡ä»¶çæ åµä¸éåºã</li><li>wait() æ¹æ³åºè¯¥å¨å¾ªç¯è°ç¨ï¼å 为å½çº¿ç¨è·åå° CPU å¼å§æ§è¡çæ¶åï¼å ¶ä»æ¡ä»¶å¯è½è¿æ²¡ææ»¡è¶³ï¼æä»¥å¨å¤çåï¼å¾ªç¯æ£æµæ¡ä»¶æ¯å¦æ»¡è¶³ä¼æ´å¥½ãä¸é¢æ¯ä¸æ®µæ åçä½¿ç¨ wait å notify æ¹æ³ç代ç ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> synchronized</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> (monitor) {</span></span> 39<span class="line"></span> 40<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 夿æ¡ä»¶è°è¯æ¯å¦å¾å°æ»¡è¶³</span></span> 41<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> while</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">!</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">locked) {</span></span> 42<span class="line"></span> 43<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // çå¾ å¤é</span></span> 44<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> monitor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">wait</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span></span> 45<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> }</span></span> 46<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // å¤çå ¶ä»çä¸å¡é»è¾</span></span> 47<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_30-为ä»ä¹çº¿ç¨éä¿¡çæ¹æ³-wait-notify-å-notifyall-被å®ä¹å¨-object-ç±»é" tabindex="-1"><a class="header-anchor" href="#_30-为ä»ä¹çº¿ç¨éä¿¡çæ¹æ³-wait-notify-å-notifyall-被å®ä¹å¨-object-ç±»é"><span>30. 为ä»ä¹çº¿ç¨éä¿¡çæ¹æ³ wait(), notify()å notifyAll()被å®ä¹å¨ Object ç±»éï¼</span></a></h3><ul><li>å 为Javaææç±»çé½ç»§æ¿äºObjectï¼Javaæ³è®©ä»»ä½å¯¹è±¡é½å¯ä»¥ä½ä¸ºéï¼å¹¶ä¸ wait()ï¼notify()çæ¹æ³ç¨äºçå¾ å¯¹è±¡çéæè å¤é线ç¨ï¼å¨ Java ç线ç¨ä¸å¹¶æ²¡æå¯ä¾ä»»ä½å¯¹è±¡ä½¿ç¨çéï¼æä»¥ä»»æå¯¹è±¡è°ç¨æ¹æ³ä¸å®å®ä¹å¨Objectç±»ä¸ã</li><li>æç人ä¼è¯´ï¼æ¢ç¶æ¯çº¿ç¨æ¾å¼å¯¹è±¡éï¼é£ä¹å¯ä»¥æwait()å®ä¹å¨Threadç±»éé¢åï¼æ°å®ä¹ç线ç¨ç»§æ¿äºThreadç±»ï¼ä¹ä¸éè¦éæ°å®ä¹wait()æ¹æ³çå®ç°ãç¶èï¼è¿æ ·åæä¸ä¸ªé常大çé®é¢ï¼ä¸ä¸ªçº¿ç¨å®å ¨å¯ä»¥ææå¾å¤éï¼ä½ ä¸ä¸ªçº¿ç¨æ¾å¼éçæ¶åï¼å°åºè¦æ¾å¼åªä¸ªéï¼å½ç¶äºï¼è¿ç§è®¾è®¡å¹¶ä¸æ¯ä¸è½å®ç°ï¼åªæ¯ç®¡çèµ·æ¥æ´å 夿ã</li></ul><h3 id="_31-为ä»ä¹-wait-notify-å-notifyall-å¿ é¡»å¨åæ¥æ¹æ³æè 忥åä¸è¢«è°ç¨" tabindex="-1"><a class="header-anchor" href="#_31-为ä»ä¹-wait-notify-å-notifyall-å¿ é¡»å¨åæ¥æ¹æ³æè 忥åä¸è¢«è°ç¨"><span>31. 为ä»ä¹ wait(), notify()å notifyAll()å¿ é¡»å¨åæ¥æ¹æ³æè 忥åä¸è¢«è°ç¨ï¼</span></a></h3><ul><li>
47å½ä¸ä¸ªçº¿ç¨éè¦è°ç¨å¯¹è±¡ç wait()æ¹æ³çæ¶åï¼è¿ä¸ªçº¿ç¨å¿
é¡»æ¥æè¯¥å¯¹è±¡çéï¼æ¥çå®å°±ä¼éæ¾è¿ä¸ªå¯¹è±¡éå¹¶è¿å
¥çå¾
ç¶æç´å°å
¶ä»çº¿ç¨è°ç¨è¿ä¸ªå¯¹è±¡ä¸ç notify()æ¹æ³ãåæ ·çï¼å½ä¸ä¸ªçº¿ç¨éè¦è°ç¨å¯¹è±¡ç notify()æ¹æ³æ¶ï¼å®ä¼éæ¾è¿ä¸ªå¯¹è±¡çéï¼ä»¥ä¾¿å
¶ä»å¨çå¾
ç线ç¨å°±å¯ä»¥å¾å°è¿ä¸ªå¯¹è±¡éãç±äºææçè¿äºæ¹æ³é½éè¦çº¿ç¨ææå¯¹è±¡çéï¼è¿æ ·å°±åªè½éè¿åæ¥æ¥å®ç°ï¼æä»¥ä»ä»¬åªè½å¨åæ¥æ¹æ³æè
忥åä¸è¢«è°ç¨ã</li></ul><h3 id="_32-thread-ç±»ä¸ç-yield-æ¹æ³æä»ä¹ä½ç¨" tabindex="-1"><a class="header-anchor" href="#_32-thread-ç±»ä¸ç-yield-æ¹æ³æä»ä¹ä½ç¨"><span>32. Thread ç±»ä¸ç yield æ¹æ³æä»ä¹ä½ç¨ï¼</span></a></h3><ul><li>使å½å线ç¨ä»æ§è¡ç¶æï¼è¿è¡ç¶æï¼åä¸ºå¯æ§è¡æï¼å°±ç»ªç¶æï¼ã</li><li>å½å线ç¨å°äºå°±ç»ªç¶æï¼é£ä¹æ¥ä¸æ¥åªä¸ªçº¿ç¨ä¼ä»å°±ç»ªç¶æåææ§è¡ç¶æå¢ï¼å¯è½æ¯å½å线ç¨ï¼ä¹å¯è½æ¯å
¶ä»çº¿ç¨ï¼çç³»ç»çåé
äºã</li></ul><h3 id="_33-为ä»ä¹-thread-ç±»ç-sleep-å-yield-æ¹æ³æ¯éæç" tabindex="-1"><a class="header-anchor" href="#_33-为ä»ä¹-thread-ç±»ç-sleep-å-yield-æ¹æ³æ¯éæç"><span>33. 为ä»ä¹ Thread ç±»ç sleep()å yield ()æ¹æ³æ¯éæçï¼</span></a></h3><ul><li>Thread ç±»ç sleep()å yield()æ¹æ³å°å¨å½åæ£å¨æ§è¡ç线ç¨ä¸è¿è¡ãæä»¥å¨å
¶ä»å¤äºçå¾
ç¶æç线ç¨ä¸è°ç¨è¿äºæ¹æ³æ¯æ²¡ææä¹çãè¿å°±æ¯ä¸ºä»ä¹è¿äºæ¹æ³æ¯éæçãå®ä»¬å¯ä»¥å¨å½åæ£å¨æ§è¡ç线ç¨ä¸å·¥ä½ï¼å¹¶é¿å
ç¨åºåé误ç认为å¯ä»¥å¨å
¶ä»éè¿è¡çº¿ç¨è°ç¨è¿äºæ¹æ³ã</li></ul><h3 id="_34-线ç¨ç-sleep-æ¹æ³å-yield-æ¹æ³æä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_34-线ç¨ç-sleep-æ¹æ³å-yield-æ¹æ³æä»ä¹åºå«"><span>34. 线ç¨ç sleep()æ¹æ³å yield()æ¹æ³æä»ä¹åºå«ï¼</span></a></h3><p>ï¼1ï¼sleep()æ¹æ³ç»å
¶ä»çº¿ç¨è¿è¡æºä¼æ¶ä¸èè线ç¨çä¼å
级ï¼å æ¤ä¼ç»ä½ä¼å
级ç线ç¨ä»¥è¿è¡çæºä¼ï¼yield()æ¹æ³åªä¼ç»ç¸åä¼å
çº§ææ´é«ä¼å
级ç线ç¨ä»¥è¿è¡çæºä¼ï¼ï¼2ï¼çº¿ç¨æ§è¡ sleep()æ¹æ³å转å
¥é»å¡ï¼blockedï¼ç¶æï¼èæ§è¡ yield()æ¹æ³å转å
¥å°±ç»ªï¼readyï¼ç¶æï¼ï¼3ï¼sleep()æ¹æ³å£°ææåº InterruptedExceptionï¼è yield()æ¹æ³æ²¡æå£°æä»»ä½å¼å¸¸ï¼ï¼4ï¼sleep()æ¹æ³æ¯ yield()æ¹æ³ï¼è·æä½ç³»ç» CPU è°åº¦ç¸å
³ï¼å
·ææ´å¥½çå¯ç§»æ¤æ§ï¼é常ä¸å»ºè®®ä½¿ç¨yield()æ¹æ³æ¥æ§å¶å¹¶å线ç¨çæ§è¡ã</p><h3 id="_35-å¦ä½åæ¢ä¸ä¸ªæ£å¨è¿è¡ç线ç¨" tabindex="-1"><a class="header-anchor" href="#_35-å¦ä½åæ¢ä¸ä¸ªæ£å¨è¿è¡ç线ç¨"><span>35. å¦ä½åæ¢ä¸ä¸ªæ£å¨è¿è¡ç线ç¨ï¼</span></a></h3><ul><li><p>å¨java䏿以ä¸3ç§æ¹æ³å¯ä»¥ç»æ¢æ£å¨è¿è¡ç线ç¨ï¼</p></li><li><p>使ç¨éåºæ å¿ï¼ä½¿çº¿ç¨æ£å¸¸éåºï¼ä¹å°±æ¯å½runæ¹æ³å®æå线ç¨ç»æ¢ã</p></li><li><p>使ç¨stopæ¹æ³å¼ºè¡ç»æ¢ï¼ä½æ¯ä¸æ¨èè¿ä¸ªæ¹æ³ï¼å 为stopåsuspendåresume䏿 ·é½æ¯è¿æä½åºçæ¹æ³ã</p></li><li><p>使ç¨interruptæ¹æ³ä¸æçº¿ç¨ã</p></li></ul><h3 id="_36-java-ä¸-interrupted-å-isinterrupted-æ¹æ³çåºå«" tabindex="-1"><a class="header-anchor" href="#_36-java-ä¸-interrupted-å-isinterrupted-æ¹æ³çåºå«"><span>36. Java ä¸ interrupted å isInterrupted æ¹æ³çåºå«ï¼</span></a></h3><ul><li>interruptï¼ç¨äºä¸æçº¿ç¨ãè°ç¨è¯¥æ¹æ³ç线ç¨çç¶æä¸ºå°è¢«ç½®ä¸ºâ䏿âç
47¶æã注æï¼çº¿ç¨ä¸æä»
ä»
æ¯ç½®çº¿ç¨çä¸æç¶æä½ï¼ä¸ä¼åæ¢çº¿ç¨ãéè¦ç¨æ·èªå·±å»çè§çº¿ç¨çç¶æä¸ºå¹¶åå¤çãæ¯æçº¿ç¨ä¸æçæ¹æ³ï¼ä¹å°±æ¯çº¿ç¨ä¸æå伿åºinterruptedException çæ¹æ³ï¼å°±æ¯å¨çè§çº¿ç¨çä¸æç¶æï¼ä¸æ¦çº¿ç¨çä¸æç¶æè¢«ç½®ä¸ºâä¸æç¶æâï¼å°±ä¼æåºä¸æå¼å¸¸ã</li><li>interruptedï¼æ¯éææ¹æ³ï¼æ¥çå½åä¸æä¿¡å·æ¯trueè¿æ¯false并䏿¸
é¤ä¸æä¿¡å·ã妿ä¸ä¸ªçº¿ç¨è¢«ä¸æäºï¼ç¬¬ä¸æ¬¡è°ç¨ interrupted åè¿å trueï¼ç¬¬äºæ¬¡ååé¢çå°±è¿å false äºã</li><li>isInterruptedï¼æ¯å¯ä»¥è¿åå½åä¸æä¿¡å·æ¯trueè¿æ¯falseï¼ä¸interruptæå¤§çå·®å«</li></ul><h3 id="_37-ä»ä¹æ¯é»å¡å¼æ¹æ³" tabindex="-1"><a class="header-anchor" href="#_37-ä»ä¹æ¯é»å¡å¼æ¹æ³"><span>37. ä»ä¹æ¯é»å¡å¼æ¹æ³ï¼</span></a></h3><ul><li>é»å¡å¼æ¹æ³æ¯æç¨åºä¼ä¸ç´çå¾
è¯¥æ¹æ³å®ææé´ä¸åå
¶ä»äºæ
ï¼ServerSocket çaccept()æ¹æ³å°±æ¯ä¸ç´çå¾
客æ·ç«¯è¿æ¥ãè¿éçé»å¡æ¯æè°ç¨ç»æè¿åä¹åï¼å½å线ç¨ä¼è¢«æèµ·ï¼ç´å°å¾å°ç»æä¹åæä¼è¿åãæ¤å¤ï¼è¿æå¼æ¥åéé»å¡å¼æ¹æ³å¨ä»»å¡å®æåå°±è¿åã</li></ul><h3 id="_38-java-ä¸ä½ ææ ·å¤éä¸ä¸ªé»å¡ç线ç¨" tabindex="-1"><a class="header-anchor" href="#_38-java-ä¸ä½ ææ ·å¤éä¸ä¸ªé»å¡ç线ç¨"><span>38. Java ä¸ä½ ææ ·å¤éä¸ä¸ªé»å¡ç线ç¨ï¼</span></a></h3><ul><li>é¦å
ï¼wait()ãnotify() æ¹æ³æ¯é对对象çï¼è°ç¨ä»»æå¯¹è±¡ç wait()æ¹æ³é½å°å¯¼è´çº¿ç¨é»å¡ï¼é»å¡çåæ¶ä¹å°éæ¾è¯¥å¯¹è±¡çéï¼ç¸åºå°ï¼è°ç¨ä»»æå¯¹è±¡ç notify()æ¹æ³åå°éæºè§£é¤è¯¥å¯¹è±¡é»å¡ç线ç¨ï¼ä½å®éè¦éæ°è·å该对象çéï¼ç´å°è·åæåæè½å¾ä¸æ§è¡ï¼</li><li>å
¶æ¬¡ï¼waitãnotify æ¹æ³å¿
é¡»å¨ synchronized åææ¹æ³ä¸è¢«è°ç¨ï¼å¹¶ä¸è¦ä¿è¯åæ¥åææ¹æ³çé对象ä¸è°ç¨ waitãnotify æ¹æ³ç对象æ¯åä¸ä¸ªï¼å¦æ¤ä¸æ¥å¨è°ç¨ wait ä¹åå½å线ç¨å°±å·²ç»æåè·åæå¯¹è±¡çéï¼æ§è¡ wait é»å¡åå½å线ç¨å°±å°ä¹åè·åç对象ééæ¾ã</li></ul><h3 id="_39-notify-å-notifyall-æä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_39-notify-å-notifyall-æä»ä¹åºå«"><span>39. notify() å notifyAll() æä»ä¹åºå«ï¼</span></a></h3><ul><li>å¦æçº¿ç¨è°ç¨äºå¯¹è±¡ç wait()æ¹æ³ï¼é£ä¹çº¿ç¨ä¾¿ä¼å¤äºè¯¥å¯¹è±¡ççå¾
æ± ä¸ï¼çå¾
æ± ä¸ç线ç¨ä¸ä¼å»ç«äºè¯¥å¯¹è±¡çéã</li><li>notifyAll() ä¼å¤éææç线ç¨ï¼notify() åªä¼å¤éä¸ä¸ªçº¿ç¨ã</li><li>notifyAll() è°ç¨åï¼ä¼å°å
¨é¨çº¿ç¨ç±çå¾
æ± ç§»å°éæ± ï¼ç¶ååä¸éçç«äºï¼ç«äºæååç»§ç»æ§è¡ï¼å¦æä¸æååçå¨éæ± çå¾
éè¢«éæ¾å忬¡åä¸ç«äºãè notify()åªä¼å¤éä¸ä¸ªçº¿ç¨ï¼å
·ä½å¤éåªä¸ä¸ªçº¿ç¨ç±èææºæ§å¶ã</li></ul><h3 id="_40-å¦ä½å¨ä¸¤ä¸ªçº¿ç¨é´å
±äº«æ°æ®" tabindex="-1"><a class="header-anchor" href="#_40-å¦ä½å¨ä¸¤ä¸ªçº¿ç¨é´å
±äº«æ°æ®"><span>40. å¦ä½å¨ä¸¤ä¸ªçº¿ç¨é´å
±äº«æ°æ®ï¼</span></a></h3><ul><li>å¨ä¸¤ä¸ªçº¿ç¨é´å
±äº«åéå³å¯å®ç°å
±äº«ãä¸è¬æ¥è¯´ï¼å
±äº«åéè¦æ±åéæ¬èº«æ¯çº¿ç¨å®å
¨çï¼ç¶åå¨çº¿ç¨å
使ç¨çæ¶åï¼å¦ææå¯¹å
±äº«åéçå¤åæä½ï¼é£ä¹ä¹å¾ä¿è¯å¤åæä½ç线ç¨å®å
¨æ§ã</li></ul><h3 id="_41-java-å¦ä½å®ç°å¤çº¿ç¨ä¹é´çé讯ååä½" tabindex="-1"><a class="header-anchor" href="#_41-java-å¦ä½å®ç°å¤çº¿ç¨ä¹é´çé讯ååä½"><span>41. Java å¦ä½å®ç°å¤çº¿ç¨ä¹é´çé讯ååä½ï¼</span></a></h3><ul><li><p>å¯ä»¥éè¿ä¸æ å å
±äº«åéçæ¹å¼å®ç°çº¿ç¨é´çé讯ååä½</p></li><li><p>æ¯å¦è¯´æç»å
¸çç产è
-æ¶è´¹è
模åï¼å½éåæ»¡æ¶ï¼ç产è
éè¦çå¾
éåæç©ºé´æè½ç»§ç»å¾é颿¾å
¥ååï¼èå¨çå¾
çæé´å
ï¼ç产è
å¿
须鿾坹䏴çèµæºï¼å³éåï¼çå ç¨æãå 为ç产è
妿ä¸éæ¾å¯¹ä¸´çèµæºçå ç¨æï¼é£ä¹æ¶è´¹è
å°±æ æ³æ¶è´¹éåä¸çååï¼å°±ä¸ä¼è®©éåæç©ºé´ï¼é£ä¹ç产è
å°±ä¼ä¸ç´æ éçå¾
ä¸å»ãå æ¤ï¼ä¸è¬æ
åµä¸ï¼å½éåæ»¡æ¶ï¼ä¼è®©ç产è
交åºå¯¹ä¸´çèµæºçå ç¨æï¼å¹¶è¿å
¥æèµ·ç¶æãç¶åçå¾
æ¶è´¹è
æ¶è´¹äºååï¼ç¶åæ¶è´¹è
éç¥ç产è
éåæç©ºé´äºãåæ ·å°ï¼å½éå空æ¶ï¼æ¶è´¹è
ä¹å¿
é¡»çå¾
ï¼çå¾
ç产è
éç¥å®éå䏿ååäºãè¿ç§äºç¸éä¿¡çè¿ç¨å°±æ¯çº¿ç¨é´çåä½ã</p></li><li><p>Javaä¸çº¿ç¨éä¿¡åä½çæå¸¸è§æ¹å¼ï¼</p></li><li><p>ä¸.syncrhoizedå éç线ç¨çObjectç±»çwait()/notify()/notifyAll()</p></li><li><p>äº.ReentrantLockç±»å éç线ç¨çConditionç±»çawait()/signal()/signalAll()</p></li><li><p>
47线ç¨é´ç´æ¥çæ°æ®äº¤æ¢ï¼</p></li><li><p>ä¸.éè¿ç®¡éè¿è¡çº¿ç¨é´éä¿¡ï¼åèæµãå符æµ</p></li></ul><h3 id="_42-åæ¥æ¹æ³å忥å-åªä¸ªæ¯æ´å¥½çéæ©" tabindex="-1"><a class="header-anchor" href="#_42-åæ¥æ¹æ³å忥å-åªä¸ªæ¯æ´å¥½çéæ©"><span>42. åæ¥æ¹æ³å忥åï¼åªä¸ªæ¯æ´å¥½çéæ©ï¼</span></a></h3><ul><li>忥忝æ´å¥½çéæ©ï¼å 为å®ä¸ä¼é使´ä¸ªå¯¹è±¡ï¼å½ç¶ä½ ä¹å¯ä»¥è®©å®é使´ä¸ªå¯¹è±¡ï¼ãåæ¥æ¹æ³ä¼é使´ä¸ªå¯¹è±¡ï¼åªæè¿ä¸ªç±»ä¸æå¤ä¸ªä¸ç¸å
³èç忥åï¼è¿é常ä¼å¯¼è´ä»ä»¬åæ¢æ§è¡å¹¶éè¦çå¾
è·å¾è¿ä¸ªå¯¹è±¡ä¸çéã</li><li>忥忴è¦ç¬¦å弿¾è°ç¨çååï¼åªå¨éè¦éä½ç代ç åéä½ç¸åºç对象ï¼è¿æ ·ä»ä¾§é¢æ¥è¯´ä¹å¯ä»¥é¿å
æ»éã</li></ul><p>请ç¥é䏿¡ååï¼åæ¥çèå´è¶å°è¶å¥½ã</p><h3 id="_43-ä»ä¹æ¯çº¿ç¨åæ¥å线ç¨äºæ¥-æåªå ç§å®ç°æ¹å¼" tabindex="-1"><a class="header-anchor" href="#_43-ä»ä¹æ¯çº¿ç¨åæ¥å线ç¨äºæ¥-æåªå ç§å®ç°æ¹å¼"><span>43. ä»ä¹æ¯çº¿ç¨åæ¥å线ç¨äºæ¥ï¼æåªå ç§å®ç°æ¹å¼ï¼</span></a></h3><ul><li><p>å½ä¸ä¸ªçº¿ç¨å¯¹å
±äº«çæ°æ®è¿è¡æä½æ¶ï¼åºä½¿ä¹æä¸ºä¸ä¸ªâååæä½âï¼å³å¨æ²¡æå®æç¸å
³æä½ä¹åï¼ä¸å
许å
¶ä»çº¿ç¨ææå®ï¼å¦åï¼å°±ä¼ç ´åæ°æ®ç宿´æ§ï¼å¿
ç¶ä¼å¾å°é误çå¤çç»æï¼è¿å°±æ¯çº¿ç¨ç忥ã</p></li><li><p>å¨å¤çº¿ç¨åºç¨ä¸ï¼èèä¸å线ç¨ä¹é´çæ°æ®åæ¥å鲿¢æ»éãå½ä¸¤ä¸ªæå¤ä¸ªçº¿ç¨ä¹é´åæ¶çå¾
对æ¹éæ¾èµæºçæ¶åå°±ä¼å½¢æçº¿ç¨ä¹é´çæ»éã为äºé²æ¢æ»éçåçï¼éè¦éè¿åæ¥æ¥å®ç°çº¿ç¨å®å
¨ã</p></li><li><p>线ç¨äºæ¥æ¯æå¯¹äºå
±äº«çè¿ç¨ç³»ç»èµæºï¼å¨åå个线ç¨è®¿é®æ¶çæå®æ§ã彿è¥å¹²ä¸ªçº¿ç¨é½è¦ä½¿ç¨æä¸å
±äº«èµæºæ¶ï¼ä»»ä½æ¶å»æå¤åªå
许ä¸ä¸ªçº¿ç¨å»ä½¿ç¨ï¼å
¶å®è¦ä½¿ç¨è¯¥èµæºç线ç¨å¿
é¡»çå¾
ï¼ç´å°å ç¨èµæºè
éæ¾è¯¥èµæºã线ç¨äºæ¥å¯ä»¥çææ¯ä¸ç§ç¹æ®ç线ç¨åæ¥ã</p></li><li><p>线ç¨é´çåæ¥æ¹æ³å¤§ä½å¯å为两类ï¼ç¨æ·æ¨¡å¼åå
æ ¸æ¨¡å¼ã顾åæä¹ï¼å
æ ¸æ¨¡å¼å°±æ¯æå©ç¨ç³»ç»å
æ ¸å¯¹è±¡çå䏿§æ¥è¿è¡åæ¥ï¼ä½¿ç¨æ¶éè¦åæ¢å
æ ¸æä¸ç¨æ·æï¼èç¨æ·æ¨¡å¼å°±æ¯ä¸éè¦åæ¢å°å
æ ¸æï¼åªå¨ç¨æ·æå®ææä½ã</p></li><li><p>ç¨æ·æ¨¡å¼ä¸çæ¹æ³æï¼ååæä½ï¼ä¾å¦ä¸ä¸ªåä¸çå
¨å±åéï¼ï¼ä¸´çåºãå
æ ¸æ¨¡å¼ä¸çæ¹æ³æï¼äºä»¶ï¼ä¿¡å·éï¼äºæ¥éã</p></li><li><p>å®ç°çº¿ç¨åæ¥çæ¹æ³</p></li><li><p>åæ¥ä»£ç æ¹æ³ï¼sychronized å
³é®åä¿®é¥°çæ¹æ³</p></li><li><p>忥代ç åï¼sychronized å
³é®å修饰ç代ç å</p></li><li><p>使ç¨ç¹æ®åéåvolatileå®ç°çº¿ç¨åæ¥ï¼volatileå
³é®å为ååéçè®¿é®æä¾äºä¸ç§å
éæºå¶</p></li><li><p>使ç¨éå
¥éå®ç°çº¿ç¨åæ¥ï¼reentrantlockç±»æ¯å¯å²å
¥ãäºæ¥ãå®ç°äºlockæ¥å£çéä»ä¸sychronizedæ¹æ³å
·æç¸åçåºæ¬è¡ä¸ºåè¯ä¹</p></li></ul><h3 id="_44-å¨çè§å¨-monitor-å
é¨-æ¯å¦ä½å线ç¨åæ¥ç-ç¨åºåºè¯¥ååªç§çº§å«ç忥" tabindex="-1"><a class="header-anchor" href="#_44-å¨çè§å¨-monitor-å
é¨-æ¯å¦ä½å线ç¨åæ¥ç-ç¨åºåºè¯¥ååªç§çº§å«ç忥"><span>44. å¨çè§å¨(Monitor)å
é¨ï¼æ¯å¦ä½å线ç¨åæ¥çï¼ç¨åºåºè¯¥ååªç§çº§å«ç忥ï¼</span></a></h3><ul><li>å¨ java èææºä¸ï¼çè§å¨åéå¨Javaèææºä¸æ¯ä¸å使ç¨çãçè§å¨çè§ä¸å忥代ç åï¼ç¡®ä¿ä¸æ¬¡åªæä¸ä¸ªçº¿ç¨æ§è¡åæ¥ä»£ç åãæ¯ä¸ä¸ªçè§å¨é½åä¸ä¸ªå¯¹è±¡å¼ç¨ç¸å
³èã线ç¨å¨è·åéä¹åä¸å
许æ§è¡åæ¥ä»£ç ã</li><li>䏿¦æ¹æ³æè
代ç å被 synchronized 修饰ï¼é£ä¹è¿ä¸ªé¨åå°±æ¾å
¥äºçè§å¨ççè§åºåï¼ç¡®ä¿ä¸æ¬¡åªè½æä¸ä¸ªçº¿ç¨æ§è¡è¯¥é¨åç代ç ï¼çº¿ç¨å¨è·åéä¹åä¸å
许æ§è¡è¯¥é¨åç代ç </li><li>å¦å¤ java è¿æä¾äºæ¾å¼çè§å¨( Lock )åéå¼çè§å¨( synchronized )两ç§éæ¹æ¡</li></ul><h3 id="_45-å¦æä½ æäº¤ä»»å¡æ¶-çº¿ç¨æ± éå已满-è¿æ¶ä¼åçä»ä¹" tabindex="-1"><a class="header-anchor" href="#_45-å¦æä½ æäº¤ä»»å¡æ¶-çº¿ç¨æ± éå已满-è¿æ¶ä¼åçä»ä¹"><span>45. å¦æä½ æäº¤ä»»å¡æ¶ï¼çº¿ç¨æ± éå已满ï¼è¿æ¶ä¼åçä»ä¹</span></a></h3><ul><li>
47æä¿©ç§å¯è½ï¼ï¼1ï¼å¦æä½¿ç¨çæ¯æ çéå LinkedBlockingQueueï¼ä¹å°±æ¯æ çéåçè¯ï¼æ²¡å ³ç³»ï¼ç»§ç»æ·»å ä»»å¡å°é»å¡éåä¸çå¾ æ§è¡ï¼å 为 LinkedBlockingQueue å¯ä»¥è¿ä¹è®¤ä¸ºæ¯ä¸ä¸ªæ 穷大çéåï¼å¯ä»¥æ é忾任å¡ï¼2ï¼å¦æä½¿ç¨çæ¯æçéåæ¯å¦ ArrayBlockingQueueï¼ä»»å¡é¦å ä¼è¢«æ·»å å°ArrayBlockingQueueä¸ï¼ArrayBlockingQueue 满äºï¼ä¼æ ¹æ®maximumPoolSize çå¼å¢å çº¿ç¨æ°éï¼å¦æå¢å äºçº¿ç¨æ°éè¿æ¯å¤çä¸è¿æ¥ï¼ArrayBlockingQueue ç»§ç»æ»¡ï¼é£ä¹åä¼ä½¿ç¨æç»çç¥RejectedExecutionHandlerå¤ç满äºçä»»å¡ï¼é»è®¤æ¯ AbortPolicy</li></ul><h3 id="_46-ä»ä¹å«çº¿ç¨å®å ¨-servlet-æ¯çº¿ç¨å®å ¨å" tabindex="-1"><a class="header-anchor" href="#_46-ä»ä¹å«çº¿ç¨å®å ¨-servlet-æ¯çº¿ç¨å®å ¨å"><span>46. ä»ä¹å«çº¿ç¨å®å ¨ï¼servlet æ¯çº¿ç¨å®å ¨å?</span></a></h3><ul><li>线ç¨å®å ¨æ¯ç¼ç¨ä¸çæ¯è¯ï¼ææä¸ªæ¹æ³å¨å¤çº¿ç¨ç¯å¢ä¸è¢«è°ç¨æ¶ï¼è½å¤æ£ç¡®å°å¤çå¤ä¸ªçº¿ç¨ä¹é´çå ±äº«åéï¼ä½¿ç¨åºåè½æ£ç¡®å®æã</li><li>Servlet 䏿¯çº¿ç¨å®å ¨çï¼servlet æ¯åå®ä¾å¤çº¿ç¨çï¼å½å¤ä¸ªçº¿ç¨åæ¶è®¿é®åä¸ä¸ªæ¹æ³ï¼æ¯ä¸è½ä¿è¯å ±äº«åéç线ç¨å®å ¨æ§çã</li><li>Struts2 ç action æ¯å¤å®ä¾å¤çº¿ç¨çï¼æ¯çº¿ç¨å®å ¨çï¼æ¯ä¸ªè¯·æ±è¿æ¥é½ä¼ new ä¸ä¸ªæ°ç action åé ç»è¿ä¸ªè¯·æ±ï¼è¯·æ±å®æå鿝ã</li><li>SpringMVC ç Controller æ¯çº¿ç¨å®å ¨çåï¼ä¸æ¯çï¼å Servlet 类似çå¤çæµç¨ã</li><li>Struts2 好夿¯ä¸ç¨èè线ç¨å®å ¨é®é¢ï¼Servlet å SpringMVC éè¦èè线ç¨å®å ¨é®é¢ï¼ä½æ¯æ§è½å¯ä»¥æåä¸ç¨å¤ç太å¤ç gcï¼å¯ä»¥ä½¿ç¨ ThreadLocal æ¥å¤çå¤çº¿ç¨çé®é¢ã</li></ul><h3 id="_47-å¨-java-ç¨åºä¸æä¹ä¿è¯å¤çº¿ç¨çè¿è¡å®å ¨" tabindex="-1"><a class="header-anchor" href="#_47-å¨-java-ç¨åºä¸æä¹ä¿è¯å¤çº¿ç¨çè¿è¡å®å ¨"><span>47. å¨ Java ç¨åºä¸æä¹ä¿è¯å¤çº¿ç¨çè¿è¡å®å ¨ï¼</span></a></h3><ul><li>æ¹æ³ä¸ï¼ä½¿ç¨å®å ¨ç±»ï¼æ¯å¦ java.util.concurrent ä¸çç±»ï¼ä½¿ç¨ååç±»AtomicInteger</li><li>æ¹æ³äºï¼ä½¿ç¨èªå¨é synchronizedã</li><li>æ¹æ³ä¸ï¼ä½¿ç¨æå¨é Lockã</li><li>æå¨é Java 示ä¾ä»£ç å¦ä¸ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Lock</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> lock </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> ReentrantLock</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 48<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> lock</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">. </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">lock</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span></span> 49<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> try</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> {</span></span> 50<span class="line"></span> 51<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">. </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"è·å¾é"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 52<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">catch</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> (</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Exception</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> e</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">) {</span></span> 53<span class="line"></span> 54<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // TODO: handle exception</span></span> 55<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">finally</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> {</span></span> 56<span class="line"></span> 57<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">. </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"éæ¾é"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 58<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> lock</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">. </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">unlock</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span></span> 59<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_48-ä½ å¯¹çº¿ç¨ä¼å 级ççè§£æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_48-ä½ å¯¹çº¿ç¨ä¼å 级ççè§£æ¯ä»ä¹"><span>48. ä½ å¯¹çº¿ç¨ä¼å 级ççè§£æ¯ä»ä¹ï¼</span></a></h3><ul><li>
59æ¯ä¸ä¸ªçº¿ç¨é½æ¯æä¼å
级çï¼ä¸è¬æ¥è¯´ï¼é«ä¼å
级ç线ç¨å¨è¿è¡æ¶ä¼å
·æä¼å
æï¼ä½è¿ä¾èµäºçº¿ç¨è°åº¦çå®ç°ï¼è¿ä¸ªå®ç°æ¯åæä½ç³»ç»ç¸å
³ç(OS dependent)ãæä»¬å¯ä»¥å®ä¹çº¿ç¨çä¼å
级ï¼ä½æ¯è¿å¹¶ä¸è½ä¿è¯é«ä¼å
级ç线ç¨ä¼å¨ä½ä¼å
级ç线ç¨åæ§è¡ã线ç¨ä¼å
级æ¯ä¸ä¸ª int åé(ä» 1-10)ï¼1 代表æä½ä¼å
级ï¼10 代表æé«ä¼å
级ã</li><li>Java ç线ç¨ä¼å
级è°åº¦ä¼å§æç»æä½ç³»ç»å»å¤çï¼æä»¥ä¸å
·ä½çæä½ç³»ç»ä¼å
级æå
³ï¼å¦éç¹å«éè¦ï¼ä¸è¬æ é设置线ç¨ä¼å
级ã</li><li>å½ç¶ï¼å¦æä½ ççæ³è®¾ç½®ä¼å
级å¯ä»¥éè¿setPriority()æ¹æ³è®¾ç½®ï¼ä½æ¯è®¾ç½®äºä¸ä¸å®ä¼è¯¥åï¼è¿ä¸ªæ¯ä¸åç¡®ç</li></ul><h3 id="_49-线ç¨ç±»çæé æ¹æ³ãéæåæ¯è¢«åªä¸ªçº¿ç¨è°ç¨ç" tabindex="-1"><a class="header-anchor" href="#_49-线ç¨ç±»çæé æ¹æ³ãéæåæ¯è¢«åªä¸ªçº¿ç¨è°ç¨ç"><span>49. 线ç¨ç±»çæé æ¹æ³ãéæåæ¯è¢«åªä¸ªçº¿ç¨è°ç¨ç</span></a></h3><ul><li>è¿æ¯ä¸ä¸ªé常åé»åç¡ç¾çé®é¢ã请记ä½ï¼çº¿ç¨ç±»çæé æ¹æ³ãéæåæ¯è¢« newè¿ä¸ªçº¿ç¨ç±»æå¨ççº¿ç¨æè°ç¨çï¼è run æ¹æ³éé¢çä»£ç ææ¯è¢«çº¿ç¨èªèº«æè°ç¨çã</li><li>å¦æè¯´ä¸é¢ç说æ³è®©ä½ æå°å°æï¼é£ä¹æä¸¾ä¸ªä¾åï¼å设 Thread2 ä¸ new äºThread1ï¼main 彿°ä¸ new äº Thread2ï¼é£ä¹ï¼ï¼1ï¼Thread2 çæé æ¹æ³ãéæåæ¯ main 线ç¨è°ç¨çï¼Thread2 ç run()æ¹æ³æ¯Thread2 èªå·±è°ç¨çï¼2ï¼Thread1 çæé æ¹æ³ãéæåæ¯ Thread2 è°ç¨çï¼Thread1 ç run()æ¹æ³æ¯Thread1 èªå·±è°ç¨ç</li></ul><h3 id="_50-java-䏿ä¹è·åä¸ä»½çº¿ç¨-dump-æä»¶-ä½ å¦ä½å¨-java-ä¸è·å线ç¨å æ " tabindex="-1"><a class="header-anchor" href="#_50-java-䏿ä¹è·åä¸ä»½çº¿ç¨-dump-æä»¶-ä½ å¦ä½å¨-java-ä¸è·å线ç¨å æ "><span>50. Java 䏿ä¹è·åä¸ä»½çº¿ç¨ dump æä»¶ï¼ä½ å¦ä½å¨ Java ä¸è·å线ç¨å æ ï¼</span></a></h3><ul><li>Dumpæä»¶æ¯è¿ç¨çå
åéåãå¯ä»¥æç¨åºçæ§è¡ç¶æéè¿è°è¯å¨ä¿åå°dumpæä»¶ä¸ã</li><li>å¨ Linux ä¸ï¼ä½ å¯ä»¥éè¿å½ä»¤ kill -3 PID ï¼Java è¿ç¨çè¿ç¨ IDï¼æ¥è·å Javaåºç¨ç dump æä»¶ã</li><li>å¨ Windows ä¸ï¼ä½ å¯ä»¥æä¸ Ctrl + Break æ¥è·åãè¿æ · JVM å°±ä¼å°çº¿ç¨ç dump æä»¶æå°å°æ åè¾åºæé误æä»¶ä¸ï¼å®å¯è½æå°å¨æ§å¶å°æè
æ¥å¿æä»¶ä¸ï¼å
·ä½ä½ç½®ä¾èµåºç¨çé
ç½®ã</li></ul><h3 id="_51-ä¸ä¸ªçº¿ç¨è¿è¡æ¶åçå¼å¸¸ä¼ææ ·" tabindex="-1"><a class="header-anchor" href="#_51-ä¸ä¸ªçº¿ç¨è¿è¡æ¶åçå¼å¸¸ä¼ææ ·"><span>51. ä¸ä¸ªçº¿ç¨è¿è¡æ¶åçå¼å¸¸ä¼ææ ·ï¼</span></a></h3><ul><li>妿å¼å¸¸æ²¡æè¢«æè·è¯¥çº¿ç¨å°ä¼åæ¢æ§è¡ãThread.UncaughtExceptionHandleræ¯ç¨äºå¤çæªæè·å¼å¸¸é æçº¿ç¨çªç¶ä¸ææ
åµçä¸ä¸ªå
嵿¥å£ãå½ä¸ä¸ªæªæè·å¼å¸¸å°é æçº¿ç¨ä¸æçæ¶åï¼JVMä¼ä½¿ç¨ Thread.getUncaughtExceptionHandler()æ¥æ¥è¯¢çº¿ç¨ç UncaughtExceptionHandler å¹¶å°çº¿ç¨åå¼å¸¸ä½ä¸ºåæ°ä¼ éç» handler ç uncaughtException()æ¹æ³è¿è¡å¤çã</li></ul><h3 id="_52-java-çº¿ç¨æ°è¿å¤ä¼é æä»ä¹å¼å¸¸" tabindex="-1"><a class="header-anchor" href="#_52-java-çº¿ç¨æ°è¿å¤ä¼é æä»ä¹å¼å¸¸"><span>52. Java çº¿ç¨æ°è¿å¤ä¼é æä»ä¹å¼å¸¸ï¼</span></a></h3><ul><li>线ç¨ççå½å¨æå¼éé常é«</li><li>æ¶èè¿å¤ç CPUèµæºå¦æå¯è¿è¡ççº¿ç¨æ°éå¤äºå¯ç¨å¤çå¨çæ°éï¼é£ä¹æçº¿ç¨å°ä¼è¢«é²ç½®ã大é空é²ç线ç¨ä¼å ç¨è®¸å¤å
åï¼ç»åå¾åæ¶å¨å¸¦æ¥ååï¼èä¸å¤§éç线ç¨å¨ç«äº CPUèµæºæ¶è¿å°äº§çå
¶ä»æ§è½çå¼éã</li><li>éä½ç¨³å®æ§JVMå¨å¯å建线ç¨çæ°éä¸åå¨ä¸ä¸ªéå¶ï¼è¿ä¸ªéå¶å¼å°éçå¹³å°çä¸åèä¸åï¼å¹¶ä¸æ¿åçå¤ä¸ªå ç´ å¶çº¦ï¼å
æ¬ JVM çå¯å¨åæ°ãThread æé 彿°ä¸è¯·æ±æ ç大å°ï¼ä»¥ååºå±æä½ç³»ç»å¯¹çº¿ç¨çéå¶çãå¦æç ´åäºè¿äºéå¶ï¼é£ä¹å¯è½æåºOutOfMemoryError å¼å¸¸ã</li></ul><h3 id="_53-å¤çº¿ç¨çå¸¸ç¨æ¹æ³" tabindex="-1"><a class="header-anchor" href="#_53-å¤çº¿ç¨çå¸¸ç¨æ¹æ³"><span>53. å¤çº¿ç¨çå¸¸ç¨æ¹æ³</span></a></h3><table><thead><tr><th align="left">æ¹æ³å</th><th align="left">æè¿°</th></tr></thead><tbody><tr><td align="left">sleep()</td><td align="left">强迫ä¸ä¸ªçº¿ç¨ç¡ç N毫ç§</td></tr><tr><td align="left">isAlive()</td><td align="left">夿ä¸ä¸ªçº¿ç¨æ¯å¦åæ´»ã</td></tr><tr><td align="left">join()</td><td align="left">çå¾
线ç¨ç»æ¢ã</td></tr><tr><td align="left">activeCount()</td><td align="left">ç¨åºä¸æ´»è·ççº¿ç¨æ°ã</td></tr><tr><td align="left">enumerate()</td><td align="left">æä¸¾ç¨åºä¸ç线ç¨ã</td></tr><tr><td align="left">currentThread()</td><td align="left">å¾å°å½å线ç¨ã</td></tr><tr><td align="left">isDaemon()</td><td align="left">ä¸ä¸ªçº¿ç¨æ¯å¦ä¸ºå®æ¤çº¿ç¨ã</td></tr><tr><td align="left">setDaemon()</td><td align="left">设置ä¸ä¸ªçº¿ç¨ä¸ºå®æ¤çº¿ç¨ã</td></tr><tr><td align="left">
59setName()</td><td align="left">为线ç¨è®¾ç½®ä¸ä¸ªåç§°ã</td></tr><tr><td align="left">wait()</td><td align="left">强迫ä¸ä¸ªçº¿ç¨çå¾
ã</td></tr><tr><td align="left">notify()</td><td align="left">éç¥ä¸ä¸ªçº¿ç¨ç»§ç»è¿è¡ã</td></tr><tr><td align="left">setPriority()</td><td align="left">设置ä¸ä¸ªçº¿ç¨çä¼å
级ã</td></tr></tbody></table><h2 id="äºãå¹¶åç论" tabindex="-1"><a class="header-anchor" href="#äºãå¹¶åç论"><span>äºãå¹¶åç论</span></a></h2><h3 id="_1-javaä¸åå¾åæ¶æä»ä¹ç®ç-ä»ä¹æ¶åè¿è¡åå¾åæ¶" tabindex="-1"><a class="header-anchor" href="#_1-javaä¸åå¾åæ¶æä»ä¹ç®ç-ä»ä¹æ¶åè¿è¡åå¾åæ¶"><span>1. Javaä¸åå¾åæ¶æä»ä¹ç®çï¼ä»ä¹æ¶åè¿è¡åå¾åæ¶ï¼</span></a></h3><ul><li>åå¾åæ¶æ¯å¨å
åä¸å卿²¡æå¼ç¨ç对象æè¶
è¿ä½ç¨åç对象æ¶è¿è¡çã</li><li>åå¾åæ¶çç®çæ¯è¯å«å¹¶ä¸ä¸¢å¼åºç¨ä¸å使ç¨ç对象æ¥éæ¾åéç¨èµæºã</li></ul><h3 id="_2-线ç¨ä¹é´å¦ä½éä¿¡å线ç¨ä¹é´å¦ä½åæ¥" tabindex="-1"><a class="header-anchor" href="#_2-线ç¨ä¹é´å¦ä½éä¿¡å线ç¨ä¹é´å¦ä½åæ¥"><span>2. 线ç¨ä¹é´å¦ä½éä¿¡å线ç¨ä¹é´å¦ä½åæ¥</span></a></h3><ul><li>å¨å¹¶åç¼ç¨ä¸ï¼æä»¬éè¦å¤ç两个å
³é®é®é¢ï¼çº¿ç¨ä¹é´å¦ä½éä¿¡å线ç¨ä¹é´å¦ä½åæ¥ãéä¿¡æ¯æçº¿ç¨ä¹é´ä»¥å¦ä½æ¥äº¤æ¢ä¿¡æ¯ãä¸è¬çº¿ç¨ä¹é´çéä¿¡æºå¶æä¸¤ç§ï¼å
±äº«å
ååæ¶æ¯ä¼ éã</li><li>Javaçå¹¶åéç¨çæ¯å
±äº«å
忍¡åï¼Java线ç¨ä¹é´çéä¿¡æ»æ¯éå¼è¿è¡ï¼æ´ä¸ªéä¿¡è¿ç¨å¯¹ç¨åºåå®å
¨éæã妿ç¼åå¤çº¿ç¨ç¨åºçJavaç¨åºåä¸çè§£éå¼è¿è¡ç线ç¨ä¹é´éä¿¡ç工使ºå¶ï¼å¾å¯è½ä¼éå°åç§å¥æªçå
åå¯è§æ§é®é¢ã</li></ul><h3 id="_3-javaå
忍¡å" tabindex="-1"><a class="header-anchor" href="#_3-javaå
忍¡å"><span>3. Javaå
忍¡å</span></a></h3><ul><li>å
±äº«å
忍¡åæçå°±æ¯Javaå
忍¡å(ç®ç§°JMM)ï¼JMMå³å®ä¸ä¸ªçº¿ç¨å¯¹å
±äº«åéçåå
¥æ¶,è½å¯¹å¦ä¸ä¸ªçº¿ç¨å¯è§ã仿½è±¡çè§åº¦æ¥çï¼JMMå®ä¹äºçº¿ç¨å主å
åä¹é´çæ½è±¡å
³ç³»ï¼çº¿ç¨ä¹é´çå
±äº«åéåå¨å¨ä¸»å
åï¼main memoryï¼ä¸ï¼æ¯ä¸ªçº¿ç¨é½æä¸ä¸ªç§æçæ¬å°å
åï¼local memoryï¼ï¼æ¬å°å
åä¸åå¨äºè¯¥çº¿ç¨ä»¥è¯»/åå
±äº«åéç坿¬ãæ¬å°å
忝JMMçä¸ä¸ªæ½è±¡æ¦å¿µï¼å¹¶ä¸çå®åå¨ã宿¶µçäºç¼åï¼åç¼å²åºï¼å¯å
59å¨ä»¥åå
¶ä»ç硬件åç¼è¯å¨ä¼åã</li></ul><p>![ ][nbsp 2]</p><ul><li>ä»ä¸å¾æ¥çï¼çº¿ç¨Aä¸çº¿ç¨Bä¹é´å¦è¦éä¿¡çè¯ï¼å¿
é¡»è¦ç»åä¸é¢2个æ¥éª¤ï¼</li></ul><p><strong>1ã</strong> é¦å
ï¼çº¿ç¨Aææ¬å°å
åA䏿´æ°è¿çå
±äº«åéå·æ°å°ä¸»å
åä¸å»ï¼</p><p><strong>2ã</strong> ç¶åï¼çº¿ç¨Bå°ä¸»å
åä¸å»è¯»å线ç¨Aä¹åå·²æ´æ°è¿çå
±äº«åéï¼</p><p><strong>ä¸é¢éè¿ç¤ºæå¾æ¥è¯´æçº¿ç¨ä¹é´çéä¿¡</strong></p><p>![ ][nbsp 3]</p><ul><li>æ»ç»ï¼ä»ä¹æ¯Javaå
忍¡åï¼javaå
忍¡åç®ç§°jmmï¼å®ä¹äºä¸ä¸ªçº¿ç¨å¯¹å¦ä¸ä¸ªçº¿ç¨å¯è§ãå
±äº«åéåæ¾å¨ä¸»å
åä¸ï¼æ¯ä¸ªçº¿ç¨é½æèªå·±çæ¬å°å
åï¼å½å¤ä¸ªçº¿ç¨åæ¶è®¿é®ä¸ä¸ªæ°æ®çæ¶åï¼å¯è½æ¬å°å
åæ²¡æåæ¶å·æ°å°ä¸»å
åï¼æä»¥å°±ä¼åç线ç¨å®å
¨é®é¢ã</li></ul><h3 id="_4-å¦æå¯¹è±¡çå¼ç¨è¢«ç½®ä¸ºnull-å徿¶é卿¯å¦ä¼ç«å³éæ¾å¯¹è±¡å ç¨çå
å" tabindex="-1"><a class="header-anchor" href="#_4-å¦æå¯¹è±¡çå¼ç¨è¢«ç½®ä¸ºnull-å徿¶é卿¯å¦ä¼ç«å³éæ¾å¯¹è±¡å ç¨çå
å"><span>4. å¦æå¯¹è±¡çå¼ç¨è¢«ç½®ä¸ºnullï¼å徿¶é卿¯å¦ä¼ç«å³éæ¾å¯¹è±¡å ç¨çå
åï¼</span></a></h3><ul><li>ä¸ä¼ï¼å¨ä¸ä¸ä¸ªåå¾åè°å¨æä¸ï¼è¿ä¸ªå¯¹è±¡å°æ¯è¢«å¯åæ¶çã</li><li>
59ä¹å°±æ¯è¯´å¹¶ä¸ä¼ç«å³è¢«å徿¶éå¨ç«å»åæ¶ï¼èæ¯å¨ä¸ä¸æ¬¡åå¾åæ¶æ¶æä¼éæ¾å ¶å ç¨çå åã</li></ul><h3 id="_5-finalize-æ¹æ³ä»ä¹æ¶å被è°ç¨-ææå½æ°-finalization-çç®çæ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_5-finalize-æ¹æ³ä»ä¹æ¶å被è°ç¨-ææå½æ°-finalization-çç®çæ¯ä»ä¹"><span>5. finalize()æ¹æ³ä»ä¹æ¶å被è°ç¨ï¼ææå½æ°(finalization)çç®çæ¯ä»ä¹ï¼</span></a></h3><ul><li>åå¾åæ¶å¨ï¼garbage colectorï¼å³å®åæ¶æå¯¹è±¡æ¶ï¼å°±ä¼è¿è¡è¯¥å¯¹è±¡çfinalize()æ¹æ³ï¼finalizeæ¯Objectç±»çä¸ä¸ªæ¹æ³ï¼è¯¥æ¹æ³å¨Objectç±»ä¸ç声æprotected void finalize() throwsThrowable { } å¨åå¾åæ¶å¨æ§è¡æ¶ä¼è°ç¨è¢«åæ¶å¯¹è±¡çfinalize()æ¹æ³ï¼å¯ä»¥è¦çæ¤æ¹æ³æ¥å®ç°å¯¹å ¶èµæºçåæ¶ãæ³¨æï¼ä¸æ¦åå¾åæ¶å¨åå¤éæ¾å¯¹è±¡å ç¨çå åï¼å°é¦å è°ç¨è¯¥å¯¹è±¡çfinalize()æ¹æ³ï¼å¹¶ä¸ä¸ä¸æ¬¡åå¾åæ¶å¨ä½åçæ¶ï¼æçæ£åæ¶å¯¹è±¡å ç¨çå å空é´</li><li>GCæ¬æ¥å°±æ¯å ååæ¶äºï¼åºç¨è¿éè¦å¨finalizationåä»ä¹å¢ï¼ çæ¡æ¯å¤§é¨åæ¶åï¼ä»ä¹é½ä¸ç¨å(ä¹å°±æ¯ä¸éè¦éè½½)ãåªæå¨æäºå¾ç¹æ®çæ åµä¸ï¼æ¯å¦ä½ è°ç¨äºä¸äºnativeçæ¹æ³(ä¸è¬æ¯Cåç)ï¼å¯ä»¥è¦å¨finaliztionéå»è°ç¨Cç鿾彿°ã</li><li>Finalizetion主è¦ç¨æ¥éæ¾è¢«å¯¹è±¡å ç¨çèµæºï¼ä¸æ¯æå åï¼èæ¯æå ¶ä»èµæºï¼æ¯å¦æä»¶(FileHandle)ã端å£(ports)ãæ°æ®åºè¿æ¥(DB Connection)çï¼ãç¶èï¼å®ä¸è½çæ£ææå°å·¥ä½ã</li></ul><h3 id="_6-ä»ä¹æ¯éæåº" tabindex="-1"><a class="header-anchor" href="#_6-ä»ä¹æ¯éæåº"><span>6. ä»ä¹æ¯éæåº</span></a></h3><ul><li>ç¨åºæ§è¡çé¡ºåºæç §ä»£ç çå åé¡ºåºæ§è¡ã</li><li>ä¸è¬æ¥è¯´å¤çå¨ä¸ºäºæé«ç¨åºè¿è¡æçï¼å¯è½ä¼å¯¹è¾å ¥ä»£ç è¿è¡ä¼åï¼è¿è¡éæ°æåºï¼éæåºï¼ï¼å®ä¸ä¿è¯ç¨åºä¸å个è¯å¥çæ§è¡å å顺åºå代ç ä¸ç顺åºä¸è´ï¼ä½æ¯å®ä¼ä¿è¯ç¨åºæç»æ§è¡ç»æå代ç é¡ºåºæ§è¡çç»ææ¯ä¸è´çã</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> a </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //è¯å¥1</span></span> 60<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> r </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //è¯å¥2</span></span> 61<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">a </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> a </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //è¯å¥3</span></span> 62<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">r </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> a</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">*</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //è¯å¥4</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul><li>åå 为éæåºï¼ä»è¿å¯è½æ§è¡é¡ºåºä¸ºï¼è¿éæ æ³¨çæ¯è¯å¥çæ§è¡é¡ºåºï¼ 2-1-3-4ï¼1-3-2-4 ä½ç»ä¸å¯è½ 2-1-4-3ï¼å ä¸ºè¿æç ´äºä¾èµå ³ç³»ã</li><li>æ¾ç¶éæåºå¯¹å线ç¨è¿è¡æ¯ä¸ä¼æä»»ä½é®é¢ï¼ä½æ¯å¤çº¿ç¨å°±ä¸ä¸å®äºï¼æä»¥æä»¬å¨å¤çº¿ç¨ç¼ç¨æ¶å°±å¾èèè¿ä¸ªé®é¢äºã</li></ul><h3 id="_7-éæåºå®é æ§è¡çæä»¤æ¥éª¤" tabindex="-1"><a class="header-anchor" href="#_7-éæåºå®é æ§è¡çæä»¤æ¥éª¤"><span>7. éæåºå®é æ§è¡çæä»¤æ¥éª¤</span></a></h3><p>![ ][nbsp 4]</p><p><strong>1ã</strong> ç¼è¯å¨ä¼åçéæåºç¼è¯å¨å¨ä¸æ¹åå线ç¨ç¨åºè¯ä¹çåæä¸ï¼å¯ä»¥éæ°å®æè¯å¥çæ§è¡é¡ºåºï¼</p><p><strong>2ã</strong> æä»¤çº§å¹¶è¡çéæåºç°ä»£å¤çå¨éç¨äºæä»¤çº§å¹¶è¡ææ¯ï¼ILPï¼æ¥å°å¤æ¡æä»¤éå æ§è¡å¦æä¸ï¼å卿°æ®ä¾èµæ§ï¼å¤çå¨å¯ä»¥æ¹åè¯å¥å¯¹åºæºå¨æä»¤çæ§è¡é¡ºåºã</p><p><strong>3ã</strong> å åç³»ç»çéæåºç±äºå¤çå¨ä½¿ç¨ç¼åå读/åç¼å²åºï¼è¿ä½¿å¾å è½½åå卿ä½çä¸å»å¯è½æ¯å¨ï¼ä¹±åºæ§è¡ã</p><ul><li>è¿äºéæåºå¯¹äºåçº¿ç¨æ²¡é®é¢ï¼ä½æ¯å¤çº¿ç¨é½å¯è½ä¼å¯¼è´å¤çº¿ç¨ç¨åºåºç°å åå¯è§æ§é®é¢ã</li></ul><h3 id="_8-éæåºéµå®çè§å" tabindex="-1"><a class="header-anchor" href="#_8-éæåºéµå®çè§å"><span>8. éæåºéµå®çè§å</span></a></h3><ul><li>as-if-serialï¼</li></ul><p><strong>1ã</strong> ä¸ç®¡æä¹æåºï¼ç»æä¸è½æ¹åï¼</p><p><strong>2ã</strong> ä¸å卿°æ®ä¾èµçå¯ä»¥è¢«ç¼è¯å¨åå¤çå¨éæåºï¼</p><p><strong>3ã</strong>
62 ä¸ä¸ªæä½ä¾èµä¸¤ä¸ªæä½ï¼è¿ä¸¤ä¸ªæä½å¦æä¸åå¨ä¾èµå¯ä»¥éæåºï¼</p><p><strong>4ã</strong> åçº¿ç¨æ ¹æ®æ¤è§åä¸ä¼æé®é¢ï¼ä½æ¯éæåºåå¤çº¿ç¨ä¼æé®é¢ï¼</p><h3 id="_9-as-if-serialè§ååhappens-beforeè§åçåºå«" tabindex="-1"><a class="header-anchor" href="#_9-as-if-serialè§ååhappens-beforeè§åçåºå«"><span>9. as-if-serialè§ååhappens-beforeè§åçåºå«</span></a></h3><ul><li>as-if-serialè¯ä¹ä¿è¯å线ç¨å ç¨åºçæ§è¡ç»æä¸è¢«æ¹åï¼happens-beforeå ³ç³»ä¿è¯æ£ç¡®åæ¥çå¤çº¿ç¨ç¨åºçæ§è¡ç»æä¸è¢«æ¹åã</li><li>as-if-serialè¯ä¹ç»ç¼åå线ç¨ç¨åºçç¨åºååé äºä¸ä¸ªå¹»å¢ï¼å线ç¨ç¨åºæ¯æç¨åºçé¡ºåºæ¥æ§è¡çãhappens-beforeå ³ç³»ç»ç¼åæ£ç¡®åæ¥çå¤çº¿ç¨ç¨åºçç¨åºååé äºä¸ä¸ªå¹»å¢ï¼æ£ç¡®åæ¥çå¤çº¿ç¨ç¨åºæ¯æhappens-beforeæå®çé¡ºåºæ¥æ§è¡çã</li><li>as-if-serialè¯ä¹åhappens-beforeè¿ä¹åçç®çï¼é½æ¯ä¸ºäºå¨ä¸æ¹åç¨åºæ§è¡ç»æçåæä¸ï¼å°½å¯è½å°æé«ç¨åºæ§è¡çå¹¶è¡åº¦ã</li></ul><h3 id="_10-å¹¶åå ³é®å-synchronized" tabindex="-1"><a class="header-anchor" href="#_10-å¹¶åå ³é®å-synchronized"><span>10. å¹¶åå ³é®å synchronized ï¼</span></a></h3><ul><li>å¨ Java ä¸ï¼synchronized å ³é®åæ¯ç¨æ¥æ§å¶çº¿ç¨åæ¥çï¼å°±æ¯å¨å¤çº¿ç¨çç¯å¢ä¸ï¼æ§å¶synchronized ä»£ç æ®µä¸è¢«å¤ä¸ªçº¿ç¨åæ¶æ§è¡ãsynchronized å¯ä»¥ä¿®é¥°ç±»ãæ¹æ³ãåéã</li><li>å¦å¤ï¼å¨ Java æ©æçæ¬ä¸ï¼synchronizedå±äºéé级éï¼æçä½ä¸ï¼å 为çè§å¨éï¼monitorï¼æ¯ä¾èµäºåºå±çæä½ç³»ç»ç Mutex Lock æ¥å®ç°çï¼Java ççº¿ç¨æ¯æ å°å°æä½ç³»ç»çåç线ç¨ä¹ä¸çãå¦æè¦æèµ·æè å¤éä¸ä¸ªçº¿ç¨ï¼é½éè¦æä½ç³»ç»å¸®å¿å®æï¼èæä½ç³»ç»å®ç°çº¿ç¨ä¹é´ç忢æ¶éè¦ä»ç¨æ·æè½¬æ¢å°å æ ¸æï¼è¿ä¸ªç¶æä¹é´ç转æ¢éè¦ç¸å¯¹æ¯è¾é¿çæ¶é´ï¼æ¶é´ææ¬ç¸å¯¹è¾é«ï¼è¿ä¹æ¯ä¸ºä»ä¹æ©æç synchronized æçä½çåå ãåºå¹¸çæ¯å¨ Java 6 ä¹å Java 宿¹å¯¹ä» JVM å±é¢å¯¹synchronized è¾å¤§ä¼åï¼æä»¥ç°å¨ç synchronized éæçä¹ä¼åå¾å¾ä¸éäºãJDK1.6对éçå®ç°å¼å ¥äºå¤§éçä¼åï¼å¦èªæéãéåºæ§èªæéãéæ¶é¤ãéç²åãååéãè½»é级éçææ¯æ¥åå°éæä½çå¼éã</li></ul><p>为äºå¸®å©æ´å¤çç²ä¸æåï¼æ¾å°ä¸ªå¥½å·¥ä½ï¼å¤æ¿å 个offerãè䏿è¿å»ºä¸äºå·¥ä½å æ¨ç¾¤ï¼ç¾¤éç®åå·²ç»æ¶éäºå¾å¤å æ¨å²ä½ï¼å¤§åãä¸åãå°åãå¤å é½æãæ¬¢è¿HRãå¼åãæµè¯ãè¿ç»´å产åå å ¥ã</p><img src="https://web-1259428203.cos.ap-chengdu.myqcloud.com/20250305093506862.png" width="240" height="350"><p>æ«æä¸æ¹å¾®ä¿¡ï¼å¤æ³¨ï¼ç½ç«+æå¨åå¸ï¼å³å¯æä½ è¿å·¥ä½å æ¨ç¾¤ã</p><img src="https://web-1259428203.cos.ap-chengdu.myqcloud.com/WX20250509-190407%402x.png" width="180" height="200"><h3 id="_11-说说èªå·±æ¯æä¹ä½¿ç¨-synchronized-å ³é®å-å¨é¡¹ç®ä¸ç¨å°äºå" tabindex="-1"><a class="header-anchor" href="#_11-说说èªå·±æ¯æä¹ä½¿ç¨-synchronized-å ³é®å-å¨é¡¹ç®ä¸ç¨å°äºå"><span>11. 说说èªå·±æ¯æä¹ä½¿ç¨ synchronized å ³é®åï¼å¨é¡¹ç®ä¸ç¨å°äºå</span></a></h3><p><strong>synchronizedå ³é®åæä¸»è¦çä¸ç§ä½¿ç¨æ¹å¼ï¼</strong></p><ul><li>修饰å®ä¾æ¹æ³: ä½ç¨äºå½å对象å®ä¾å éï¼è¿å ¥åæ¥ä»£ç åè¦è·å¾å½å对象å®ä¾çé</li><li>ä¿®é¥°éææ¹æ³: ä¹å°±æ¯ç»å½åç±»å éï¼ä¼ä½ç¨äºç±»çææå¯¹è±¡å®ä¾ï¼å ä¸ºéææåä¸å±äºä»»ä½ä¸ä¸ªå®ä¾å¯¹è±¡ï¼æ¯ç±»æåï¼ static 表æè¿æ¯è¯¥ç±»çä¸ä¸ªéæèµæºï¼ä¸ç®¡newäºå¤å°ä¸ªå¯¹è±¡ï¼åªæä¸ä»½ï¼ãæä»¥å¦æä¸ä¸ªçº¿ç¨Aè°ç¨ä¸ä¸ªå®ä¾å¯¹è±¡çééæ synchronized æ¹æ³ï¼è线ç¨Béè¦è°ç¨è¿ä¸ªå®ä¾å¯¹è±¡æå±ç±»çéæ synchronized æ¹æ³ï¼æ¯å 许çï¼ä¸ä¼åçäºæ¥ç°è±¡ï¼å 为访é®éæsynchronized æ¹æ³å ç¨ç鿝å½åç±»çéï¼è访é®ééæ synchronized æ¹æ³å ç¨ç鿝å½åå®ä¾å¯¹è±¡éã</li><li>修饰代ç å: æå®å é对象ï¼å¯¹ç»å®å¯¹è±¡å éï¼è¿å ¥åæ¥ä»£ç åºåè¦è·å¾ç»å®å¯¹è±¡çéã</li></ul><p>æ»ç»ï¼synchronized å ³é®åå å° static éææ¹æ³å synchronized(class)代ç åä¸é½æ¯æ¯ç» Classç±»ä¸éãsynchronized å ³é®åå å°å®ä¾æ¹æ³ä¸æ¯ç»å¯¹è±¡å®ä¾ä¸éãå°½éä¸è¦ä½¿ç¨ synchronized(Stringa)å 为JVMä¸ï¼åç¬¦ä¸²å¸¸éæ± å ·æç¼ååè½ï¼</p><h3 id="_12-å便¨¡å¼äºè§£å-ç»æè§£éä¸ä¸å鿣éªéæ¹å¼å®ç°å便¨¡å¼" tabindex="-1"><a class="header-anchor" href="#_12-å便¨¡å¼äºè§£å-ç»æè§£éä¸ä¸å鿣éªéæ¹å¼å®ç°å便¨¡å¼"><span>12. å便¨¡å¼äºè§£åï¼ç»æè§£éä¸ä¸å鿣éªéæ¹å¼å®ç°å便¨¡å¼ï¼â</span></a></h3><p>**åéæ ¡éªéå®ç°å¯¹è±¡åä¾ï¼çº¿ç¨å®å ¨ï¼è¯´æï¼**åéæºå¶çåºç°æ¯ä¸ºäºè§£å³åé¢åæ¥é®é¢åæ§è½é®é¢ï¼çä¸é¢ç代ç ï¼ç®ååæä¸ç¡®å®æ¯è§£å³äºå¤çº¿ç¨å¹¶è¡è¿æ¥ä¸ä¼åºç°éå¤new对象ï¼èä¸ä¹å®ç°äºæå è½½</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Singleton</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 63<span class="line"></span> 64<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> volatile</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> static</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Singleton</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> uniqueInstance</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 65<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> Singleton</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 66<span class="line"></span> 67<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 68<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> static</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Singleton</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> getUniqueInstance</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 69<span class="line"></span> 70<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //å å¤æå¯¹è±¡æ¯å¦å·²ç»å®ä¾è¿ï¼æ²¡æå®ä¾åè¿æè¿å ¥å é代ç </span></span> 71<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (uniqueInstance </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> null</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">) {</span></span> 72<span class="line"></span> 73<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //类对象å é</span></span> 74<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> synchronized</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">Singleton</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">) {</span></span> 75<span class="line"></span> 76<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (uniqueInstance </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> null</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">) {</span></span> 77<span class="line"></span> 78<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> uniqueInstance </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">=</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> Singleton</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span></span> 79<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 80<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 81<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 82<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> uniqueInstance;</span></span> 83<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 84<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>å¦å¤ï¼éè¦æ³¨æ uniqueInstance éç¨ volatile å ³é®åä¿®é¥°ä¹æ¯å¾æå¿ è¦ã</p><ul><li>uniqueInstance éç¨ volatile å ³é®åä¿®é¥°ä¹æ¯å¾æå¿ è¦çï¼ uniqueInstance = new Singleton();è¿æ®µä»£ç å ¶å®æ¯åä¸ºä¸æ¥æ§è¡ï¼</li></ul><p><strong>1ã</strong> 为uniqueInstanceåé å å空é´ï¼</p><p><strong>2ã</strong> åå§åuniqueInstanceï¼</p><p><strong>3ã</strong> å°uniqueInstanceæååé çå åå°åï¼</p><p>使¯ç±äº JVM å ·ææä»¤éæçç¹æ§ï¼æ§è¡é¡ºåºæå¯è½åæ 1->3->2ãæä»¤éæå¨å线ç¨ç¯å¢ä¸ä¸ä¼åºç°é®é¢ï¼ä½æ¯å¨å¤çº¿ç¨ç¯å¢ä¸ä¼å¯¼è´ä¸ä¸ªçº¿ç¨è·å¾è¿æ²¡æåå§åçå®ä¾ãä¾å¦ï¼çº¿ç¨ T1 æ§è¡äº 1 å 3ï¼æ¤æ¶ T2 è°ç¨getUniqueInstance() ååç° uniqueInstance ä¸ä¸ºç©ºï¼å æ¤è¿å uniqueInstanceï¼ä½æ¤æ¶uniqueInstance è¿æªè¢«åå§åã使ç¨volatile å¯ä»¥ç¦æ¢ JVM çæä»¤éæï¼ä¿è¯å¨å¤çº¿ç¨ç¯å¢ä¸ä¹è½æ£å¸¸è¿è¡ã</p><h3 id="_13-说ä¸ä¸-synchronized-åºå±å®ç°åç" tabindex="-1"><a class="header-anchor" href="#_13-说ä¸ä¸-synchronized-åºå±å®ç°åç"><span>13. 说ä¸ä¸ synchronized åºå±å®ç°åçï¼</span></a></h3><ul><li>Synchronizedçè¯ä¹åºå±æ¯éè¿ä¸ä¸ªmonitorï¼çè§å¨éï¼ç对象æ¥å®æï¼æ¯ä¸ªå¯¹è±¡æä¸ä¸ªçè§å¨é(monitor)ãæ¯ä¸ªSynchronized修饰
84è¿ç代ç å½å®çmonitor被å ç¨æ¶å°±</li><li>ä¼å¤äºéå®ç¶æå¹¶ä¸å°è¯è·åmonitorçæææ ï¼è¿ç¨ï¼</li></ul><p><strong>1ã</strong> 妿monitorçè¿å
¥æ°ä¸º0ï¼å该线ç¨è¿å
¥monitorï¼ç¶åå°è¿å
¥æ°è®¾ç½®ä¸º1ï¼è¯¥çº¿ç¨å³ä¸ºï¼monitorçææè
ã</p><p><strong>2ã</strong> å¦æçº¿ç¨å·²ç»å æè¯¥monitorï¼åªæ¯éæ°è¿å
¥ï¼åè¿å
¥monitorçè¿å
¥æ°å 1.ï¼</p><p><strong>3ã</strong> 妿å
¶ä»çº¿ç¨å·²ç»å ç¨äºmonitorï¼å该线ç¨è¿å
¥é»å¡ç¶æï¼ç´å°monitorçè¿å
¥æ°ä¸º0ï¼åï¼éæ°å°è¯è·åmonitorçæææã</p><p>synchronizedæ¯å¯ä»¥éè¿ åæ±ç¼æä»¤ javapå½ä»¤ï¼æ¥çç¸åºçåèç æä»¶ã</p><h3 id="_14-synchronizedå¯éå
¥çåç" tabindex="-1"><a class="header-anchor" href="#_14-synchronizedå¯éå
¥çåç"><span>14. synchronizedå¯éå
¥çåç</span></a></h3><ul><li>éå
¥éæ¯æä¸ä¸ªçº¿ç¨è·åå°è¯¥éä¹åï¼è¯¥çº¿ç¨å¯ä»¥ç»§ç»è·å¾è¯¥éãåºå±åçç»´æ¤ä¸ä¸ªè®¡æ°å¨ï¼å½çº¿ç¨è·åè¯¥éæ¶ï¼è®¡æ°å¨å ä¸ï¼å次è·å¾è¯¥éæ¶ç»§ç»å ä¸ï¼éæ¾éæ¶ï¼è®¡æ°å¨åä¸ï¼å½è®¡æ°å¨å¼ä¸º0æ¶ï¼è¡¨æè¯¥éæªè¢«ä»»ä½çº¿ç¨æææï¼å
¶å®çº¿ç¨å¯ä»¥ç«äºè·åéã</li></ul><h3 id="_15-ä»ä¹æ¯èªæ" tabindex="-1"><a class="header-anchor" href="#_15-ä»ä¹æ¯èªæ"><span>15. ä»ä¹æ¯èªæ</span></a></h3><ul><li>å¾å¤ synchronized éé¢ç代ç åªæ¯ä¸äºå¾ç®åç代ç ï¼æ§è¡æ¶é´éå¸¸å¿«ï¼æ¤æ¶çå¾
ç线ç¨é½å éå¯è½æ¯ä¸ç§ä¸å¤ªå¼å¾çæä½ï¼å 为线ç¨é»å¡æ¶åå°ç¨æ·æåå
æ ¸æåæ¢çé®é¢ãæ¢ç¶synchronized éé¢çä»£ç æ§è¡å¾é常快ï¼ä¸å¦¨è®©çå¾
éç线ç¨ä¸è¦è¢«é»å¡ï¼èæ¯å¨ synchronizedçè¾¹çåå¿å¾ªç¯ï¼è¿å°±æ¯èªæã妿åäºå¤æ¬¡å¾ªç¯åç°è¿æ²¡æè·å¾éï¼åé»å¡ï¼è¿æ ·å¯è½æ¯ä¸ç§æ´å¥½ççç¥ã</li><li>å¿å¾ªç¯ï¼å°±æ¯ç¨åºåç¨å¾ªç¯è®©ä¸ä¸ªçº¿ç¨çå¾
ï¼ä¸åä¼ ç»æ¹æ³wait(), sleep() æ yield() å®ä»¬é½æ¾å¼äºCPUæ§å¶ï¼èå¿å¾ªç¯ä¸ä¼æ¾å¼CPUï¼å®å°±æ¯å¨è¿è¡ä¸ä¸ªç©ºå¾ªç¯ãè¿ä¹åçç®çæ¯ä¸ºäºä¿çCPUç¼åï¼å¨å¤æ ¸ç³»ç»ä¸ï¼ä¸ä¸ªçå¾
线ç¨éæ¥çæ¶åå¯è½ä¼å¨å¦ä¸ä¸ªå
æ ¸è¿è¡ï¼è¿æ ·ä¼é建ç¼åã为äºé¿å
é建ç¼åååå°çå¾
éå»ºçæ¶é´å°±å¯ä»¥ä½¿ç¨å®äºã</li></ul><h3 id="_16-å¤çº¿ç¨ä¸-synchronized-éå级çåçæ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_16-å¤çº¿ç¨ä¸-synchronized-éå级çåçæ¯ä»ä¹"><span>16. å¤çº¿ç¨ä¸ synchronized éå级çåçæ¯ä»ä¹ï¼</span></a></h3><ul><li>synchronized éå级åçï¼å¨é对象ç对象头é颿ä¸ä¸ª threadid åæ®µï¼å¨ç¬¬ä¸æ¬¡è®¿é®çæ¶åthreadid 为空ï¼jvm 让å
¶ææååéï¼å¹¶å° threadid 设置为å
¶çº¿ç¨ idï¼å次è¿å
¥çæ¶åä¼å
夿threadid æ¯å¦ä¸å
¶çº¿ç¨ id ä¸è´ï¼å¦æä¸è´åå¯ä»¥ç´æ¥ä½¿ç¨æ¤å¯¹è±¡ï¼å¦æä¸ä¸è´ï¼åå级ååé为轻é级éï¼éè¿èªæå¾ªç¯ä¸å®æ¬¡æ°æ¥è·åéï¼æ§è¡ä¸å®æ¬¡æ°ä¹åï¼å¦æè¿æ²¡ææ£å¸¸è·åå°è¦ä½¿ç¨çå¯¹è±¡ï¼æ¤æ¶å°±ä¼æéä»è½»é级å级为éé级éï¼æ¤è¿ç¨å°±ææäº synchronized éçå级ã</li></ul><p>éçå级çç®çï¼éå级æ¯ä¸ºäºåä½äºé带æ¥çæ§è½æ¶èãå¨ Java 6 ä¹åä¼å synchronized çå®ç°æ¹å¼ï¼ä½¿ç¨äºååéå级为轻é级éåå级å°éé级éçæ¹å¼ï¼ä»èåä½äºé带æ¥çæ§è½æ¶èã</p><ul><li>ååéï¼é¡¾åæä¹ï¼å®ä¼ååäºç¬¬ä¸ä¸ªè®¿é®éç线ç¨ï¼å¦æå¨è¿è¡è¿ç¨ä¸ï¼åæ¥éåªæä¸ä¸ªçº¿ç¨è®¿é®ï¼ä¸åå¨å¤çº¿ç¨äºç¨çæ
åµï¼åçº¿ç¨æ¯ä¸éè¦è§¦å忥çï¼åå°å éï¼è§£éçä¸äºCASæä½ï¼æ¯å¦çå¾
éåçä¸äºCASæä½ï¼ï¼è¿ç§æ
åµä¸ï¼å°±ä¼ç»çº¿ç¨å ä¸ä¸ªååéã 妿å¨è¿è¡è¿ç¨ä¸ï¼éå°äºå
¶ä»çº¿ç¨æ¢å éï¼åææååéç线ç¨ä¼è¢«æèµ·ï¼JVM伿¶é¤å®èº«ä¸çååéï¼å°éæ¢å¤å°æ åçè½»é级éã</li><li>è½»éçº§éæ¯ç±ååæå级æ¥çï¼ååéè¿è¡å¨ä¸ä¸ªçº¿ç¨è¿å
¥åæ¥åçæ
åµä¸ï¼å½ç¬¬äºä¸ªçº¿ç¨å å
¥éäºç¨çæ¶åï¼è½»é级éå°±ä¼å级为éé级éï¼</li><li>ééçº§éæ¯synchronized ï¼æ¯ Java èææºä¸æä¸ºåºç¡çéå®ç°ãå¨è¿ç§ç¶æä¸ï¼Java èææºä¼é»å¡å é失败ç线ç¨ï¼å¹¶ä¸å¨ç®æ éè¢«éæ¾çæ¶åï¼å¤éè¿äºçº¿ç¨ã</li></ul><h3 id="_17-线ç¨-b-æä¹ç¥é线ç¨-a-ä¿®æ¹äºåé" tabindex="-1"><a class="header-anchor" href="#_17-线ç¨-b-æä¹ç¥é线ç¨-a-ä¿®æ¹äºåé"><span>17. çº¿ç¨ B æä¹ç¥éçº¿ç¨ A ä¿®æ¹äºåé</span></a></h3><p>ï¼1ï¼volatile 修饰åéï¼2ï¼synchronized 修饰修æ¹åéçæ¹æ³ï¼3ï¼wait/notifyï¼4ï¼while 轮询</p><h3 id="_18-å½ä¸ä¸ªçº¿ç¨è¿å
¥ä¸ä¸ªå¯¹è±¡ç-synchronized-æ¹æ³-a-ä¹å-å
¶å®çº¿ç¨æ¯å¦å¯è¿å
¥æ¤å¯¹è±¡ç-synchronized-æ¹æ³-b" tabindex="-1"><a class="header-anchor" href="#_18-å½ä¸ä¸ªçº¿ç¨è¿å
¥ä¸ä¸ªå¯¹è±¡ç-synchronized-æ¹æ³-a-ä¹å-å
¶å®çº¿ç¨æ¯å¦å¯è¿å
¥æ¤å¯¹è±¡ç-synchronized-æ¹æ³-b"><span>18. å½ä¸ä¸ªçº¿ç¨è¿å
¥ä¸ä¸ªå¯¹è±¡ç synchronized æ¹æ³ A ä¹åï¼å
¶å®çº¿ç¨æ¯å¦å¯è¿å
¥æ¤å¯¹è±¡ç synchronized æ¹æ³ Bï¼</span></a></h3><ul><li>ä¸è½ãå
¶å®çº¿ç¨åªè½è®¿é®è¯¥å¯¹è±¡çéåæ¥æ¹æ³ï¼åæ¥æ¹æ³åä¸è½è¿å
¥ã
84å 为ééææ¹æ³ä¸çsynchronized ä¿®é¥°ç¬¦è¦æ±æ§è¡æ¹æ³æ¶è¦è·å¾å¯¹è±¡çéï¼å¦æå·²ç»è¿å
¥A æ¹æ³è¯´æå¯¹è±¡éå·²ç»è¢«åèµ°ï¼é£ä¹è¯å¾è¿å
¥ B æ¹æ³ç线ç¨å°±åªè½å¨çéæ± ï¼æ³¨æä¸æ¯çå¾
æ± å¦ï¼ä¸çå¾
对象çéã</li></ul><h3 id="_19-synchronizedãvolatileãcas-æ¯è¾" tabindex="-1"><a class="header-anchor" href="#_19-synchronizedãvolatileãcas-æ¯è¾"><span>19. synchronizedãvolatileãCAS æ¯è¾</span></a></h3><p>ï¼1ï¼synchronized æ¯æ²è§éï¼å±äºæ¢å å¼ï¼ä¼å¼èµ·å
¶ä»çº¿ç¨é»å¡ãï¼2ï¼volatile æä¾å¤çº¿ç¨å
±äº«åéå¯è§æ§åç¦æ¢æä»¤éæåºä¼åãï¼3ï¼CAS æ¯åºäºå²çªæ£æµçä¹è§éï¼éé»å¡ï¼</p><h3 id="_20-synchronized-å-lock-æä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_20-synchronized-å-lock-æä»ä¹åºå«"><span>20. synchronized å Lock æä»ä¹åºå«ï¼</span></a></h3><ul><li>é¦å
synchronizedæ¯Javaå
ç½®å
³é®åï¼å¨JVMå±é¢ï¼Lockæ¯ä¸ªJavaç±»ï¼</li><li>synchronized å¯ä»¥ç»ç±»ãæ¹æ³ã代ç åå éï¼è lock åªè½ç»ä»£ç åå éã</li><li>synchronized ä¸éè¦æå¨è·åéåéæ¾éï¼ä½¿ç¨ç®åï¼åçå¼å¸¸ä¼èªå¨éæ¾éï¼ä¸ä¼é ææ»éï¼è lock éè¦èªå·±å éåéæ¾éï¼å¦æä½¿ç¨ä¸å½æ²¡æ unLock()å»éæ¾éå°±ä¼é ææ»éã</li><li>éè¿ Lock å¯ä»¥ç¥éææ²¡ææåè·åéï¼è synchronized å´æ æ³åå°ã</li></ul><h3 id="_21-synchronized-å-reentrantlock-åºå«æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_21-synchronized-å-reentrantlock-åºå«æ¯ä»ä¹"><span>21. synchronized å ReentrantLock åºå«æ¯ä»ä¹ï¼</span></a></h3><ul><li>synchronized æ¯å ifãelseãforãwhile 䏿 ·çå
³é®åï¼ReentrantLock æ¯ç±»ï¼è¿æ¯äºè
çæ¬è´¨åºå«ãæ¢ç¶ ReentrantLock æ¯ç±»ï¼é£ä¹å®å°±æä¾äºæ¯synchronized æ´å¤æ´çµæ´»çç¹æ§ï¼å¯ä»¥è¢«ç»§æ¿ãå¯ä»¥ææ¹æ³ãå¯ä»¥æåç§åæ ·çç±»åé</li><li>synchronized æ©æçå®ç°æ¯è¾ä½æï¼å¯¹æ¯ ReentrantLockï¼å¤§å¤æ°åºæ¯æ§è½é½ç¸å·®è¾å¤§ï¼ä½æ¯å¨Java 6 ä¸å¯¹ synchronized è¿è¡äºé常å¤çæ¹è¿ã</li><li>ç¸åç¹ï¼ä¸¤è
齿¯å¯éå
¥é</li></ul><p>两è
齿¯å¯éå
¥éãâå¯éå
¥éâæ¦å¿µæ¯ï¼èªå·±å¯ä»¥å次è·åèªå·±çå
é¨éãæ¯å¦ä¸ä¸ªçº¿ç¨è·å¾äºæä¸ªå¯¹è±¡çéï¼æ¤æ¶è¿ä¸ªå¯¹è±¡éè¿æ²¡æéæ¾ï¼å½å
¶å次æ³è¦è·åè¿ä¸ªå¯¹è±¡çéçæ¶åè¿æ¯å¯ä»¥è·åçï¼å¦æä¸å¯ééå
¥çè¯ï¼å°±ä¼é ææ»éãåä¸ä¸ªçº¿ç¨æ¯æ¬¡è·åéï¼éç计æ°å¨é½èªå¢1ï¼æä»¥è¦çå°éç计æ°å¨ä¸é为0æ¶æè½éæ¾éã</p><ul><li>主è¦åºå«å¦ä¸ï¼ReentrantLock 使ç¨èµ·æ¥æ¯è¾çµæ´»ï¼ä½æ¯å¿
é¡»æéæ¾éçé
åå¨ä½ï¼ReentrantLock å¿
é¡»æå¨è·åä¸éæ¾éï¼è synchronized ä¸éè¦æå¨éæ¾åå¼å¯éï¼ReentrantLock åªéç¨äºä»£ç åéï¼è synchronized å¯ä»¥ä¿®é¥°ç±»ãæ¹æ³ãåéçãäºè
çéæºå¶å
¶å®ä¹æ¯ä¸ä¸æ ·çãReentrantLock åºå±è°ç¨çæ¯ Unsafe çpark æ¹æ³å éï¼synchronized æä½çåºè¯¥æ¯å¯¹è±¡å¤´ä¸ mark word</li><li>Java䏿¯ä¸ä¸ªå¯¹è±¡é½å¯ä»¥ä½ä¸ºéï¼è¿æ¯synchronizedå®ç°åæ¥çåºç¡ï¼æ®éåæ¥æ¹æ³ï¼éæ¯å½åå®ä¾å¯¹è±¡éæåæ¥æ¹æ³ï¼éæ¯å½åç±»çclasså¯¹è±¡åæ¥æ¹æ³åï¼éæ¯æ¬å·éé¢ç对象</li></ul><h3 id="_22-volatile-å
³é®åçä½ç¨" tabindex="-1"><a class="header-anchor" href="#_22-volatile-å
³é®åçä½ç¨"><span>22. volatile å
³é®åçä½ç¨</span></a></h3><ul><li>对äºå¯è§æ§ï¼Java æä¾äº volatile å
³é®åæ¥ä¿è¯å¯è§æ§åç¦æ¢æä»¤éæã volatile æä¾ happensbefore çä¿è¯ï¼ç¡®ä¿ä¸ä¸ªçº¿ç¨çä¿®æ¹è½å¯¹å
¶ä»çº¿ç¨æ¯å¯è§çãå½ä¸ä¸ªå
±äº«åé被 volatile 修饰æ¶ï¼å®ä¼ä¿è¯ä¿®æ¹çå¼ä¼ç«å³è¢«æ´æ°å°ä¸»å
åä¸ï¼å½æå
¶ä»çº¿ç¨éè¦è¯»åæ¶ï¼å®ä¼å»å
åä¸è¯»åæ°å¼ã</li><li>ä»å®è·µè§åº¦èè¨ï¼volatile çä¸ä¸ªéè¦ä½ç¨å°±æ¯å CAS ç»åï¼ä¿è¯äºååæ§ï¼è¯¦ç»çå¯ä»¥åè§java.util.concurrent.atomic å
ä¸çç±»ï¼æ¯å¦ AtomicIntegerã</li><li>volatile 常ç¨äºå¤çº¿ç¨ç¯å¢ä¸ç忬¡æä½(忬¡è¯»æè
忬¡å)ã</li></ul><h3 id="_23-java-ä¸è½å建-volatile-æ°ç»å" tabindex="-1"><a class="header-anchor" href="#_23-java-ä¸è½å建-volatile-æ°ç»å"><span>23. Java ä¸è½å建 volatile æ°ç»åï¼</span></a></h3><ul><li>è½ï¼Java ä¸å¯ä»¥å建 volatile ç±»åæ°ç»ï¼ä¸è¿åªæ¯ä¸ä¸ªæåæ°ç»çå¼ç¨ï¼è䏿¯æ´ä¸ªæ°ç»ãæææ¯ï¼å¦ææ¹åå¼ç¨æåçæ°ç»ï¼å°ä¼åå° volatile çä¿æ¤ï¼ä½æ¯å¦æå¤ä¸ªçº¿ç¨åæ¶æ¹åæ°ç»çå
ç´ ï¼volatile æ 示符就ä¸è½èµ·å°ä¹åçä¿æ¤ä½ç¨äºã</li></ul><h3 id="_24-volatile-åéå-atomic-åéæä»ä¹ä¸å" tabindex="-1"><a class="header-anchor" href="#_24-volatile-åéå-atomic-åéæä»ä¹ä¸å"><span>24. volatile åéå atomic åéæä»ä¹ä¸åï¼</span></a></h3><ul><li>volatile åéå¯ä»¥ç¡®ä¿å
è¡å
³ç³»ï¼å³åæä½ä¼åçå¨åç»ç读æä½ä¹å, ä½å®å¹¶ä¸è½ä¿è¯ååæ§ãä¾å¦ç¨ volatile 修饰 count åéï¼é£ä¹ count++ æä½å°±ä¸æ¯ååæ§çã</li><li>è AtomicInteger ç±»æä¾ç atomic æ¹æ³å¯ä»¥è®©è¿ç§æä½å
·æååæ§å¦getAndIncrement()æ¹æ³ä¼ååæ§çè¿è¡å¢éæä½æå½åå¼å ä¸ï¼å
¶å®æ°æ®ç±»ååå¼ç¨åéä¹å¯ä»¥è¿è¡ç¸ä¼¼æä½ã</li></ul><h3 id="_25-volatile-è½ä½¿å¾ä¸ä¸ªéååæä½åæååæä½å" tabindex="-1"><a class="header-anchor" href="#_25-volatile-è½ä½¿å¾ä¸ä¸ªéååæä½åæååæä½å"><span>25. volatile è½ä½¿å¾ä¸ä¸ªéååæä½åæååæä½åï¼</span></a></h3><ul><li>
84å
³é®åvolatileç主è¦ä½ç¨æ¯ä½¿åéå¨å¤ä¸ªçº¿ç¨é´å¯è§ï¼ä½æ æ³ä¿è¯ååæ§ï¼å¯¹äºå¤ä¸ªçº¿ç¨è®¿é®åä¸ä¸ªå®ä¾åééè¦å éè¿è¡åæ¥ã</li><li>è½ç¶volatileåªè½ä¿è¯å¯è§æ§ä¸è½ä¿è¯ååæ§ï¼ä½ç¨volatile修饰longådoubleå¯ä»¥ä¿è¯å
¶æä½ååæ§ã</li></ul><p><strong>æä»¥ä»Oracle Java Specéé¢å¯ä»¥çå°ï¼</strong></p><ul><li>对äº64ä½çlongådoubleï¼å¦ææ²¡æè¢«volatile修饰ï¼é£ä¹å¯¹å
¶æä½å¯ä»¥ä¸æ¯ååçã卿ä½çæ¶åï¼å¯ä»¥åæä¸¤æ¥ï¼æ¯æ¬¡å¯¹32使ä½ã</li><li>å¦æä½¿ç¨volatile修饰longådoubleï¼é£ä¹å
¶è¯»å齿¯ååæä½</li><li>对äº64ä½çå¼ç¨å°åç读åï¼é½æ¯ååæä½</li><li>å¨å®ç°JVMæ¶ï¼å¯ä»¥èªç±éæ©æ¯å¦æè¯»ålongådoubleä½ä¸ºååæä½</li><li>æ¨èJVMå®ç°ä¸ºååæä½</li></ul><h3 id="_26-synchronized-å-volatile-çåºå«æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_26-synchronized-å-volatile-çåºå«æ¯ä»ä¹"><span>26. synchronized å volatile çåºå«æ¯ä»ä¹ï¼</span></a></h3><ul><li>synchronized è¡¨ç¤ºåªæä¸ä¸ªçº¿ç¨å¯ä»¥è·åä½ç¨å¯¹è±¡çéï¼æ§è¡ä»£ç ï¼é»å¡å
¶ä»çº¿ç¨ã</li><li>volatile 表示åéå¨ CPU çå¯åå¨ä¸æ¯ä¸ç¡®å®çï¼å¿
é¡»ä»ä¸»åä¸è¯»åãä¿è¯å¤çº¿ç¨ç¯å¢ä¸åéçå¯è§æ§ï¼ç¦æ¢æä»¤éæåºã</li></ul><p><strong>åºå«</strong></p><ul><li>volatile æ¯åé修饰符ï¼synchronized å¯ä»¥ä¿®é¥°ç±»ãæ¹æ³ãåéã</li><li>volatile ä»
è½å®ç°åéçä¿®æ¹å¯è§æ§ï¼ä¸è½ä¿è¯ååæ§ï¼è synchronized åå¯ä»¥ä¿è¯åéçä¿®æ¹å¯è§æ§åååæ§ã</li><li>volatile ä¸ä¼é æçº¿ç¨çé»å¡ï¼synchronized å¯è½ä¼é æçº¿ç¨çé»å¡ã</li><li>volatileæ è®°çåéä¸ä¼è¢«ç¼è¯å¨ä¼åï¼synchronizedæ è®°çåéå¯ä»¥è¢«ç¼è¯å¨ä¼åã</li><li>volatileå
³é®åæ¯çº¿ç¨åæ¥çè½»é级å®ç°ï¼æä»¥volatileæ§è½è¯å®æ¯synchronizedå
³é®åè¦å¥½ã使¯volatileå
³é®ååªè½ç¨äºåéèsynchronizedå
³é®åå¯ä»¥ä¿®é¥°æ¹æ³ä»¥å代ç åãsynchronizedå
³é®åå¨JavaSE1.6ä¹åè¿è¡äºä¸»è¦å
æ¬ä¸ºäºåå°è·å¾éåéæ¾é带æ¥çæ§è½æ¶èèå¼å
¥çååéåè½»é级é以åå
¶å®åç§ä¼åä¹åæ§è¡æçæäºæ¾èæåï¼å®é
å¼åä¸ä½¿ç¨ synchronized å
³é®åçåºæ¯è¿æ¯æ´å¤ä¸äºã</li></ul><h3 id="_27-finalä¸å¯å对象-å®å¯¹åå¹¶ååºç¨æä»ä¹å¸®å©" tabindex="-1"><a class="header-anchor" href="#_27-finalä¸å¯å对象-å®å¯¹åå¹¶ååºç¨æä»ä¹å¸®å©"><span>27. finalä¸å¯å对象ï¼å®å¯¹åå¹¶ååºç¨æä»ä¹å¸®å©ï¼</span></a></h3><ul><li><p>ä¸å¯å对象(Immutable Objects)å³å¯¹è±¡ä¸æ¦è¢«å建å®çç¶æï¼å¯¹è±¡çæ°æ®ï¼ä¹å³å¯¹è±¡å±æ§å¼ï¼å°±ä¸è½æ¹åï¼åä¹å³ä¸ºå¯å对象(Mutable Objects)ã</p></li><li><p>ä¸å¯å对象çç±»å³ä¸ºä¸å¯åç±»(Immutable Class)ãJava å¹³å°ç±»åºä¸å
å«è®¸å¤ä¸å¯åç±»ï¼å¦Stringãåºæ¬ç±»åçå
è£
ç±»ãBigInteger å BigDecimal çã</p></li><li><p>åªææ»¡è¶³å¦ä¸ç¶æï¼ä¸ä¸ªå¯¹è±¡ææ¯ä¸å¯åçï¼</p></li><li><p>å®çç¶æä¸è½å¨å建åå被修æ¹ï¼</p></li><li><p>ææå齿¯ final ç±»åï¼å¹¶ä¸ï¼å®è¢«æ£ç¡®å建ï¼å建æé´æ²¡æåç this å¼ç¨çé¸åºï¼ã</p></li></ul><p>ä¸å¯å对象ä¿è¯äºå¯¹è±¡çå
åå¯è§æ§ï¼å¯¹ä¸å¯å对象ç读åä¸éè¦è¿è¡é¢å¤çåæ¥ææ®µï¼æåäºä»£ç æ§è¡æçã</p><h3 id="_28-lock-æ¥å£åsynchronized-对æ¯åæ¥å®æä»ä¹ä¼å¿" tabindex="-1"><a class="header-anchor" href="#_28-lock-æ¥å£åsynchronized-对æ¯åæ¥å®æä»ä¹ä¼å¿"><span>28. Lock æ¥å£åsynchronized 对æ¯åæ¥å®æä»ä¹ä¼å¿ï¼</span></a></h3><ul><li>Lock æ¥å£æ¯åæ¥æ¹æ³å忥åæä¾äºæ´å
·æ©å±æ§çéæä½ãä»ä»¬å
许æ´çµæ´»çç»æï¼å¯ä»¥å
·æå®å
¨ä¸åçæ§è´¨ï¼å¹¶ä¸å¯ä»¥æ¯æå¤ä¸ªç¸å
³ç±»çæ¡ä»¶å¯¹è±¡ã</li><li>å®çä¼å¿æï¼ï¼1ï¼å¯ä»¥ä½¿éæ´å
¬å¹³ï¼2ï¼å¯ä»¥ä½¿çº¿ç¨å¨çå¾
éçæ¶åååºä¸æï¼3ï¼å¯ä»¥è®©çº¿ç¨å°è¯è·åéï¼å¹¶å¨æ æ³è·åéçæ¶åç«å³è¿åæè
çå¾
䏿®µæ
84¶é´ï¼4ï¼å¯ä»¥å¨ä¸åçèå´ï¼ä»¥ä¸åç顺åºè·ååéæ¾é</li><li>æ´ä½ä¸æ¥è¯´ Lock æ¯ synchronized çæ©å±çï¼Lock æä¾äºæ æ¡ä»¶çãå¯è½®è¯¢ç(tryLock æ¹æ³)ã宿¶ç(tryLock 另忹æ³)ãå¯ä¸æç(lockInterruptibly)ãå¯å¤æ¡ä»¶éåç(newCondition æ¹æ³)éæä½ãå¦å¤ Lock çå®ç°ç±»åºæ¬é½æ¯æéå
¬å¹³é(é»è®¤)åå
¬å¹³éï¼synchronized åªæ¯æéå
¬å¹³éï¼å½ç¶ï¼å¨å¤§é¨åæ
åµä¸ï¼éå
¬å¹³éæ¯é«æçéæ©ã</li></ul><h3 id="_29-ä¹è§éåæ²è§éççè§£åå¦ä½å®ç°-æåªäºå®ç°æ¹å¼" tabindex="-1"><a class="header-anchor" href="#_29-ä¹è§éåæ²è§éççè§£åå¦ä½å®ç°-æåªäºå®ç°æ¹å¼"><span>29. ä¹è§éåæ²è§éççè§£åå¦ä½å®ç°ï¼æåªäºå®ç°æ¹å¼ï¼</span></a></h3><ul><li>æ²è§éï¼æ»æ¯å设æåçæ
åµï¼æ¯æ¬¡å»æ¿æ°æ®çæ¶åé½è®¤ä¸ºå«äººä¼ä¿®æ¹ï¼æä»¥æ¯æ¬¡å¨æ¿æ°æ®çæ¶åé½ä¼ä¸éï¼è¿æ ·å«äººæ³æ¿è¿ä¸ªæ°æ®å°±ä¼é»å¡ç´å°å®æ¿å°éãä¼ ç»çå
³ç³»åæ°æ®åºé边就ç¨å°äºå¾å¤è¿ç§éæºå¶ï¼æ¯å¦è¡éï¼è¡¨éçï¼è¯»éï¼åéçï¼é½æ¯å¨åæä½ä¹åå
ä¸éãåæ¯å¦ Java éé¢ç忥åè¯ synchronized å
³é®åçå®ç°ä¹æ¯æ²è§éã</li><li>ä¹è§éï¼é¡¾åæä¹ï¼å°±æ¯å¾ä¹è§ï¼æ¯æ¬¡å»æ¿æ°æ®çæ¶åé½è®¤ä¸ºå«äººä¸ä¼ä¿®æ¹ï¼æä»¥ä¸ä¼ä¸éï¼ä½æ¯å¨æ´æ°çæ¶åä¼å¤æä¸ä¸å¨æ¤æé´å«äººææ²¡æå»æ´æ°è¿ä¸ªæ°æ®ï¼å¯ä»¥ä½¿ç¨çæ¬å·çæºå¶ãä¹è§ééç¨äºå¤è¯»çåºç¨ç±»åï¼è¿æ ·å¯ä»¥æé«ååéï¼åæ°æ®åºæä¾çç±»ä¼¼äº write_condition æºå¶ï¼å
¶å®é½æ¯æä¾çä¹è§éãå¨ Javaä¸ java.util.concurrent.atomic å
ä¸é¢çåååé类就æ¯ä½¿ç¨äºä¹è§éçä¸ç§å®ç°æ¹å¼ CAS å®ç°çã</li></ul><h3 id="_30-ä»ä¹æ¯-cas" tabindex="-1"><a class="header-anchor" href="#_30-ä»ä¹æ¯-cas"><span>30. ä»ä¹æ¯ CAS</span></a></h3><ul><li>CAS æ¯ compare and swap ç缩åï¼å³æä»¬æè¯´çæ¯è¾äº¤æ¢ã</li><li>CAS æ¯ä¸ç§åºäºéçæä½ï¼è䏿¯ä¹è§éãå¨ java ä¸éå为ä¹è§éåæ²è§éãæ²è§éæ¯å°èµæºéä½ï¼çä¸ä¸ªä¹åè·å¾éç线ç¨éæ¾éä¹åï¼ä¸ä¸ä¸ªçº¿ç¨æå¯ä»¥è®¿é®ãèä¹è§ééåäºä¸ç§å®½æ³çæåº¦ï¼éè¿æç§æ¹å¼ä¸å 鿥å¤çèµæºï¼æ¯å¦éè¿ç»è®°å½å version æ¥è·åæ°æ®ï¼æ§è½è¾æ²è§éæå¾å¤§çæé«ã</li><li>CAS æä½å
å«ä¸ä¸ªæä½æ° ââ å
åä½ç½®ï¼Vï¼ã颿åå¼ï¼Aï¼åæ°å¼(B)ã妿å
åå°åéé¢çå¼å A ç弿¯ä¸æ ·çï¼é£ä¹å°±å°å
åéé¢ç弿´æ°æ BãCASæ¯éè¿æ éå¾ªç¯æ¥è·åæ°æ®çï¼è¥æå¨ç¬¬ä¸è½®å¾ªç¯ä¸ï¼a 线ç¨è·åå°åéé¢çå¼è¢«b 线ç¨ä¿®æ¹äºï¼é£ä¹ a 线ç¨éè¦èªæï¼å°ä¸æ¬¡å¾ªç¯ææå¯è½æºä¼æ§è¡ã</li></ul><p>java.util.concurrent.atomic å
ä¸çç±»å¤§å¤æ¯ä½¿ç¨ CAS æä½æ¥å®ç°ç(AtomicInteger,AtomicBoolean,AtomicLong)</p><h3 id="_31-cas-çä¼äº§çä»ä¹é®é¢" tabindex="-1"><a class="header-anchor" href="#_31-cas-çä¼äº§çä»ä¹é®é¢"><span>31. CAS çä¼äº§çä»ä¹é®é¢ï¼</span></a></h3><ul><li>1ãABA é®é¢ï¼æ¯å¦è¯´ä¸ä¸ªçº¿ç¨ one ä»å
åä½ç½® V ä¸ååº Aï¼è¿æ¶åå¦ä¸ä¸ªçº¿ç¨ two ä¹ä»å
åä¸ååº Aï¼å¹¶ä¸ two è¿è¡äºä¸äºæä½åæäº Bï¼ç¶å two åå° V ä½ç½®çæ°æ®åæ Aï¼è¿æ¶åçº¿ç¨ one è¿è¡ CAS æä½åç°å
åä¸ä»ç¶æ¯ Aï¼ç¶å one æä½æåãå°½ç®¡çº¿ç¨ one ç CAS æä½æåï¼ä½å¯è½å卿½èçé®é¢ãä»Java1.5 å¼å§ JDK ç atomicå
éæä¾äºä¸ä¸ªç±» AtomicStampedReference æ¥è§£å³ ABA é®é¢ã</li><li>2ãå¾ªç¯æ¶é´é¿å¼é大ï¼å¯¹äºèµæºç«äºä¸¥éï¼çº¿ç¨å²çªä¸¥éï¼çæ
åµï¼CAS èªæçæ¦ç伿¯è¾å¤§ï¼ä»è浪费æ´å¤ç CPU èµæºï¼æçä½äº synchronizedã</li><li>3ãåªè½ä¿è¯ä¸ä¸ªå
±äº«åéçååæä½ï¼å½å¯¹ä¸ä¸ªå
±äº«åéæ§è¡æä½æ¶ï¼æä»¬å¯ä»¥ä½¿ç¨å¾ªç¯ CAS çæ¹å¼æ¥ä¿è¯ååæä½ï¼ä½æ¯å¯¹å¤ä¸ªå
±äº«åéæä½æ¶ï¼å¾ªç¯ CAS å°±æ æ³ä¿è¯æä½çååæ§ï¼è¿ä¸ªæ¶åå°±å¯ä»¥ç¨éã</li></ul>
84<h3 id="_32-ä»ä¹æ¯ååç±»" tabindex="-1"><a class="header-anchor" href="#_32-ä»ä¹æ¯ååç±»"><span>32. ä»ä¹æ¯ååç±»</span></a></h3><ul><li>java.util.concurrent.atomicå
ï¼æ¯ååç±»çå°å·¥å
·å
ï¼æ¯æå¨å个åéä¸è§£é¤éç线ç¨å®å
¨ç¼ç¨åååéç±»ç¸å½äºä¸ç§æ³åç volatile åéï¼è½å¤æ¯æååçåææ¡ä»¶ç读-æ¹-åæä½ã</li><li>æ¯å¦ï¼AtomicInteger 表示ä¸ä¸ªintç±»åçå¼ï¼å¹¶æä¾äº get å set æ¹æ³ï¼è¿äº Volatile ç±»åçintåéå¨è¯»åååå
¥ä¸æçç¸åçå
åè¯ä¹ãå®è¿æä¾äºä¸ä¸ªååç compareAndSet æ¹æ³ï¼å¦æè¯¥æ¹æ³æåæ§è¡ï¼é£ä¹å°å®ç°ä¸è¯»å/åå
¥ä¸ä¸ª volatile åéç¸åçå
åææï¼ï¼ä»¥åååçæ·»å ãéå¢åéåçæ¹æ³ãAtomicInteger 表é¢ä¸é常åä¸ä¸ªæ©å±ç Counter ç±»ï¼ä½å¨åçç«äºçæ
åµä¸è½æä¾æ´é«çå¯ä¼¸ç¼©æ§ï¼å 为å®ç´æ¥å©ç¨äºç¡¬ä»¶å¯¹å¹¶åçæ¯æã</li></ul><p>ç®åæ¥è¯´å°±æ¯ååç±»æ¥å®ç°CASæ 鿍¡å¼çç®æ³</p><h3 id="_33-ååç±»ç常ç¨ç±»" tabindex="-1"><a class="header-anchor" href="#_33-ååç±»ç常ç¨ç±»"><span>33. ååç±»ç常ç¨ç±»</span></a></h3><ul><li>AtomicBoolean</li><li>AtomicInteger</li><li>AtomicLong</li><li>AtomicReference</li></ul><h3 id="_34-说ä¸ä¸-atomicçåç" tabindex="-1"><a class="header-anchor" href="#_34-说ä¸ä¸-atomicçåç"><span>34. 说ä¸ä¸ Atomicçåçï¼</span></a></h3><ul><li>Atomicå
ä¸çç±»åºæ¬çç¹æ§å°±æ¯å¨å¤çº¿ç¨ç¯å¢ä¸ï¼å½æå¤ä¸ªçº¿ç¨åæ¶å¯¹å个ï¼å
æ¬åºæ¬ç±»ååå¼ç¨ç±»åï¼åéè¿è¡æä½æ¶ï¼å
·ææä»æ§ï¼å³å½å¤ä¸ªçº¿ç¨åæ¶å¯¹è¯¥åéçå¼è¿è¡æ´æ°æ¶ï¼ä»
æä¸ä¸ªçº¿ç¨è½æåï¼èæªæåç线ç¨å¯ä»¥åèªæé䏿 ·ï¼ç»§ç»å°è¯ï¼ä¸ç´çå°æ§è¡æåã</li></ul><h3 id="_35-æ»é䏿´»éçåºå«-æ»éä¸é¥¥é¥¿çåºå«" tabindex="-1"><a class="header-anchor" href="#_35-æ»é䏿´»éçåºå«-æ»éä¸é¥¥é¥¿çåºå«"><span>35. æ»é䏿´»éçåºå«ï¼æ»éä¸é¥¥é¥¿çåºå«ï¼</span></a></h3><ul><li><p>æ»éï¼æ¯æä¸¤ä¸ªæä¸¤ä¸ªä»¥ä¸çè¿ç¨ï¼æçº¿ç¨ï¼å¨æ§è¡è¿ç¨ä¸ï¼å äºå¤ºèµæºèé æçä¸ç§äºç¸çå¾
çç°è±¡ï¼è¥æ å¤åä½ç¨ï¼å®ä»¬é½å°æ æ³æ¨è¿ä¸å»ã</p></li><li><p>æ´»éï¼ä»»å¡æè
æ§è¡è
没æè¢«é»å¡ï¼ç±äºæäºæ¡ä»¶æ²¡ææ»¡è¶³ï¼å¯¼è´ä¸ç´éå¤å°è¯ï¼å¤±è´¥ï¼å°è¯ï¼å¤±è´¥ã</p></li><li><p>æ´»éåæ»éçåºå«å¨äºï¼å¤äºæ´»éçå®ä½æ¯å¨ä¸æçæ¹åç¶æï¼è¿å°±æ¯æè°çâæ´»âï¼ èå¤äºæ»éçå®ä½è¡¨ç°ä¸ºçå¾
ï¼æ´»éæå¯è½èªè¡è§£å¼ï¼æ»éåä¸è½ã</p></li><li><p>饥饿ï¼ä¸ä¸ªæè
å¤ä¸ªçº¿ç¨å 为ç§ç§åå æ æ³è·å¾æéè¦çèµæºï¼å¯¼è´ä¸ç´æ æ³æ§è¡çç¶æã</p></li><li><p>Java ä¸å¯¼è´é¥¥é¥¿çåå ï¼</p></li><li><p>1ãé«ä¼å
级线ç¨å嬿æçä½ä¼å
级线ç¨ç CPU æ¶é´ã</p></li><li><p>2ã线ç¨è¢«æ°¸ä¹
å µå¡å¨ä¸ä¸ªçå¾
è¿å
¥åæ¥åçç¶æï¼å 为å
¶ä»çº¿ç¨æ»æ¯è½å¨å®ä¹åæç»å°å¯¹è¯¥åæ¥åè¿è¡è®¿é®ã</p></li><li><p>3ã线ç¨å¨çå¾
ä¸ä¸ªæ¬èº«ä¹å¤äºæ°¸ä¹
çå¾
宿ç对象(æ¯å¦è°ç¨è¿ä¸ªå¯¹è±¡ç wait æ¹æ³)ï¼å 为å
¶ä»çº¿ç¨æ»æ¯è¢«æç»å°è·å¾å¤éã</p></li></ul><h2 id="ä¸ãçº¿ç¨æ± " tabindex="-1"><a class="header-anchor" href="#ä¸ãçº¿ç¨æ± "><span>ä¸ãçº¿ç¨æ± </span></a></h2><h3 id="_1-ä»ä¹æ¯çº¿ç¨æ± " tabindex="-1"><a class="header-anchor" href="#_1-ä»ä¹æ¯çº¿ç¨æ± "><span>1. ä»ä¹æ¯çº¿ç¨æ± ï¼</span></a></h3><ul><li><p>Javaä¸ççº¿ç¨æ± æ¯è¿ç¨åºæ¯æå¤çå¹¶åæ¡æ¶ï¼å 乿æéè¦å¼æ¥æå¹¶åæ§è¡ä»»å¡çç¨åºé½å¯ä»¥ä½¿ç¨çº¿ç¨æ± ãå¨å¼åè¿ç¨ä¸ï¼åçå°ä½¿ç¨çº¿ç¨æ± è½å¤å¸¦æ¥è®¸å¤å¥½å¤ã</p></li><li><p>éä½èµæºæ¶èãéè¿éå¤å©ç¨å·²å建ç线ç¨éä½çº¿ç¨å建åéæ¯é æçæ¶èã</p></li><li><p>æé«ååºé度ãå½ä»»å¡å°è¾¾æ¶ï¼ä»»å¡å¯ä»¥ä¸éè¦çå°çº¿ç¨å建就è½ç«å³æ§è¡ã</p></li><li><p>æé«çº¿ç¨çå¯ç®¡çæ§ãçº¿ç¨æ¯ç¨ç¼ºèµæºï¼å¦ææ éå¶å°å建ï¼ä¸ä»
伿¶èç³»ç»èµæºï¼è¿ä¼éä½ç³»ç»çç¨³å®æ§ï¼ä½¿ç¨çº¿ç¨æ± å¯ä»¥è¿è¡ç»ä¸åé
ãè°ä¼åçæ§ã使¯ï¼è¦åå°åçå©ç¨</p></li></ul><h3 id="_2-çº¿ç¨æ± ä½ç¨" tabindex="-1"><a class="header-anchor" href="#_2-çº¿ç¨æ± ä½ç¨"><span>2. çº¿ç¨æ± ä½ç¨ï¼</span></a></h3><ul><li>çº¿ç¨æ± æ¯ä¸ºçªç¶å¤§éçåç线ç¨è®¾è®¡çï¼éè¿æéçå 个åºå®çº¿ç¨ä¸ºå¤§éçæä½æå¡ï¼åå°äºå建åéæ¯çº¿ç¨æéçæ¶é´ï¼ä»èæé«æçã</li><li>妿ä¸ä¸ªçº¿ç¨æéè¦æ§è¡çæ¶é´é常é¿çè¯ï¼å°±æ²¡å¿
è¦ç¨çº¿ç¨æ± äº(䏿¯ä¸è½ä½é¿æ¶é´æä½ï¼èæ¯ä¸å®ãæ¬æ¥éä½çº¿ç¨å建å鿝ï¼ç»æä½ é£ä¹ä¹
æè¿ä¸å¥½æ§å¶è¿ä¸å¦ç´æ¥å建线ç¨)ï¼åµä¸æä»¬è¿ä¸è½æ§å¶çº¿ç¨æ± ä¸çº¿ç¨çå¼å§ãæèµ·ãå䏿¢ã</li></ul><h3 id="_3-çº¿ç¨æ± æä»ä¹ä¼ç¹" tabindex="-1">
84<a class="header-anchor" href="#_3-çº¿ç¨æ± æä»ä¹ä¼ç¹"><span>3. çº¿ç¨æ± æä»ä¹ä¼ç¹ï¼</span></a></h3><ul><li>éä½èµæºæ¶èï¼éç¨åå¨ç线ç¨ï¼åå°å¯¹è±¡åå»ºéæ¯çå¼éã</li><li>æé«ååºé度ã坿æçæ§å¶æå¤§å¹¶åçº¿ç¨æ°ï¼æé«ç³»ç»èµæºç使ç¨çï¼åæ¶é¿å è¿å¤èµæºç«äºï¼é¿å å µå¡ãå½ä»»å¡å°è¾¾æ¶ï¼ä»»å¡å¯ä»¥ä¸éè¦ççå°çº¿ç¨å建就è½ç«å³æ§è¡ã</li><li>æé«çº¿ç¨çå¯ç®¡çæ§ãçº¿ç¨æ¯ç¨ç¼ºèµæºï¼å¦ææ éå¶çå建ï¼ä¸ä» 伿¶èç³»ç»èµæºï¼è¿ä¼éä½ç³»ç»çç¨³å®æ§ï¼ä½¿ç¨çº¿ç¨æ± å¯ä»¥è¿è¡ç»ä¸çåé ï¼è°ä¼åçæ§ã</li><li>éå åè½ï¼æä¾å®æ¶æ§è¡ã宿æ§è¡ãå线ç¨ãå¹¶åæ°æ§å¶çåè½ã</li></ul><h3 id="_4-ä»ä¹æ¯threadpoolexecutor" tabindex="-1"><a class="header-anchor" href="#_4-ä»ä¹æ¯threadpoolexecutor"><span>4. ä»ä¹æ¯ThreadPoolExecutorï¼</span></a></h3><ul><li><strong>ThreadPoolExecutorå°±æ¯çº¿ç¨æ± </strong>ThreadPoolExecutorå ¶å®ä¹æ¯JAVAçä¸ä¸ªç±»ï¼æä»¬ä¸è¬éè¿Executorså·¥åç±»çæ¹æ³ï¼éè¿ä¼ å ¥ä¸åçåæ°ï¼å°±å¯ä»¥æé åºéç¨äºä¸ååºç¨åºæ¯ä¸çThreadPoolExecutorï¼çº¿ç¨æ± ï¼</li></ul><p>æé åæ°å¾</p><p>![ ][nbsp 5]</p><p>æé åæ°åæ°ä»ç»ï¼</p><blockquote><p>corePoolSize æ ¸å¿çº¿ç¨æ°é>maximumPoolSize æå¤§çº¿ç¨æ°é>keepAliveTime 线ç¨ä¿ææ¶é´ï¼N个æ¶é´åä½>unit æ¶é´åä½ï¼æ¯å¦ç§ï¼åï¼>workQueue é»å¡éå>threadFactory 线ç¨å·¥å>handler çº¿ç¨æ± æç»çç¥</p></blockquote><h3 id="_5-ä»ä¹æ¯executors" tabindex="-1"><a class="header-anchor" href="#_5-ä»ä¹æ¯executors"><span>5. ä»ä¹æ¯Executorsï¼</span></a></h3><ul><li>**Executorsæ¡æ¶å®ç°çå°±æ¯çº¿ç¨æ± çåè½ã**Executorså·¥åç±»ä¸æä¾çnewCachedThreadPoolãnewFixedThreadPool ãnewScheduledThreadPool ãnewSingleThreadExecutor çæ¹æ³å ¶å®ä¹åªæ¯ThreadPoolExecutorçæé 彿°åæ°ä¸åèå·²ãéè¿ä¼ å ¥ä¸åçåæ°ï¼å°±å¯ä»¥æé åºéç¨äºä¸ååºç¨åºæ¯ä¸ççº¿ç¨æ± ï¼</li></ul><p>Executorå·¥åç±»å¦ä½åå»ºçº¿ç¨æ± å¾ï¼</p><p>![ ][nbsp 6]</p><h3 id="_6-çº¿ç¨æ± åç§å建æ¹å¼" tabindex="-1"><a class="header-anchor" href="#_6-çº¿ç¨æ± åç§å建æ¹å¼"><span>6. çº¿ç¨æ± åç§å建æ¹å¼ï¼</span></a></h3><p>Javaéè¿Executorsï¼jdk1.5å¹¶åå ï¼æä¾åç§çº¿ç¨æ± ï¼åå«ä¸ºï¼</p><p><strong>1ã</strong> newCachedThreadPoolå建ä¸ä¸ªå¯ç¼åçº¿ç¨æ± ï¼å¦æçº¿ç¨æ± é¿åº¦è¶ è¿å¤çéè¦ï¼å¯çµæ´»åæ¶ç©ºé²çº¿ç¨ï¼è¥æ å¯åæ¶ï¼åæ°å»ºçº¿ç¨ï¼</p><p><strong>2ã</strong> newFixedThreadPoolå建ä¸ä¸ªå®é¿çº¿ç¨æ± ï¼å¯æ§å¶çº¿ç¨æå¤§å¹¶åæ°ï¼è¶ åºç线ç¨ä¼å¨éåä¸çå¾ ï¼</p><p><strong>3ã</strong> newScheduledThreadPoolå建ä¸ä¸ªå®é¿çº¿ç¨æ± ï¼æ¯æå®æ¶å卿æ§ä»»å¡æ§è¡ï¼</p><p><strong>4ã</strong> newSingleThreadExecutorå建ä¸ä¸ªå线ç¨åççº¿ç¨æ± ï¼å®åªä¼ç¨å¯ä¸çå·¥ä½çº¿ç¨æ¥æ§è¡ä»»å¡ï¼ä¿è¯ææä»»å¡æç §æå®é¡ºåº(FIFO,LIFO,ä¼å 级)æ§è¡ï¼</p><h3 id="_7-å¨-java-ä¸-executor-å-executors-çåºå«" tabindex="-1"><a class="header-anchor" href="#_7-å¨-java-ä¸-executor-å-executors-çåºå«"><span>7. å¨ Java ä¸ Executor å Executors çåºå«ï¼</span></a></h3><ul><li>Executors å·¥å ·ç±»çä¸åæ¹æ³æç §æä»¬çéæ±å建äºä¸åççº¿ç¨æ± ï¼æ¥æ»¡è¶³ä¸å¡çéæ±ã</li><li>Executor æ¥å£å¯¹è±¡è½æ§è¡æä»¬ç线ç¨ä»»å¡ã</li><li>ExecutorService æ¥å£ç»§æ¿äº Executor æ¥å£å¹¶è¿è¡äºæ©å±ï¼æä¾äºæ´å¤çæ¹æ³æä»¬è½è·å¾ä»»å¡æ§è¡çç¶æå¹¶ä¸å¯ä»¥è·åä»»å¡çè¿åå¼ã</li><li>ä½¿ç¨ ThreadPoolExecutor å¯ä»¥å建èªå®ä¹çº¿ç¨æ± ã</li></ul><h3 id="_8-åç§æå»ºçº¿ç¨æ± çåºå«åç¹ç¹" tabindex="-1"><a class="header-anchor" href="#_8-åç§æå»ºçº¿ç¨æ± çåºå«åç¹ç¹"><span>8. åç§æå»ºçº¿ç¨æ± çåºå«åç¹ç¹ï¼</span></a></h3><p><strong>1. newCachedThreadPool</strong></p><ul><li>ç¹ç¹ï¼newCachedThreadPoolå建ä¸ä¸ªå¯ç¼åçº¿ç¨æ± ï¼å¦æå½åçº¿ç¨æ± çé¿åº¦è¶ è¿äºå¤ççéè¦æ¶ï¼å®å¯ä»¥çµæ´»çåæ¶ç©ºé²ç线ç¨ï¼å½éè¦å¢å æ¶ï¼ å®å¯ä»¥çµæ´»çæ·»å æ°ç线ç¨ï¼èä¸ä¼å¯¹æ± çé¿åº¦ä½ä»»ä½éå¶</li><li>缺ç¹ï¼ä»è½ç¶å¯ä»¥æ çº¿çæ°å»ºçº¿ç¨ï¼ä½æ¯å®¹æé æå å¤å åæº¢åºï¼å 为å®çæå¤§å¼æ¯å¨åå§åçæ¶å设置为 Integer.MAX_VALUEï¼ä¸è¬æ¥è¯´æºå¨é½æ²¡é£ä¹å¤§å åç»å®ä¸æä½¿ç¨ãå½ç¶ç¥éå¯è½åºé®é¢çç¹ï¼å°±å¯ä»¥å»éåä¸ä¸ªæ¹æ³éå¶ä¸ä¸è¿ä¸ªæå¤§å¼</li><li>æ»ç»ï¼çº¿ç¨æ± 为æ é大ï¼å½æ§è¡ç¬¬äºä¸ªä»»å¡æ¶ç¬¬ä¸ä¸ªä»»å¡å·²ç»å®æï¼ä¼å¤ç¨æ§è¡ç¬¬ä¸ä¸ªä»»å¡ç线ç¨ï¼èä¸ç¨æ¯æ¬¡æ°å»ºçº¿ç¨ã</li><li>代ç 示ä¾ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">package</span><span style="--shiki-light:#383A42;--shiki-dark:#C678DD;"> com.demo</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 85<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">
85 import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.ExecutorService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 86<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.Executors</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 87<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> TestNewCachedThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 88<span class="line"></span> 89<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> static</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">[] </span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">args</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 90<span class="line"></span> 91<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // å建æ é大å°çº¿ç¨æ± ï¼ç±jvmèªå¨åæ¶</span></span> 92<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> ExecutorService</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> newCachedThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> Executors</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">newCachedThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span></span> 93<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"><</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i++) {</span></span> 94<span class="line"></span> 95<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> final</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> temp</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> i;</span></span> 96<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> newCachedThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">execute</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> Runnable</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() {</span></span> 97<span class="line"></span> 98<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 99<span class="line"></span> 100<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 101<span class="line"></span> 102<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">sleep</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">100</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 103<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">catch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Exception</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> e</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">) {</span></span> 104<span class="line"></span> 105<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 106<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">currentThread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">",i=="</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> temp);</span></span> 107<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 108<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> });</span></span> 109<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 110<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 111<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>2.newFixedThreadPool</strong></p><ul><li>ç¹ç¹ï¼å建ä¸ä¸ªå®é¿çº¿ç¨æ± ï¼å¯æ§å¶çº¿ç¨æå¤§å¹¶åæ°ï¼è¶ åºç线ç¨ä¼å¨éåä¸çå¾ ãå®é¿çº¿ç¨æ± çå¤§å°æå¥½æ ¹æ®ç³»ç»èµæºè¿è¡è®¾ç½®ã</li><li>缺ç¹ï¼çº¿ç¨æ°éæ¯åºå®çï¼ä½æ¯é»å¡é忝æ çéåã妿æå¾å¤è¯·æ±ç§¯åï¼é»å¡éåè¶æ¥è¶é¿ï¼å®¹æå¯¼è´OOMï¼è¶ åºå å空é´ï¼</li><li>æ»ç»ï¼è¯·æ±çæ¤åä¸å®è¦ååé ççº¿ç¨æ± 大å°å¹é ï¼å®çº¿ç¨æ± çå¤§å°æå¥½æ ¹æ®ç³»ç»èµæºè¿è¡è®¾ç½®ãå¦Runtime.getRuntime().availableProcessors()</li></ul><p>Runtime.getRuntime().availableProcessors()æ¹æ³æ¯æ¥ççµèCPUæ ¸å¿æ°éï¼</p><ul><li>代ç 示ä¾ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">package</span><span style="--shiki-light:#383A42;--shiki-dark:#C678DD;"> com.demo</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 112<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">
112 import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.ExecutorService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 113<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.Executors</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 114<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> TestNewFixedThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 115<span class="line"></span> 116<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> static</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">[] </span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">args</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 117<span class="line"></span> 118<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> ExecutorService</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> newFixedThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> Executors</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">newFixedThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 119<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"><</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i++) {</span></span> 120<span class="line"></span> 121<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> final</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> temp</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> i;</span></span> 122<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> newFixedThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">execute</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> Runnable</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() {</span></span> 123<span class="line"></span> 124<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 125<span class="line"></span> 126<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">currentThread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> ",i=="</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> temp);</span></span> 127<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 128<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> });</span></span> 129<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 130<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 131<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>3.newScheduledThreadPool</strong></p><ul><li>ç¹ç¹ï¼å建ä¸ä¸ªåºå®é¿åº¦ççº¿ç¨æ± ï¼è䏿¯æå®æ¶ç以å卿æ§ç任塿§è¡ï¼ç±»ä¼¼äºTimerï¼Timeræ¯Javaçä¸ä¸ªå®æ¶å¨ç±»ï¼</li><li>缺ç¹ï¼ç±äºææä»»å¡é½æ¯ç±åä¸ä¸ªçº¿ç¨æ¥è°åº¦ï¼å æ¤ææä»»å¡é½æ¯ä¸²è¡æ§è¡çï¼å䏿¶é´åªè½æä¸ä¸ªä»»å¡å¨æ§è¡ï¼åä¸ä¸ªä»»å¡çå»¶è¿æå¼å¸¸é½å°ä¼å½±åå°ä¹åçä»»å¡ï¼æ¯å¦ï¼ä¸ä¸ªä»»å¡åºéï¼ä»¥åçä»»å¡é½æ æ³ç»§ç»ï¼ã</li><li>代ç 示ä¾ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">package</span><span style="--shiki-light:#383A42;--shiki-dark:#C678DD;"> com.demo</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 132<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">
132 import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.Executors</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 133<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.ScheduledExecutorService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 134<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.TimeUnit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 135<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> TestNewScheduledThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 136<span class="line"></span> 137<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> static</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">[] </span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">args</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 138<span class="line"></span> 139<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //å®ä¹çº¿ç¨æ± 大å°ä¸º3</span></span> 140<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> ScheduledExecutorService</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> newScheduledThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> Executors</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">newScheduledThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 141<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"><</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i++) {</span></span> 142<span class="line"></span> 143<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> final</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> temp</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> i;</span></span> 144<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> newScheduledThreadPool</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">schedule</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> Runnable</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() {</span></span> 145<span class="line"></span> 146<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 147<span class="line"></span> 148<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"i:"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> temp);</span></span> 149<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 150<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">TimeUnit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">SECONDS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">//è¿é表示延è¿3ç§æ§è¡ã</span></span> 151<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 152<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 153<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>4.newSingleThreadExecutor</strong></p><ul><li>ç¹ç¹ï¼å建ä¸ä¸ªå线ç¨åççº¿ç¨æ± ï¼å®åªä¼ç¨å¯ä¸çå·¥ä½çº¿ç¨æ¥æ§è¡ä»»å¡ï¼å¦æè¿ä¸ªå¯ä¸ç线ç¨å 为å¼å¸¸ç»æï¼é£ä¹ä¼æä¸ä¸ªæ°ççº¿ç¨æ¥æ¿ä»£å®ï¼ä»å¿ é¡»ä¿è¯åä¸é¡¹ä»»å¡æ§è¡å®æ¯æè½æ§è¡åä¸é¡¹ãä¿è¯ææä»»å¡æç §æå®é¡ºåº(FIFO, LIFO, ä¼å 级)æ§è¡ã</li><li>缺ç¹ï¼ç¼ºç¹çè¯ï¼å¾ææ¾ï¼ä»æ¯å线ç¨çï¼é«å¹¶åä¸å¡ä¸æç¹æ å</li><li>æ»ç»ï¼ä¿è¯ææä»»å¡æç §æå®é¡ºåºæ§è¡çï¼å¦æè¿ä¸ªå¯ä¸ç线ç¨å 为å¼å¸¸ç»æï¼é£ä¹ä¼æä¸ä¸ªæ°ççº¿ç¨æ¥æ¿ä»£å®</li><li>代ç 示ä¾ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">package</span><span style="--shiki-light:#383A42;--shiki-dark:#C678DD;"> com.demo</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 154<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">
154import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.ExecutorService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 155<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.Executors</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 156<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> TestNewSingleThreadExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 157<span class="line"></span> 158<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> static</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">[] </span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">args</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 159<span class="line"></span> 160<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> ExecutorService</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> newSingleThreadExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> Executors</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">newSingleThreadExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span></span> 161<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"><</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i++) {</span></span> 162<span class="line"></span> 163<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> final</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> index</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> i;</span></span> 164<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> newSingleThreadExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">execute</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> Runnable</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() {</span></span> 165<span class="line"></span> 166<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 167<span class="line"></span> 168<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">currentThread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "index:"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> index);</span></span> 169<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 170<span class="line"></span> 171<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">sleep</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">200</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 172<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">catch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Exception</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> e</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">) {</span></span> 173<span class="line"></span> 174<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 175<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 176<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> });</span></span> 177<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 178<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 179<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_9-çº¿ç¨æ± 齿åªäºç¶æ" tabindex="-1"><a class="header-anchor" href="#_9-çº¿ç¨æ± 齿åªäºç¶æ"><span>9. çº¿ç¨æ± 齿åªäºç¶æï¼</span></a></h3><ul><li>RUNNINGï¼è¿æ¯ææ£å¸¸çç¶æï¼æ¥åæ°çä»»å¡ï¼å¤ççå¾ éåä¸çä»»å¡ã</li><li>SHUTDOWNï¼ä¸æ¥åæ°çä»»å¡æäº¤ï¼ä½æ¯ä¼ç»§ç»å¤ççå¾ éåä¸çä»»å¡ã</li><li>STOPï¼ä¸æ¥åæ°çä»»å¡æäº¤ï¼ä¸åå¤ççå¾ éåä¸çä»»å¡ï¼ä¸ææ£å¨æ§è¡ä»»å¡ç线ç¨ã</li><li>TIDYINGï¼ææçä»»å¡é½éæ¯äºï¼workCount 为 0ï¼çº¿ç¨æ± çç¶æå¨è½¬æ¢ä¸º TIDYING ç¶ææ¶ï¼ä¼æ§è¡é©åæ¹æ³ terminated()ã</li><li>TERMINATEDï¼terminated()æ¹æ³ç»æåï¼çº¿ç¨æ± çç¶æå°±ä¼åæè¿ä¸ªã</li></ul><h3 id="_10-çº¿ç¨æ± ä¸-submit-å-execute-æ¹æ³æä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_10-çº¿ç¨æ± ä¸-submit-å-execute-æ¹æ³æä»ä¹åºå«"><span>10. çº¿ç¨æ± ä¸ submit() å execute() æ¹æ³æä»ä¹åºå«ï¼</span></a></h3><ul><li><p>ç¸åç¹ï¼ç¸åç¹å°±æ¯é½å¯ä»¥å¼å¯çº¿ç¨æ§è¡æ± ä¸çä»»å¡ã</p></li><li><p>ä¸åç¹ï¼</p></li><li><p>æ¥æ¶åæ°ï¼execute()åªè½æ§è¡ Runnable ç±»åçä»»å¡ãsubmit()å¯ä»¥æ§è¡ Runnable åCallable ç±»åçä»»å¡ã</p></li><li><p>è¿åå¼ï¼submit()æ¹æ³å¯ä»¥è¿åææè®¡ç®ç»æç Future 对象ï¼èexecute()没æ</p></li><li><p>å¼å¸¸å¤çï¼submit()æ¹ä¾¿Exceptionå¤ç</p></li></ul><h3 id="_11-ä»ä¹æ¯çº¿ç¨ç»-为ä»ä¹å¨-java-ä¸ä¸æ¨è使ç¨" tabindex="-1"><a class="header-anchor" href="#_11-ä»ä¹æ¯çº¿ç¨ç»-为ä»ä¹å¨-java-ä¸ä¸æ¨è使ç¨"><span>11. ä»ä¹æ¯çº¿ç¨ç»ï¼ä¸ºä»ä¹å¨ Java ä¸ä¸æ¨è使ç¨ï¼</span></a></h3><ul><li>ThreadGroup ç±»ï¼å¯ä»¥æçº¿ç¨å½å±å°æä¸ä¸ªçº¿ç¨ç»ä¸ï¼çº¿ç¨ç»ä¸å¯ä»¥æçº¿ç¨å¯¹è±¡ï¼ä¹
179å¯ä»¥æçº¿ç¨ç»ï¼ç»ä¸è¿å¯ä»¥æçº¿ç¨ï¼è¿æ ·çç»ç»ç»ææç¹ç±»ä¼¼äºæ çå½¢å¼ã</li><li>线ç¨ç»åçº¿ç¨æ± æ¯ä¸¤ä¸ªä¸åçæ¦å¿µï¼ä»ä»¬çä½ç¨å®å ¨ä¸åï¼åè æ¯ä¸ºäºæ¹ä¾¿çº¿ç¨ç管çï¼åè æ¯ä¸ºäºç®¡ç线ç¨ççå½å¨æï¼å¤ç¨çº¿ç¨ï¼åå°åå»ºéæ¯çº¿ç¨çå¼éã</li><li>为ä»ä¹ä¸æ¨è使ç¨çº¿ç¨ç»ï¼å ä¸ºä½¿ç¨æå¾å¤çå®å ¨éæ£å§ï¼æ²¡æå ·ä½è¿½ç©¶ï¼å¦æéè¦ä½¿ç¨ï¼æ¨è使ç¨çº¿ç¨æ± ã</li></ul><h3 id="_12-threadpoolexecutor饱åçç¥æåªäº" tabindex="-1"><a class="header-anchor" href="#_12-threadpoolexecutor饱åçç¥æåªäº"><span>12. ThreadPoolExecutor饱åçç¥æåªäºï¼</span></a></h3><p>妿å½ååæ¶è¿è¡ççº¿ç¨æ°éè¾¾å°æå¤§çº¿ç¨æ°éå¹¶ä¸éåä¹å·²ç»è¢«æ¾æ»¡äºä»»æ¶ThreadPoolTaskExecutor å®ä¹ä¸äºçç¥:</p><ul><li>ThreadPoolExecutor.AbortPolicyï¼æåº RejectedExecutionExceptionæ¥æç»æ°ä»»å¡çå¤çã</li><li>ThreadPoolExecutor.CallerRunsPolicyï¼è°ç¨æ§è¡èªå·±ç线ç¨è¿è¡ä»»å¡ãæ¨ä¸ä¼ä»»å¡è¯·æ±ã使¯è¿ç§çç¥ä¼éä½å¯¹äºæ°ä»»å¡æäº¤é度ï¼å½±åç¨åºçæ´ä½æ§è½ãå¦å¤ï¼è¿ä¸ªçç¥å欢å¢å éå容éã妿æ¨çåºç¨ç¨åºå¯ä»¥æ¿åæ¤å»¶è¿å¹¶ä¸ä½ ä¸è½ä»»å¡ä¸¢å¼ä»»ä½ä¸ä¸ªä»»å¡è¯·æ±çè¯ï¼ä½ å¯ä»¥éæ©è¿ä¸ªçç¥ã</li><li>ThreadPoolExecutor.DiscardPolicyï¼ä¸å¤çæ°ä»»å¡ï¼ç´æ¥ä¸¢å¼æã</li><li>ThreadPoolExecutor.DiscardOldestPolicyï¼ æ¤çç¥å°ä¸¢å¼ææ©çæªå¤ççä»»å¡è¯·æ±ã</li></ul><h3 id="_13-å¦ä½èªå®ä¹çº¿ç¨çº¿ç¨æ± " tabindex="-1"><a class="header-anchor" href="#_13-å¦ä½èªå®ä¹çº¿ç¨çº¿ç¨æ± "><span>13. å¦ä½èªå®ä¹çº¿ç¨çº¿ç¨æ± ?</span></a></h3><ul><li>å çThreadPoolExecutorï¼çº¿ç¨æ± ï¼è¿ä¸ªç±»çæé åæ°</li></ul><p>![ ][nbsp 7]</p><ul><li>æé åæ°åæ°ä»ç»ï¼</li></ul><blockquote><p>corePoolSize æ ¸å¿çº¿ç¨æ°é>maximumPoolSize æå¤§çº¿ç¨æ°é>keepAliveTime 线ç¨ä¿ææ¶é´ï¼N个æ¶é´åä½>unit æ¶é´åä½ï¼æ¯å¦ç§ï¼åï¼>workQueue é»å¡éå>threadFactory 线ç¨å·¥å>handler çº¿ç¨æ± æç»çç¥</p></blockquote><ul><li>代ç 示ä¾ï¼</li></ul><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">package</span><span style="--shiki-light:#383A42;--shiki-dark:#C678DD;"> com.demo</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 180<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.ArrayBlockingQueue</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 181<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.ThreadPoolExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 182<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">import</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> java.util.concurrent.TimeUnit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 183<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Test001</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 184<span class="line"></span> 185<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> static</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">[] </span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">args</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 186<span class="line"></span> 187<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">
187 //åå»ºçº¿ç¨æ± </span></span> 188<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> ThreadPoolExecutor</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> executor</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> ThreadPoolExecutor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">60L</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">TimeUnit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">SECONDS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">new</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> ArrayBlockingQueue</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"><>(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">));</span></span> 189<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"><=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">; i++) {</span></span> 190<span class="line"></span> 191<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> TaskThred</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> t1</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> TaskThred</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"ä»»å¡"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> i);</span></span> 192<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //executor.execute(t1);æ¯æ§è¡çº¿ç¨æ¹æ³</span></span> 193<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> executor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">execute</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(t1);</span></span> 194<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 195<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> //executor.shutdown()ä¸åæ¥åæ°çä»»å¡ï¼å¹¶ä¸çå¾ ä¹åæäº¤çä»»å¡é½æ§è¡å®åå ³éï¼é»å¡éåä¸çä»»å¡ä¸ä¼åæ§è¡ã</span></span> 196<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> executor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">shutdown</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">();</span></span> 197<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 198<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 199<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> TaskThred</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> implements</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Runnable</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 200<span class="line"></span> 201<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> String</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> taskName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 202<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> TaskThred</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> taskName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 203<span class="line"></span> 204<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> this</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">taskName</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> taskName;</span></span> 205<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 206<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 207<span class="line"></span> 208<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">out</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">println</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">Thread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">currentThread</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getName</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">() </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> taskName);</span></span> 209<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 210<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_14-çº¿ç¨æ± çæ§è¡åç" tabindex="-1"><a class="header-anchor" href="#_14-çº¿ç¨æ± çæ§è¡åç"><span>14. çº¿ç¨æ± çæ§è¡åçï¼</span></a></h3><p>![ ][nbsp 8]</p><ul><li>æäº¤ä¸ä¸ªä»»å¡å°çº¿ç¨æ± ä¸ï¼çº¿ç¨æ± çå¤çæµç¨å¦ä¸ï¼</li></ul><p><strong>1ã</strong> å¤æçº¿ç¨æ± éçæ ¸å¿çº¿ç¨æ¯å¦é½å¨æ§è¡ä»»å¡ï¼å¦æä¸æ¯ï¼æ ¸å¿çº¿ç¨ç©ºé²æè è¿ææ ¸å¿çº¿ç¨æ²¡ï¼æè¢«å建ï¼åå建ä¸ä¸ªæ°çå·¥ä½çº¿ç¨æ¥æ§è¡ä»»å¡ãå¦ææ ¸å¿çº¿ç¨é½å¨æ§è¡ä»»å¡ï¼åè¿å ¥ä¸ä¸ªæµç¨ã</p><p><strong>2ã</strong> çº¿ç¨æ± 夿工ä½é忝å¦å·²æ»¡ï¼å¦æå·¥ä½éåæ²¡ææ»¡ï¼åå°æ°æäº¤çä»»å¡åå¨å¨è¿ä¸ªå·¥ä½éï¼åéã妿工ä½éåæ»¡äºï¼åè¿å ¥ä¸ä¸ªæµç¨ã</p><p><strong>3ã</strong> å¤æçº¿ç¨æ± éççº¿ç¨æ¯å¦é½å¤äºå·¥ä½ç¶æï¼å¦ææ²¡æï¼åå建ä¸ä¸ªæ°çå·¥ä½çº¿ç¨æ¥æ§è¡ä»»ï¼å¡ãå¦æå·²ç»æ»¡äºï¼å交ç»é¥±åçç¥æ¥å¤çè¿ä¸ªä»»å¡ã</p><h3 id="_15-å¦ä½åçåé çº¿ç¨æ± 大å°" tabindex="-1"><a class="header-anchor" href="#_15-å¦ä½åçåé çº¿ç¨æ± 大å°"><span>15. å¦ä½åçåé çº¿ç¨æ± 大å°?</span></a></h3><ul><li>è¦åççåé çº¿ç¨æ± ç大å°è¦æ ¹æ®å®é æ 嵿¥å®ï¼ç®åçæ¥è¯´çè¯å°±æ¯æ ¹æ®CPUå¯éåIOå¯éæ¥åé <strong>ä»ä¹æ¯CPUå¯é</strong></li><li>CPUå¯éçæææ¯è¯¥ä»»å¡éè¦å¤§éçè¿ç®ï¼è没æé»å¡ï¼CPUä¸ç´å ¨éè¿è¡ã
210</li><li>CPUå¯éä»»å¡åªæå¨çæ£ç夿 ¸CPU䏿å¯è½å¾å°å é(éè¿å¤çº¿ç¨)ï¼èå¨åæ ¸CPUä¸ï¼æ è®ºä½ å¼å 个模æçå¤çº¿ç¨ï¼è¯¥ä»»å¡é½ä¸å¯è½å¾å°å éï¼å 为CPUæ»çè¿ç®è½å就飿 ·ã</li></ul><p><strong>ä»ä¹æ¯IOå¯é</strong></p><ul><li>IOå¯éåï¼å³è¯¥ä»»å¡éè¦å¤§éçIOï¼å³å¤§éçé»å¡ãå¨å线ç¨ä¸è¿è¡IOå¯éåçä»»å¡ä¼å¯¼è´æµªè´¹å¤§éçCPUè¿ç®è½å浪费å¨çå¾
ãæä»¥å¨IOå¯éåä»»å¡ä¸ä½¿ç¨å¤çº¿ç¨å¯ä»¥å¤§å¤§çå éç¨åºè¿è¡ï¼å³æ¶å¨åæ ¸CPUä¸ï¼è¿ç§å é主è¦å°±æ¯å©ç¨äºè¢«æµªè´¹æçé»å¡æ¶é´ã</li></ul><p><strong>åé
CPUåIOå¯é</strong>ï¼</p><p><strong>1ã</strong> CPUå¯éåæ¶ï¼ä»»å¡å¯ä»¥å°é
ç½®çº¿ç¨æ°ï¼å¤§æ¦åæºå¨çcpuæ ¸æ°ç¸å½ï¼è¿æ ·å¯ä»¥ä½¿å¾æ¯ä¸ªçº¿ç¨é½å¨ï¼æ§è¡ä»»å¡</p><p><strong>2ã</strong> IOå¯éåæ¶ï¼å¤§é¨å线ç¨é½é»å¡ï¼æ
éè¦å¤é
ç½®çº¿ç¨æ°ï¼2*cpuæ ¸æ°ï¼</p><p><strong>精确æ¥è¯´çè¯çè¯</strong>ï¼</p><ul><li><p>ä»ä»¥ä¸å 个è§åº¦åæä»»å¡çç¹æ§ï¼</p></li><li><p>ä»»å¡çæ§è´¨ï¼CPUå¯éåä»»å¡ãIOå¯éåä»»å¡ãæ··ååä»»å¡ã</p></li><li><p>ä»»å¡çä¼å
级ï¼é«ãä¸ãä½ã</p></li><li><p>ä»»å¡çæ§è¡æ¶é´ï¼é¿ãä¸ãçã</p></li><li><p>ä»»å¡çä¾èµæ§ï¼æ¯å¦ä¾èµå
¶ä»ç³»ç»èµæºï¼å¦æ°æ®åºè¿æ¥çã</p></li></ul><p><strong>å¯ä»¥å¾åºä¸ä¸ªç»è®ºï¼</strong></p><ul><li>线ç¨çå¾
æ¶é´æ¯CPUæ§è¡æ¶é´æ¯ä¾è¶é«ï¼éè¦è¶å¤çº¿ç¨ã</li><li>线ç¨CPUæ§è¡æ¶é´æ¯çå¾
æ¶é´æ¯ä¾è¶é«ï¼éè¦è¶å°çº¿ç¨ã</li></ul><h2 id="åãå¹¶å容å¨" tabindex="-1"><a class="header-anchor" href="#åãå¹¶å容å¨"><span>åãå¹¶å容å¨</span></a></h2><h3 id="_1-ä½ ç»å¸¸ä½¿ç¨ä»ä¹å¹¶å容å¨-为ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_1-ä½ ç»å¸¸ä½¿ç¨ä»ä¹å¹¶å容å¨-为ä»ä¹"><span>
2101. ä½ ç»å¸¸ä½¿ç¨ä»ä¹å¹¶å容å¨ï¼ä¸ºä»ä¹ï¼</span></a></h3><ul><li>çï¼VectorãConcurrentHashMapãHasTable</li><li>ä¸è¬è½¯ä»¶å¼åä¸å®¹å¨ç¨çæå¤çå°±æ¯HashMapãArrayListï¼LinkedList ï¼çç</li><li>使¯å¨å¤çº¿ç¨å¼åä¸å°±ä¸è½ä¹±ç¨å®¹å¨ï¼å¦æä½¿ç¨äºæªå éï¼é忥ï¼ççéåï¼ä½ çæ°æ®å°±ä¼éå¸¸çæ··ä¹±ãç±æ¤å¨å¤çº¿ç¨å¼åä¸éè¦ä½¿ç¨ç容å¨å¿
é¡»æ¯å éï¼åæ¥ï¼ç容å¨ã</li></ul><h3 id="_2-ä»ä¹æ¯vector" tabindex="-1"><a class="header-anchor" href="#_2-ä»ä¹æ¯vector"><span>2. ä»ä¹æ¯Vector</span></a></h3><ul><li>Vectorä¸ArrayList䏿 ·ï¼ä¹æ¯éè¿æ°ç»å®ç°çï¼ä¸åçæ¯å®æ¯æçº¿ç¨ç忥ï¼å³æä¸æ¶å»åªæä¸ä¸ªçº¿ç¨è½å¤åVectorï¼é¿å
å¤çº¿ç¨åæ¶åèå¼èµ·çä¸ä¸è´æ§ï¼ä½å®ç°åæ¥éè¦å¾é«çè±è´¹ï¼è®¿é®å®æ¯è®¿é®ArrayListæ
¢å¾å¤ï¼ ArrayListæ¯æå¸¸ç¨çListå®ç°ç±»ï¼å
鍿¯éè¿æ°ç»å®ç°çï¼å®å
许对å
ç´ è¿è¡å¿«ééæºè®¿é®ãå½ä»ArrayListçä¸é´ä½ç½®æå
¥æè
å é¤å
ç´ æ¶ï¼éè¦å¯¹æ°ç»è¿è¡å¤å¶ãç§»å¨ã代价æ¯è¾é«ãå æ¤ï¼å®éåéæºæ¥æ¾åéåï¼ä¸éåæå
¥åå é¤ãArrayListçç¼ºç¹æ¯æ¯ä¸ªå
ç´ ä¹é´ä¸è½æé´éã ï¼</li></ul><h3 id="_3-arrayliståvectoræä»ä¹ä¸åä¹å¤" tabindex="-1"><a class="header-anchor" href="#_3-arrayliståvectoræä»ä¹ä¸åä¹å¤"><span>3. ArrayListåVectoræä»ä¹ä¸åä¹å¤ï¼</span></a></h3><ul><li>Vectoræ¹æ³å¸¦ä¸äºsynchronizedå
³é®åï¼æ¯çº¿ç¨åæ¥ç</li></ul><p><strong>1ã</strong> ArrayListæ·»å æ¹æ³æºç ï¼</p><p>![ ][nbsp 9]</p><p><strong>2ã</strong> Vectoræ·»å æºç ï¼å éäºsynchronizedå
³é®åï¼ï¼</p><p>![ ][nbsp 10]</p><h3 id="_4-为ä»ä¹hashtableæ¯çº¿ç¨å®å
¨ç" tabindex="-1"><a class="header-anchor" href="#_4-为ä»ä¹hashtableæ¯çº¿ç¨å®å
¨ç"><span>4. 为ä»ä¹HashTableæ¯çº¿ç¨å®å
¨çï¼</span></a></h3><p>å 为HasTableçå
鍿¹æ³é½è¢«synchronized修饰äºï¼æä»¥æ¯çº¿ç¨å®å
¨çãå
¶ä»çé½åHashMap䏿 ·</p><p><strong>1ã</strong> HashMapæ·»å æ¹æ³çæºç ï¼</p><p>![ ][nbsp 11]</p><p><strong>2ã</strong> HashTableæ·»å æ¹æ³çæºç ï¼</p><p>![ ][nbsp 12]</p><h3 id="_5-ç¨è¿concurrenthashmap-讲ä¸ä¸ä»åhashtableçä¸åä¹å¤" tabindex="-1"><a class="header-anchor" href="#_5-ç¨è¿concurrenthashmap-讲ä¸ä¸ä»åhashtableçä¸åä¹å¤"><span>5. ç¨è¿ConcurrentHashMapï¼è®²ä¸ä¸ä»åHashTableçä¸åä¹å¤ï¼</span></a></h3><ul><li>ConcurrentHashMapæ¯Java5䏿¯æé«å¹¶åãé«ååéç线ç¨å®å
¨HashMapå®ç°ãå®ç±Segmentæ°ç»ç»æåHashEntryæ°ç»ç»æç»æãSegmentæ°ç»å¨ConcurrentHashMapéæ®æ¼éçè§è²ï¼HashEntryåç¨äºåå¨é®-å¼å¯¹æ°æ®ãä¸ä¸ªConcurrentHashMapéå
å«ä¸ä¸ªSegmentæ°ç»ï¼Segmentçç»æåHashMapç±»ä¼¼ï¼æ¯ä¸ç§æ°ç»åé¾è¡¨ç»æï¼ä¸ä¸ªSegmentéå
å«ä¸ä¸ªHashEntryæ°ç»ï¼æ¯ä¸ªHashEntryæ¯ä¸ä¸ªé¾è¡¨ç»æçå
ç´ ï¼æ¯ä¸ªSegment宿¤çä¸ä¸ªHashEntryæ°ç»éçå
ç´ ï¼å½å¯¹HashEntryæ°ç»çæ°æ®è¿è¡ä¿®æ¹æ¶ï¼å¿
é¡»é¦å
è·å¾å®å¯¹åºçSegmentéã</li><li>ç䏿ï¼ï¼ï¼å¾æ£å¸¸ï¼æä¹ç䏿</li><li>æ»ç»ï¼</li></ul><p><strong>1ã</strong> HashTableå°±æ¯å®ç°äºHashMapå ä¸äºsynchronizedï¼èConcurrentHashMapåºå±éç¨åï¼æ®µçæ°ç»+é¾è¡¨å®ç°ï¼çº¿ç¨å®å
¨</p><p><strong>2ã</strong> ConcurrentHashMapéè¿ææ´ä¸ªMapå为N个Segmentï¼å¯ä»¥æä¾ç¸åç线ç¨å®å
¨ï¼ä½æ¯æï¼çæåNåï¼é»è®¤æå16åã</p><p><strong>3ã</strong> å¹¶ä¸è¯»æä½ä¸å éï¼ç±äºHashEntryçvalueå鿝volatileçï¼ä¹è½ä¿è¯è¯»åå°ææ°çå¼ï¼</p><p><strong>4ã</strong> Hashtableçsynchronizedæ¯é对æ´å¼ Hash表çï¼å³æ¯æ¬¡é使´å¼ 表让线ç¨ç¬å ï¼ï¼ConcurrentHashMapå
许å¤ä¸ªä¿®æ¹æä½å¹¶åè¿è¡ï¼å
¶å
³é®å¨äºä½¿ç¨äºéåç¦»ææ¯</p><p><strong>5ã</strong> æ©å®¹ï¼æ®µå
æ©å®¹ï¼æ®µå
å
ç´ è¶
è¿è¯¥æ®µå¯¹åºEntryæ°ç»é¿åº¦ç75%è§¦åæ©å®¹ï¼ä¸ä¼å¯¹æ´ä¸ªMapè¿ï¼è¡æ©å®¹ï¼ï¼æå
¥åæ£æµéä¸éè¦æ©å®¹ï¼ææé¿å
æ ææ©å®¹</p><h3 id="_6-collections-synchronized-æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_6-collections-synchronized-æ¯ä»ä¹"><span>
2106. Collections.synchronized * æ¯ä»ä¹ï¼</span></a></h3><p>注æï¼* å·ä»£è¡¨å颿¯è¿æå
容ç</p><ul><li>æ¤æ¹æ³æ¯å¹²ä»ä¹çå¢ï¼ä»å®å®å
¨å
¨çå¯ä»¥æListãMapãSetæ¥å£åºä¸çéååæçº¿ç¨å®å
¨çéå</li><li>Collections.synchronized * ï¼åçæ¯ä»ä¹ï¼æççè¯æ¯ä»£ç模å¼</li></ul><p>![ ][nbsp 13]</p><h3 id="_7-java-ä¸-concurrenthashmap-çå¹¶å度æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_7-java-ä¸-concurrenthashmap-çå¹¶å度æ¯ä»ä¹"><span>7. Java ä¸ ConcurrentHashMap çå¹¶å度æ¯ä»ä¹ï¼</span></a></h3><ul><li>ConcurrentHashMap æå®é
map ååæè¥å¹²é¨åæ¥å®ç°å®ç坿©å±æ§å线ç¨å®å
¨ãè¿ç§ååæ¯ä½¿ç¨å¹¶å度è·å¾çï¼å®æ¯ ConcurrentHashMap ç±»æé 彿°çä¸ä¸ªå¯éåæ°ï¼é»è®¤å¼ä¸º 16ï¼è¿æ ·å¨å¤çº¿ç¨æ
åµä¸å°±è½é¿å
äºç¨ã</li><li>å¨ JDK8 åï¼å®æå¼äº Segmentï¼é段ï¼çæ¦å¿µï¼èæ¯å¯ç¨äºä¸ç§å
¨æ°çæ¹å¼å®ç°,å©ç¨ CAS ç®æ³ãåæ¶å å
¥äºæ´å¤çè¾
å©å
210鿥æé«å¹¶å度ï¼å
·ä½å
å®¹è¿æ¯æ¥çæºç å§ã</li></ul><h3 id="_8-ä»ä¹æ¯å¹¶å容å¨çå®ç°" tabindex="-1"><a class="header-anchor" href="#_8-ä»ä¹æ¯å¹¶å容å¨çå®ç°"><span>8. ä»ä¹æ¯å¹¶å容å¨çå®ç°ï¼</span></a></h3><ul><li>ä½ä¸ºåæ¥å®¹å¨ï¼å¯ä»¥ç®åå°ç解为éè¿ synchronized æ¥å®ç°åæ¥ç容å¨ï¼å¦ææå¤ä¸ªçº¿ç¨è°ç¨åæ¥å®¹å¨çæ¹æ³ï¼å®ä»¬å°ä¼ä¸²è¡æ§è¡ãæ¯å¦ Vectorï¼Hashtableï¼ä»¥åCollections.synchronizedSetï¼synchronizedList çæ¹æ³è¿åç容å¨ãå¯ä»¥éè¿æ¥ç Vectorï¼Hashtable çè¿äºåæ¥å®¹å¨çå®ç°ä»£ç ï¼å¯ä»¥çå°è¿äºå®¹å¨å®ç°çº¿ç¨å®å
¨çæ¹å¼å°±æ¯å°å®ä»¬çç¶æå°è£
èµ·æ¥ï¼å¹¶å¨éè¦åæ¥çæ¹æ³ä¸å ä¸å
³é®å synchronizedã</li><li>å¹¶å容å¨ä½¿ç¨äºä¸åæ¥å®¹å¨å®å
¨ä¸åçå éçç¥æ¥æä¾æ´é«çå¹¶åæ§å伸缩æ§ï¼ä¾å¦å¨ConcurrentHashMap ä¸éç¨äºä¸ç§ç²åº¦æ´ç»çå éæºå¶ï¼å¯ä»¥ç§°ä¸ºå段éï¼å¨è¿ç§éæºå¶ä¸ï¼å
è®¸ä»»ææ°éç读线ç¨å¹¶åå°è®¿é® mapï¼å¹¶ä¸æ§è¡è¯»æä½ç线ç¨ååæä½ç线ç¨ä¹å¯ä»¥å¹¶åç访é®mapï¼åæ¶å
许ä¸å®æ°éçåæä½çº¿ç¨å¹¶åå°ä¿®æ¹ mapï¼æä»¥å®å¯ä»¥å¨å¹¶åç¯å¢ä¸å®ç°æ´é«çååéã</li></ul><h3 id="_9-java-ä¸ç忥éåä¸å¹¶åéåæä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_9-java-ä¸ç忥éåä¸å¹¶åéåæä»ä¹åºå«"><span>9. Java ä¸ç忥éåä¸å¹¶åéåæä»ä¹åºå«ï¼</span></a></h3><ul><li>忥éåä¸å¹¶åéåé½ä¸ºå¤çº¿ç¨åå¹¶åæä¾äºåéç线ç¨å®å
¨çéåï¼ä¸è¿å¹¶åéåç坿©å±æ§æ´é«ãå¨ Java1.5 ä¹åç¨åºåä»¬åªæåæ¥é忥ç¨ä¸å¨å¤çº¿ç¨å¹¶åçæ¶åä¼å¯¼è´äºç¨ï¼é»ç¢äºç³»ç»çæ©å±æ§ãJava5 ä»ç»äºå¹¶åéååConcurrentHashMapï¼ä¸ä»
æä¾çº¿ç¨å®å
¨è¿ç¨éå离åå
é¨ååºçç°ä»£ææ¯æé«äºå¯æ©å±æ§ã</li></ul><h3 id="_10-synchronizedmap-å-concurrenthashmap-æä»ä¹åºå«" tabindex="-1"><a class="header-anchor" href="#_10-synchronizedmap-å-concurrenthashmap-æä»ä¹åºå«"><span>10. SynchronizedMap å ConcurrentHashMap æä»ä¹åºå«ï¼</span></a></h3><ul><li>SynchronizedMap 䏿¬¡é使´å¼ 表æ¥ä¿è¯çº¿ç¨å®å
¨ï¼æä»¥æ¯æ¬¡åªè½æä¸ä¸ªçº¿ç¨æ¥è®¿ä¸º mapã</li><li>ConcurrentHashMap 使ç¨åæ®µéæ¥ä¿è¯å¨å¤çº¿ç¨ä¸çæ§è½ã</li><li>ConcurrentHashMap ä¸åæ¯ä¸æ¬¡éä½ä¸ä¸ªæ¡¶ãConcurrentHashMap é»è®¤å°hash 表å为 16 个桶ï¼è¯¸å¦ getï¼putï¼remove çå¸¸ç¨æä½åªéå½åéè¦ç¨å°çæ¡¶ã</li><li>è¿æ ·ï¼åæ¥åªè½ä¸ä¸ªçº¿ç¨è¿å
¥ï¼ç°å¨å´è½åæ¶æ 16 个åçº¿ç¨æ§è¡ï¼å¹¶åæ§è½çæåæ¯æ¾èæè§çã</li><li>å¦å¤ ConcurrentHashMap 使ç¨äºä¸ç§ä¸åçè¿ä»£æ¹å¼ãå¨è¿ç§è¿ä»£æ¹å¼ä¸ï¼å½iterator 被å建åéåååçæ¹åå°±ä¸åæ¯æåºConcurrentModificationExceptionï¼åè代ä¹çæ¯å¨æ¹åæ¶ newæ°çæ°æ®ä»èä¸å½±ååæçæ°æ®ï¼iterator 宿ååå°å¤´æéæ¿æ¢ä¸ºæ°çæ°æ® ï¼è¿æ · iterator线ç¨å¯ä»¥ä½¿ç¨åæ¥èçæ°æ®ï¼èå线ç¨ä¹å¯ä»¥å¹¶åç宿æ¹åã</li></ul><h3 id="_11-copyonwritearraylist-æ¯ä»ä¹" tabindex="-1"><a class="header-anchor" href="#_11-copyonwritearraylist-æ¯ä»ä¹"><span>11. CopyOnWriteArrayList æ¯ä»ä¹?</span></a></h3><ul><li>CopyOnWriteArrayList æ¯ä¸ä¸ªå¹¶å容å¨ãæå¾å¤äººç§°å®æ¯çº¿ç¨å®å
¨çï¼æè®¤ä¸ºè¿å¥è¯ä¸ä¸¥è°¨ï¼ç¼ºå°ä¸ä¸ªåææ¡ä»¶ï¼é£å°±æ¯éå¤ååºæ¯ä¸æä½å®æ¯çº¿ç¨å®å
¨çã</li><li>CopyOnWriteArrayList(å
é容å¨)ç好å¤ä¹ä¸æ¯å½å¤ä¸ªè¿ä»£å¨åæ¶éååä¿®æ¹è¿ä¸ªå表æ¶ï¼ä¸ä¼æåº ConcurrentModificationExceptionãå¨CopyOnWriteArrayList ä¸ï¼åå
¥å°å¯¼è´å建æ´ä¸ªåºå±æ°ç»ç坿¬ï¼èæºæ°ç»å°ä¿çå¨åå°ï¼ä½¿å¾å¤å¶çæ°ç»å¨è¢«ä¿®æ¹æ¶ï¼è¯»åæä½å¯ä»¥å®å
¨å°æ§è¡ã</li></ul><h3 id="_12-copyonwritearraylist-ç使ç¨åºæ¯" tabindex="-1"><a class="header-anchor" href="#_12-copyonwritearraylist-ç使ç¨åºæ¯"><span>12. CopyOnWriteArrayList ç使ç¨åºæ¯?</span></a></h3><ul><li>åé读å¤åå°çåºæ¯ã</li></ul><h3 id="_13-copyonwritearraylist-ç缺ç¹" tabindex="-1"><a class="header-anchor" href="#_13-copyonwritearraylist-ç缺ç¹"><span>13. CopyOnWriteArrayList ç缺ç¹?</span></a></h3><ul><li>ç±äºåæä½çæ¶åï¼éè¦æ·è´æ°ç»ï¼ä¼æ¶èå
åï¼å¦æåæ°ç»çå
容æ¯è¾å¤çæ
åµä¸ï¼å¯è½å¯¼è´young gc æè
full gcã</li><li>ä¸è½ç¨äºå®æ¶è¯»çåºæ¯ï¼åæ·è´æ°ç»ãæ°å¢å
ç´ é½éè¦æ¶é´ï¼æä»¥è°ç¨ä¸ä¸ª set æä½åï¼è¯»åå°æ°æ®å¯è½è¿æ¯æ§çï¼è½ç¶CopyOnWriteArrayList è½åå°æç»ä¸è´æ§,使¯è¿æ¯æ²¡æ³æ»¡è¶³å®æ¶æ§è¦æ±ã</li><li>
210ç±äºå®é
使ç¨ä¸å¯è½æ²¡æ³ä¿è¯ CopyOnWriteArrayList å°åºè¦æ¾ç½®å¤å°æ°æ®ï¼ä¸ä¸æ°æ®ç¨å¾®æç¹å¤ï¼æ¯æ¬¡ add/set é½è¦éæ°å¤å¶æ°ç»ï¼è¿ä¸ªä»£ä»·å®å¨å¤ªé«æäºãå¨é«æ§è½çäºèç½åºç¨ä¸ï¼è¿ç§æä½ååéå¼èµ·æ
éã</li></ul><h3 id="_14-copyonwritearraylist-çè®¾è®¡ææ³" tabindex="-1"><a class="header-anchor" href="#_14-copyonwritearraylist-çè®¾è®¡ææ³"><span>14. CopyOnWriteArrayList çè®¾è®¡ææ³?</span></a></h3><ul><li>读åå离ï¼è¯»åååå¼</li><li>æç»ä¸è´æ§</li><li>使ç¨å¦å¤å¼è¾ç©ºé´çæè·¯ï¼æ¥è§£å³å¹¶åå²çª</li></ul><h2 id="äºãå¹¶åéå" tabindex="-1"><a class="header-anchor" href="#äºãå¹¶åéå"><span>äºãå¹¶åéå</span></a></h2><h3 id="_1-ä»ä¹æ¯å¹¶åéå" tabindex="-1"><a class="header-anchor" href="#_1-ä»ä¹æ¯å¹¶åéå"><span>1. ä»ä¹æ¯å¹¶åéåï¼</span></a></h3><ul><li>æ¶æ¯éåå¾å¤äººç¥éï¼æ¶æ¯é忝åå¸å¼ç³»ç»ä¸éè¦çç»ä»¶ï¼æ¯ç³»ç»ä¸ç³»ç»ç´æ¥çéä¿¡</li><li>å¹¶åé忝ä»ä¹ï¼å¹¶åéåå¤ä¸ªçº¿ç¨ä»¥ææ¬¡åºå
±äº«æ°æ®çéè¦ç»ä»¶</li></ul><h3 id="_2-å¹¶åéååå¹¶åéåçåºå«" tabindex="-1"><a class="header-anchor" href="#_2-å¹¶åéååå¹¶åéåçåºå«"><span>2. å¹¶åéååå¹¶åéåçåºå«ï¼</span></a></h3><p>é£å°±æå¯è½è¦è¯´äºï¼æä»¬å¹¶åéå䏿¯ä¹å¯ä»¥å®ç°å¤çº¿ç¨ä¹é´çæ°æ®å
±äº«åï¼å
¶å®ä¹æ¯æåºå«çï¼</p><ul><li>éåéµå¾ªâå
è¿å
åºâçè§åï¼å¯ä»¥æ³è±¡ææéæ£ç¥¨ï¼éåä¸è¬ç¨æ¥è§£å³å¤§æ°æ®éééå¤çåæ¾ç¤ºçã</li><li>å¹¶åéåå°±æ¯å¨å¤ä¸ªçº¿ç¨ä¸å
±äº«æ°æ®ç</li></ul><h3 id="_3-æä¹å¤æå¹¶åé忝é»å¡éåè¿æ¯éé»å¡éå" tabindex="-1"><a class="header-anchor" href="#_3-æä¹å¤æå¹¶åé忝é»å¡éåè¿æ¯éé»å¡éå"><span>3. æä¹å¤æå¹¶åé忝é»å¡éåè¿æ¯éé»å¡éå</span></a></h3><ul><li>å¨å¹¶åéåä¸JDKæä¾äºQueueæ¥å£ï¼ä¸ä¸ªæ¯ä»¥Queueæ¥å£ä¸çBlockingQueueæ¥å£ä¸ºä»£è¡¨çé»å¡éåï¼å¦ä¸ä¸ªæ¯é«æ§è½ï¼æ å µå¡ï¼éåã</li></ul><h3 id="_4-é»å¡éååéé»å¡éååºå«" tabindex="-1"><a class="header-anchor" href="#_4-é»å¡éååéé»å¡éååºå«"><span>4. é»å¡éååéé»å¡éååºå«</span></a></h3><ul><li>å½éåé»å¡éåä¸ºç©ºçæ¶ï¼ä»éåä¸è·åå
ç´ çæä½å°ä¼è¢«é»å¡ã</li><li>æè
å½é»å¡éåæ¯æ»¡æ¶ï¼å¾éåéæ·»å å
ç´ çæä½ä¼è¢«é»å¡ã</li><li>æè
è¯å¾ä»ç©ºçé»å¡éåä¸è·åå
ç´ ç线ç¨å°ä¼è¢«é»å¡ï¼ç´å°å
¶ä»ç线ç¨å¾ç©ºçéåæå
¥æ°çå
ç´ ã</li><li>è¯å¾å¾å·²æ»¡çé»å¡éå䏿·»å æ°å
ç´ ç线ç¨åæ ·ä¹ä¼è¢«é»å¡ï¼ç´å°å
¶ä»ç线ç¨ä½¿éåéæ°åå¾ç©ºé²èµ·æ¥</li></ul><h3 id="_5-常ç¨å¹¶ååéçä»ç»" tabindex="-1"><a class="header-anchor" href="#_5-常ç¨å¹¶ååéçä»ç»"><span>5. 常ç¨å¹¶ååéçä»ç»ï¼</span></a></h3><p><strong>éå µå¡éåï¼</strong>ï¼</p><p>ArrayDeque,ï¼æ°ç»å端éåï¼ï¼ArrayDeque ï¼éå µå¡éåï¼æ¯JDK容å¨ä¸çä¸ä¸ªå端éåå®ç°ï¼å
é¨ä½¿ç¨æ°ç»è¿è¡å
ç´ åå¨ï¼ä¸å
许åå¨nullå¼ï¼å¯ä»¥é«æçè¿è¡å
ç´ æ¥æ¾å尾鍿å
¥ååºï¼æ¯ç¨ä½éåãå端éåãæ çç»ä½³éæ©ï¼æ§è½æ¯LinkedListè¿è¦å¥½ã<strong>2ã</strong> PriorityQueue,ï¼ä¼å
级éåï¼ï¼PriorityQueue ï¼éå µå¡éåï¼ ä¸ä¸ªåºäºä¼å
çº§çæ çä¼å
级éåãä¼å
级éåçå
ç´ æç
§å
¶èªç¶é¡ºåºè¿è¡æåºï¼æè
æ ¹æ®æé éåæ¶æä¾ç Comparator è¿è¡æåºï¼å
·ä½åå³äºæä½¿ç¨çæé æ¹æ³ã该éåä¸å
è®¸ä½¿ç¨ null å
ç´ ä¹ä¸å
许æå
¥ä¸å¯æ¯è¾ç对象<strong>3ã</strong> ConcurrentLinkedQueue,ï¼åºäºé¾è¡¨çå¹¶åéåï¼ï¼ConcurrentLinkedQueue ï¼éå µå¡éåï¼: æ¯ä¸ä¸ªéç¨äºé«å¹¶ååºæ¯ä¸çéåï¼éè¿æ éçæ¹å¼ï¼å®ç°äºé«å¹¶åç¶æä¸ç髿§è½ãConcurrentLinkedQueueçæ§è½è¦å¥½äºBlockingQueueæ¥å£ï¼å®æ¯ä¸ä¸ªåºäºé¾æ¥èç¹çæ ç线ç¨å®å
¨éåã该éåçå
ç´ éµå¾ªå
è¿å
åºçååã该éåä¸å
许nullå
ç´ ã</p><p><strong>å µå¡éåï¼</strong>ï¼**1.DelayQueue, ï¼åºäºæ¶é´ä¼å
级çéåï¼å»¶æé»å¡éåï¼**DelayQueueæ¯ä¸ä¸ªæ²¡æè¾¹çBlockingQueueå®ç°ï¼å å
¥å
¶ä¸çå
ç´ å¿
éå®ç°Delayedæ¥å£ãå½ç产è
线ç¨è°ç¨putä¹ç±»çæ¹æ³å å
¥å
ç´ æ¶ï¼ä¼è§¦åDelayedæ¥å£ä¸çcompareToæ¹æ³è¿è¡æåºï¼ä¹å°±æ¯è¯´éåä¸å
ç´ çé¡ºåºæ¯æå°ææ¶é´æåºçï¼èéå®ä»¬è¿å
¥éåç顺åºãæå¨éå头é¨çå
ç´ æ¯ææ©å°æçï¼è¶å¾åå°ææ¶é´èµ¿æã**2.ArrayBlockingQueue, ï¼åºäºæ°ç»çå¹¶åé»å¡éåï¼<strong>ArrayBlockingQueueæ¯ä¸ä¸ªæè¾¹ççé»å¡éåï¼å®çå
é¨å®ç°æ¯ä¸ä¸ªæ°ç»ãæè¾¹ççæææ¯å®ç容鿝æéçï¼æä»¬å¿
é¡»å¨å
¶åå§åçæ¶åæå®å®ç容é大å°ï¼å®¹é大å°ä¸æ¦æå®å°±ä¸å¯æ¹åãArrayBlockingQueueæ¯ä»¥å
è¿å
åºçæ¹å¼å卿°æ®</strong>3.LinkedBlockingQueue, ï¼åºäºé¾è¡¨çFIFOé»å¡éåï¼**LinkedBlockingQueueé»å¡éå大å°çé
ç½®æ¯å¯éçï¼å¦ææä»¬åå§åæ¶æå®ä¸ä¸ªå¤§å°ï¼å®å°±æ¯æè¾¹ççï¼å¦æä¸æå®ï¼å®å°±æ¯æ è¾¹ççãè¯´æ¯æ è¾¹çï¼å
¶å®æ¯éç¨äºé»è®¤å¤§å°ä¸ºInteger.MAX_VALUEç容é ãå®çå
é¨å®ç°æ¯ä¸ä¸ªé¾è¡¨ã**4.LinkedBlockingDeque, ï¼åºäºé¾è¡¨çFIFOå端é»å¡éåï¼**LinkedBlockingDequeæ¯ä¸ä¸ªç±é¾è¡¨ç»æç»æçååé»å¡éåï¼å³å¯ä»¥ä»éåç两端æå
¥åç§»é
210¤å
ç´ ãååéåå 为å¤äºä¸ä¸ªæä½éåçå
¥å£ï¼å¨å¤çº¿ç¨åæ¶å
¥éæ¶ï¼ä¹å°±åå°äºä¸åçç«äºãç¸æ¯äºå
¶ä»é»å¡éåï¼LinkedBlockingDequeå¤äºaddFirstãaddLastãpeekFirstãpeekLastçæ¹æ³ï¼ä»¥firstç»å°¾çæ¹æ³ï¼è¡¨ç¤ºæå
¥ãè·åè·ç§»é¤å端éåç第ä¸ä¸ªå
ç´ ã以lastç»å°¾çæ¹æ³ï¼è¡¨ç¤ºæå
¥ãè·åè·ç§»é¤å端éåçæåä¸ä¸ªå
ç´ ãLinkedBlockingDequeæ¯å¯é容éçï¼å¨åå§åæ¶å¯ä»¥è®¾ç½®å®¹é鲿¢å
¶è¿åº¦è¨èï¼å¦æä¸è®¾ç½®ï¼é»è®¤å®¹é大å°ä¸ºInteger.MAX_VALUEã**5.PriorityBlockingQueue, ï¼å¸¦ä¼å
çº§çæ çé»å¡éåï¼**priorityBlockingQueueæ¯ä¸ä¸ªæ çéåï¼å®æ²¡æéå¶ï¼å¨å
åå
许çæ
åµä¸å¯ä»¥æ éæ·»å å
ç´ ï¼å®åæ¯å
·æä¼å
级çéåï¼æ¯éè¿æé 彿°ä¼ å
¥ç对象æ¥å¤æï¼ä¼ å
¥ç对象å¿
é¡»å®ç°comparableæ¥å£ã**6. SynchronousQueue ï¼å¹¶å忥é»å¡éåï¼**SynchronousQueueæ¯ä¸ä¸ªå
é¨åªè½å
å«ä¸ä¸ªå
ç´ çéåãæå
¥å
ç´ å°éåç线ç¨è¢«é»å¡ï¼ç´å°å¦ä¸ä¸ªçº¿ç¨ä»éåä¸è·åäºéåä¸åå¨çå
ç´ ãåæ ·ï¼å¦æçº¿ç¨å°è¯è·åå
ç´ å¹¶ä¸å½åä¸åå¨ä»»ä½å
ç´ ï¼å该线ç¨å°è¢«é»å¡ï¼ç´å°çº¿ç¨å°å
ç´ æå
¥éåãå°è¿ä¸ªç±»ç§°ä¸ºéåæç¹å¤¸å¤§å
¶è¯ãè¿æ´åæ¯ä¸ä¸ªç¹ã</p><p><strong>å¹¶åéåçå¸¸ç¨æ¹æ³</strong>ä¸ç®¡æ¯é£ç§åéï¼æ¯é£ä¸ªç±»ï¼å½æ¯ä»ä»¬ä½¿ç¨çæ¹æ³é½æ¯å·®ä¸å¤ç</p><table><thead><tr><th align="left">æ¹æ³å</th><th align="left">æè¿°</th></tr></thead><tbody><tr><td align="left">add()</td><td align="left">å¨ä¸è¶
åºéåé¿åº¦çæ
åµä¸æå
¥å
ç´ ï¼å¯ä»¥ç«å³æ§è¡ï¼æåè¿åtrueï¼</td></tr><tr><td align="left">妿éåæ»¡äºå°±æåºå¼å¸¸ã</td><td align="left"></td></tr><tr><td align="left">offer()</td><td align="left">å¨ä¸è¶
åºéåé¿åº¦çæ
åµä¸æå
¥å
ç´ çæ¶ååå¯ä»¥ç«å³å¨éåç尾鍿å
¥æå®å
ç´ ,æåæ¶è¿åtrueï¼å¦ææ¤éå已满ï¼åè¿åfalseã</td></tr><tr><td align="left">put()</td><td align="left">æå
¥å
ç´ çæ¶åï¼å¦æéåæ»¡äºå°±è¿è¡çå¾
ï¼ç´å°éåå¯ç¨ã</td></tr><tr><td align="left">take()</td><td align="left">ä»éåä¸è·åå¼ï¼å¦æéå䏿²¡æå¼ï¼çº¿ç¨ä¼ä¸ç´é»å¡ï¼ç´å°éå䏿å¼ï¼å¹¶ä¸è¯¥æ¹æ³åå¾äºè¯¥å¼ã</td></tr><tr><td align="left">poll(long timeout,TimeUnit unit)</td><td align="left">å¨ç»å®çæ¶é´éï¼ä»éåä¸è·åå¼ï¼å¦ææ²¡æåå°ä¼æåºå¼å¸¸ã</td></tr><tr><td align="left">remainingCapacity()</td><td align="left">è·åéåä¸å©ä½ç空é´ã</td></tr><tr><td align="left">remove(Object o)</td><td align="left">ä»éåä¸ç§»é¤æå®çå¼ã</td></tr><tr><td align="left">contains(Object o)</td><td align="left">夿éå䏿¯å¦æ¥æè¯¥å¼ã</td></tr><tr><td align="left">drainTo(Collectionc)</td><td align="left">å°éåä¸å¼ï¼å
¨é¨ç§»é¤ï¼å¹¶å设置å°ç»å®çéåä¸ã</td></tr></tbody></table><h2 id="å
ãå¹¶åå·¥å
·ç±»" tabindex="-1"><a class="header-anchor" href="#å
ãå¹¶åå·¥å
·ç±»"><span>å
ãå¹¶åå·¥å
·ç±»</span></a></h2><h3 id="_1-常ç¨çå¹¶åå·¥å
·ç±»æåªäº" tabindex="-1"><a class="header-anchor" href="#_1-常ç¨çå¹¶åå·¥å
·ç±»æåªäº"><span>1. 常ç¨çå¹¶åå·¥å
·ç±»æåªäºï¼</span></a></h3><ul><li>CountDownLatchCountDownLatch ç±»ä½äºjava.util.concurrentå
ä¸ï¼å©ç¨å®å¯ä»¥å®ç°ç±»ä¼¼è®¡æ°å¨çåè½ãæ¯å¦æä¸ä¸ªä»»å¡Aï¼å®è¦çå¾
å
¶ä»3ä¸ªä»»å¡æ§è¡å®æ¯ä¹åæè½æ§è¡ï¼æ¤æ¶å°±å¯ä»¥å©ç¨CountDownLatchæ¥å®ç°è¿ç§åè½äºã</li><li>CyclicBarrier (åç¯æ
æ ) CyclicBarrierå®çä½ç¨å°±æ¯ä¼è®©ææçº¿ç¨é½çå¾
宿åæä¼ç»§ç»ä¸ä¸æ¥è¡å¨ãCyclicBarrieråå§åæ¶è§å®ä¸ä¸ªæ°ç®ï¼ç¶å计ç®è°ç¨äºCyclicBarrier.await()è¿å
¥çå¾
ççº¿ç¨æ°ãå½çº¿ç¨æ°è¾¾å°äºè¿ä¸ªæ°ç®æ¶ï¼ææè¿å
¥çå¾
ç¶æç线ç¨è¢«å¤éå¹¶ç»§ç»ãCyclicBarrieråå§æ¶è¿å¯å¸¦ä¸ä¸ªRunnableçåæ°ï¼ æ¤Runnableä»»å¡å¨CyclicBarrierçæ°ç®è¾¾å°åï¼ææå
¶å®çº¿ç¨è¢«å¤éå被æ§è¡ã</li><li>Semaphore (ä¿¡å·é) Semaphore æ¯ synchronized çå 强çï¼ä½ç¨æ¯æ§å¶çº¿ç¨çå¹¶åæ°éï¼å
许èªå
210®ä¹å¤å°çº¿ç¨åæ¶è®¿é®ï¼ãå°±è¿ä¸ç¹èè¨ï¼å纯çsynchronized å
³é®åæ¯å®ç°ä¸äºçã</li></ul><p>为äºå¸®å©æ´å¤çç²ä¸æåï¼æ¾å°ä¸ªå¥½å·¥ä½ï¼å¤æ¿å 个offerãè䏿è¿å»ºä¸äºå·¥ä½å
æ¨ç¾¤ï¼ç¾¤éç®åå·²ç»æ¶éäºå¾å¤å
æ¨å²ä½ï¼å¤§åãä¸åãå°åãå¤å
é½æãæ¬¢è¿HRãå¼åãæµè¯ãè¿ç»´å产åå å
¥ã</p><img src="https://web-1259428203.cos.ap-chengdu.myqcloud.com/20250305093506862.png" width="240" height="350"><p>æ«æä¸æ¹å¾®ä¿¡ï¼å¤æ³¨ï¼ç½ç«+æå¨åå¸ï¼å³å¯æä½ è¿å·¥ä½å
æ¨ç¾¤ã</p><img src="https://web-1259428203.cos.ap-chengdu.myqcloud.com/WX20250509-190407%402x.png" width="180" height="200"><div class="project-article-cta"><p class="project-article-cta-title">13 个ä¼ä¸çº§å®æé¡¹ç® · æºç + æç¨ + çç</p><p class="project-article-cta-points"><span>ç®åå
è£
æå¯¼</span><span>AI Agent 宿</span><span>é«å¹¶å·微æå¡</span><span>Offer 导å</span><span>æç»æ´æ°</span><span>3000+ åè¡äº¤æµ</span><span>1V1 çç</span><span>3 天å
é</span></p><p class="project-article-cta-desc">è¦çé«å¹¶åãå¾®æå¡ãåå¸å¼ä¸ AI Agentï¼100ä¸QPSçé¾ãä¼ä¸æºè½ç¥è¯åºãååå¾®æå¡ãSaaSç¹é¤ãç§æãå·é¢å°ç¨åºã代ç çæå¨ãAI Agent çãå¸å Â¥129ï¼åä»· Â¥159ï¼ï¼ä¸æ»¡æ 3 天å
éã</p><p class="project-article-cta-actions"><a class="project-article-cta-btn" href="/pay/project.html?from=article_end" rel="nofollow">ç«å³è·å 13 ä¸ªé¡¹ç®æºç â</a></p></div>`,383))])}const c=n(p,[["render",r]]),o=JSON.parse('{"path":"/8000/javaconcurrency.html","title":"Javaå¹¶åç¼ç¨é¢è¯é¢åçæ¡","lang":"zh-CN","frontmatter":{"title":"Javaå¹¶åç¼ç¨é¢è¯é¢åçæ¡","description":"Javaå¹¶åç¼ç¨å¸¸è§é¢è¯é¢åçæ¡å®æ´è§£æï¼å
å«çº¿ç¨ãéãå¹¶åéåãçº¿ç¨æ± ãJUCçæ ¸å¿ç¥è¯ç¹ï¼Javaé«çº§å¼åå¿
å¤é¢è¯é¢","author":"javaçªå»é","category":["1000éé¢è¯é¢"],"tag":["Java å¹¶åç¼ç¨é¢è¯é¢"],"keywords":"Javaå¹¶åé¢è¯é¢,Javaå¤çº¿ç¨é¢è¯é¢,Javaéæºå¶,çº¿ç¨æ± é¢è¯é¢,JUCé¢è¯é¢,Javaå¹¶åç¼ç¨é¢è¯é¢åçæ¡,Javaå¹¶åå
«è¡æ,å¤çº¿ç¨é¢è¯é¢","date":"2025-12-19T00:00:00.000Z","head":[["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"TechArticle\\",\\"headline\\":\\"Javaå¹¶åç¼ç¨é¢è¯é¢åçæ¡\\",\\"description\\":\\"Javaå¹¶åç¼ç¨å¸¸è§é¢è¯é¢åçæ¡å®æ´è§£æï¼å
å«çº¿ç¨ãéãå¹¶åéåãçº¿ç¨æ± ãJUCçæ ¸å¿ç¥è¯ç¹ï¼Javaé«çº§å¼åå¿
å¤é¢è¯é¢\\",\\"keywords\\":\\"Javaå¹¶åç¼ç¨é¢è¯é¢åçæ¡,Java å¹¶åç¼ç¨é¢è¯é¢,1000éé¢è¯é¢\\",\\"image\\":\\"https://web-1259428203.cos.ap-chengdu.myqcloud.com/20250305093506862.png\\",\\"datePublished\\":\\"2025-12-19T00:00:00.000Z\\",\\"dateModified\\":\\"2025-12-19T00:00:00.000Z\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"javaçªå»é\\",\\"url\\":\\"https://www.susan.net.cn/contact/\\"},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"name\\":\\"Javaçªå»é\\",\\"url\\":\\"https://www.susan.net.cn\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"url\\":\\"https://www.susan.net.cn/logo.png\\"}},\\"mainEntityOfPage\\":{\\"@type\\":\\"WebPage\\",\\"@id\\":\\"https://www.susan.net.cn/8000/javaconcurrency.html\\"},\\"inLanguage\\":\\"zh-CN\\"}"],["meta",{"property":"og:url","content":"https://www.susan.net.cn/8000/javaconcurrency.html"}],["meta",{"property":"og:site_name","content":"项ç®å®æç½ - Javaçªå»é"}],["meta",{"property":"og:title","content":"Javaå¹¶åç¼ç¨é¢è¯é¢åçæ¡"}],["meta",{"property":"og:description","content":"Javaå¹¶åç¼ç¨å¸¸è§é¢è¯é¢åçæ¡å®æ´è§£æï¼å
å«çº¿ç¨ãéãå¹¶åéåãçº¿ç¨æ± ãJUCçæ ¸å¿ç¥è¯ç¹ï¼Javaé«çº§å¼åå¿
å¤é¢è¯é¢"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://www.susan.net.cn/logo.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2026-07-31T07:49:28.000Z"}],["meta",{"property":"article:author","content":"javaçªå»é"}],["meta",{"property":"article:tag","content":"Java å¹¶åç¼ç¨é¢è¯é¢"}],["meta",{"property":"article:published_time","content":"2025-12-19T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2026-07-31T07:49:28.000Z"}],["link",{"rel":"canonical","href":"https://www.susan.net.cn/8000/javaconcurrency.html"}],["meta",{"name":"robots","content":"index,follow,archive"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:title","content":"Javaå¹¶åç¼ç¨é¢è¯é¢åçæ¡"}],["meta",{"name":"twitter:description","content":"Javaå¹¶åç¼ç¨å¸¸è§é¢è¯é¢åçæ¡å®æ´è§£æï¼å
å«çº¿ç¨ãéãå¹¶åéåãçº¿ç¨æ± ãJUCçæ ¸å¿ç¥è¯ç¹ï¼Javaé«çº§å¼åå¿
å¤é¢è¯é¢"}]]}
210,"git":{"createdTime":1772627670000,"updatedTime":1785484168000,"contributors":[{"name":"dv-susan","username":"","email":"[email protected]","commits":3}]},"filePathRelative":"8000/javaconcurrency.md","excerpt":"\\n<h2>ä¸ãåºç¡ç¥è¯</h2>\\n<h3>1. 为ä»ä¹è¦ä½¿ç¨å¹¶åç¼ç¨</h3>\\n<ul>\\n<li>æå夿 ¸CPUçå©ç¨çï¼ä¸è¬æ¥è¯´ä¸å°ä¸»æºä¸ç伿å¤ä¸ªCPUæ ¸å¿ï¼æä»¬å¯ä»¥å建å¤ä¸ªçº¿ç¨ï¼ç论ä¸è®²æä½ç³»ç»å¯ä»¥å°å¤ä¸ªçº¿ç¨åé
ç»ä¸åçCPU廿§è¡ï¼æ¯ä¸ªCPUæ§è¡ä¸ä¸ªçº¿ç¨ï¼è¿æ ·å°±æé«äºCPUçä½¿ç¨æçï¼å¦æä½¿ç¨å线ç¨å°±åªè½æä¸ä¸ªCPUæ ¸å¿è¢«ä½¿ç¨ã</li>\\n<li>æ¯å¦å½æä»¬å¨ç½ä¸è´ç©æ¶ï¼ä¸ºäºæåååºé度ï¼éè¦æåï¼ååºåï¼çæè®¢åççè¿äºæä½ï¼å°±å¯ä»¥è¿è¡æåå©ç¨å¤çº¿ç¨çææ¯å®æãé¢å¯¹å¤æä¸å¡æ¨¡åï¼å¹¶è¡ç¨åºä¼æ¯ä¸²è¡ç¨åºæ´éåºä¸å¡éæ±ï¼èå¹¶åç¼ç¨æ´è½å»åè¿ç§ä¸å¡æå ã</li>\\n</ul>\\n<p>ç®åæ¥è¯´å°±æ¯ï¼</p>\\n<ul>\\n<li>å
åå©ç¨å¤æ ¸CPUç计ç®è½åï¼</li>\\n<li>æ¹ä¾¿è¿è¡ä¸å¡æåï¼æååºç¨æ§è½</li>\\n</ul>\\n"}');export{c as comp,o as data};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.