# ä» PC å åæ¶æå° Java å 忍¡å > ä½ ç¥é Java å 忍¡å JMM åï¼é£ä½ ç¥éå®çä¸å¤§ç¹æ§åï¼ > Java æ¯å¦ä½è§£å³æä»¤éæé®é¢çï¼ > æ¢ç¶CPUæç¼åä¸è´æ§åè®®ï¼MESIï¼ï¼ä¸ºä»ä¹ JMM è¿éè¦ volatile å ³é®åï¼ > 带çé®é¢ï¼å°¤å ¶æ¯é¢è¯é®é¢çå¦ä¹ ææ¯æé«æçãå æ²¹ï¼å¥¥å©ç»ï¼ > æç« æ¶å½å¨ GitHub [JavaKeeper](https://github.com/Jstarfish/JavaKeeper) ï¼N线äºèç½å¼åå¿ å¤æè½å µå¨è°± å两天çå°åå¦åææ¾æä»ä»¬å ¬å¸é ççµèå¤å¥½å¤å¥½ï¼æé»é»æå¼äºèªå·±ççµèï¼` é ·ç¿ i7-4770 `ï¼ä¹ä¸æ¯ä¸å¤ç¨åï¼4 æ ¸ 8 线ç¨ç CPUï¼ä¹æ¯æ æ çã  æ¯è¿ç©æå¹²å¥ï¼Em~~~~ ä»ç» Java å 忍¡åä¹åï¼å æ¸©ä¹ ä¸è®¡ç®æºç¡¬ä»¶å 忍¡å ## ä¸ã硬件å åæ¶æ è®¡ç®æºå¨æ§è¡ç¨åºçæ¶åï¼æ¯æ¡æä»¤é½æ¯å¨ CPU 䏿§è¡çï¼èæ§è¡çæ¶åï¼åå ä¸äºè¦åæ°æ®æäº¤éãèè®¡ç®æºä¸é¢çæ°æ®ï¼æ¯åæ¾å¨ä¸»åå½ä¸çï¼ä¹å°±æ¯è®¡ç®æºçç©çå åã è®¡ç®æºç¡¬ä»¶æ¶æç®æå¾ï¼  > è¿äºå¹´ï¼æä»¬ç CPUãå åãI/O 设å¤é½å¨ä¸æè¿ä»£ï¼ä¸ææçæ´å¿«çæ¹ååªåã使¯ï¼å¨è¿ä¸ªå¿«éåå±çè¿ç¨ä¸ï¼æä¸ä¸ª**æ ¸å¿çç¾ä¸ç´åå¨ï¼å°±æ¯è¿ä¸è çé度差å¼**ãCPU åå åçé度差å¼å¯ä»¥å½¢è±¡å°æè¿°ä¸ºï¼CPU æ¯å¤©ä¸ä¸å¤©ï¼å 忝å°ä¸ä¸å¹´ï¼å设 CPU æ§è¡ä¸æ¡æ®éæä»¤éè¦ä¸å¤©ï¼é£ä¹ CPU 读åå åå¾çå¾ ä¸å¹´çæ¶é´ï¼ãå åå I/O 设å¤çé度差å¼å°±æ´å¤§äºï¼å 忝天ä¸ä¸å¤©ï¼I/O è®¾å¤æ¯å°ä¸åå¹´ã æä»¬ä»¥å¤æ ¸ CPU 为ä¾ï¼æ¯ä¸ª CPU æ ¸é½å å«**ä¸ç» ãCPU å¯åå¨ã**ï¼è¿äºå¯å卿¬è´¨ä¸æ¯å¨ CPU å åä¸ãCPU å¨è¿äºå¯åå¨ä¸æ§è¡æä½çéåº¦è¦æ¯å¨ä¸»å å(RAM)䏿§è¡çé度快å¾å¤ã å 为**CPUéçé«ï¼ å åéçæ ¢ï¼ä¸ºäºè®©åå¨ä½ç³»å¯ä»¥è·ä¸ CPU çéåº¦ï¼æä»¥ä¸é´åå ä¸ Cache å±ï¼å°±æ¯æä»¬è¯´ç ãCPU é«éç¼åã**ã > 为äºåçå©ç¨ CPU ç髿§è½ï¼å¹³è¡¡ CPU ãå åãI/O 设å¤çé度差å¼ï¼è®¡ç®æºä½ç³»ç»æãæä½ç³»ç»ãç¼è¯ç¨åºé½ååºäºè´¡ç®ï¼ä¸»è¦ä½ç°ä¸ºï¼ > > 1. CPU å¢å äºç¼åï¼ä»¥åè¡¡ä¸å åçé度差å¼ï¼ > 2. æä½ç³»ç»å¢å äºè¿ç¨ã线ç¨ï¼ä»¥åæ¶å¤ç¨ CPUï¼è¿èåè¡¡ CPU ä¸ I/O 设å¤çé度差å¼ï¼ > 3. ç¼è¯ç¨åºä¼åæä»¤æ§è¡æ¬¡åºï¼ä½¿å¾ç¼åè½å¤å¾å°æ´å åçå°å©ç¨ã ### CPUå¤çº§ç¼å ç±äº CPU çè¿ç®é度è¿è¿è¶ è¶äº 1 级ç¼åçæ°æ® I\O è½åï¼CPU åååå¼å ¥äºå¤çº§çç¼åç»æãé常 L1ãL2 æ¯æ¯ä¸ª CPU æ ¸æä¸ä¸ªï¼L3 æ¯å¤ä¸ªæ ¸å ±ç¨ä¸ä¸ªã ### Cache Line Cache 忝ç±å¾å¤ä¸ªã**ç¼åè¡**ã(Cache line) ç»æçãCache line æ¯ Cache å RAM äº¤æ¢æ°æ®çæå°åä½ã Cache å卿°æ®æ¯åºå®å¤§å°ä¸ºåä½çï¼ç§°ä¸ºä¸ä¸ª**Cache entry**ï¼è¿ä¸ªåä½ç§°ä¸º **Cache line** æ **Cache block**ãç»å® Cache 容é大å°å Cache line size çæ åµä¸ï¼å®è½åå¨çæ¡ç®ä¸ªæ°(number of cache entries)å°±æ¯åºå®çãå 为Cache æ¯åºå®å¤§å°çï¼æä»¥å®ä»ä¸»å åè·åæ°æ®ä¹æ¯åºå®å¤§å°ãå¯¹äº X86 æ¥è®²ï¼æ¯ 64Bytesãå¯¹äº ARM æ¥è®²ï¼è¾æ§çæ¶æç Cache line æ¯ 32Bytesï¼ä½ä¸æ¬¡å å访ååªè®¿é®ä¸åçæ°æ®ä¹ä¸å¤ªåéï¼æä»¥å®ç»å¸¸æ¯ä¸æ¬¡å¡«ä¸¤ä¸ª Cache lineï¼å«å double fillã ### ç¼åçå·¥ä½åç è¿éçç¼åçå·¥ä½åçåæä»¬é¡¹ç®ä¸ç¨ memcachedãredis åå¸¸ç¨æ°æ®çç¼å屿¯ä¸ä¸ªéçã å½ CPU è¦è¯»åä¸ä¸ªæ°æ®æ¶ï¼é¦å ä»ç¼å䏿¥æ¾ï¼å¦ææ¾å°å°±ç«å³è¯»åå¹¶éç»CPUå¤çï¼å¦ææ²¡ææ¾å°ï¼å°±å»å åä¸è¯»åå¹¶éç» CPU å¤çï¼åæ¶æè¿ä¸ªæ°æ®æå¨ç**æ°æ®å**ï¼å°±æ¯æä»¬ä¸è¾¹è¯´ç Cache blockï¼è°å ¥ç¼åä¸ï¼å³æä¸´è¿çå ± 64 Byte çæ°æ®ä¹ä¸åè½½å ¥ï¼å 为临è¿çæ°æ®å¨å°æ¥è¢«è®¿é®çå¯è½æ§æ´å¤§ï¼å¯ä»¥ä½¿å¾ä»¥å对æ´åæ°æ®ç读åé½ä»ç¼åä¸è¿è¡ï¼ä¸å¿ åè°ç¨å åã è¿å°±å¢å äºCPU读åç¼åç**å½ä¸ç**ï¼Cache hitï¼äºã ### è®¡ç®æºå±çº§åå¨ è®¡ç®æºåå¨ç³»ç»æ¯æå±æ¬¡ç»æçï¼ç±»ä¼¼ä¸ä¸ªéåå¡ï¼é¡¶å±çå¯åå¨è¯»åé度è¾é«ï¼ä½æ¯ç©ºé´è¾å°ãåºå±ç读åé度è¾ä½ï¼ä½æ¯ç©ºé´è¾å¤§  ### ç¼åä¸è´æ§ æ¢ç¶æ¯ä¸ªæ ¸ä¸é½æåç¬çç¼åï¼é£æç 4 æ ¸ 8 çº¿ç¨ CPU å¤ç主å åæ°æ®çæ¶åï¼ä¸å°±ä¼åºç°æ°æ®ä¸ä¸è´é®é¢äºåï¼ ä¸ºäºè§£å³è¿ä¸ªé®é¢ï¼å åæè¿ä¸¤ç§æ¹æ³ï¼**æ»çº¿éæºå¶**å**ç¼åéæºå¶**ã æ»çº¿éå°±æ¯ä½¿ç¨ CPU æä¾çä¸ä¸ª `LOCK#` ä¿¡å·ï¼å½ä¸ä¸ªå¤çå¨å¨æ»çº¿ä¸è¾åºæ¤ä¿¡å·ï¼å ¶ä»å¤çå¨ç请æ±å°è¢«é»å¡ï¼é£ä¹è¯¥å¤çå¨å°±å¯ä»¥ç¬å å ±äº«éãè¿æ ·å°±ä¿è¯äºæ°æ®ä¸è´æ§ã 使¯æ»çº¿éå¼éå¤ªå¤§ï¼æä»¬éè¦æ§å¶éçç²åº¦ï¼æä»¥åæäºç¼åéï¼æ ¸å¿å°±æ¯â**ç¼åä¸è´æ§åè®®**âï¼ä¸åç CPU 硬件ååå®ç°æ¹å¼ç¨æä¸åï¼æ MSIãMESIãMOSI çã ### 代ç ä¹±åºæ§è¡ä¼å 为äºä½¿å¾å¤çå¨å é¨çè¿ç®åå å°½é被å åå©ç¨ï¼æé«è¿ç®æçï¼å¤çå¨å¯è½ä¼å¯¹è¾å ¥ç代ç è¿è¡ã**ä¹±åºæ§è¡**ã**(Out-Of-Order Execution)ï¼å¤çå¨ä¼å¨è®¡ç®ä¹åå°ä¹±åºæ§è¡çç»æéç»**ï¼ä¹±åºä¼åå¯ä»¥ä¿è¯å¨å线ç¨ä¸è¯¥æ§è¡ç»æä¸é¡ºåºæ§è¡çç»ææ¯ä¸è´çï¼ä½ä¸ä¿è¯ç¨åºä¸å个è¯å¥è®¡ç®çå å顺åºä¸è¾å ¥ä»£ç ä¸ç顺åºä¸è´ã **ä¹±åºæ§è¡ææ¯æ¯å¤çå¨ä¸ºæé«è¿ç®é度èååºè¿è代ç åæé¡ºåºçä¼å**ãå¨åæ ¸æ¶ä»£ï¼å¤çå¨ä¿è¯ååºçä¼åä¸ä¼å¯¼è´æ§è¡ç»æè¿ç¦»é¢æç®æ ï¼ä½å¨å¤æ ¸ç¯å¢ä¸å´å¹¶é妿¤ã 夿 ¸ç¯å¢ä¸ï¼ 妿åå¨ä¸ä¸ªæ ¸ç计ç®ä»»å¡ä¾èµå¦ä¸ä¸ªæ ¸ç计ç®ä»»å¡çä¸é´ç»æï¼èä¸å¯¹ç¸å ³æ°æ®è¯»å没åä»»ä½é²æ¤æªæ½ï¼é£ä¹å ¶é¡ºåºæ§å¹¶ä¸è½é 代ç çå åé¡ºåºæ¥ä¿è¯ï¼å¤ç卿ç»å¾åºçç»æåæä»¬é»è¾å¾å°çç»æå¯è½ä¼å¤§ä¸ç¸åã #### ç¼è¯å¨æä»¤éæ é¤äºä¸è¿°ç±å¤çå¨åç¼åå¼èµ·çä¹±åºä¹å¤ï¼ç°ä»£ç¼è¯å¨åæ ·æä¾äºä¹±åºä¼åã乿以åºç°ç¼è¯å¨ä¹±åºä¼åå ¶æ ¹æ¬åå å¨äºå¤ç卿¯æ¬¡åªè½åæä¸å°åæä»¤ï¼ä½ç¼è¯å¨å´è½å¨å¾å¤§èå´å è¿è¡ä»£ç åæï¼ä»èååºæ´ä¼ççç¥ï¼å åå©ç¨å¤çå¨çä¹±åºæ§è¡åè½ã ### å åå±é å称为å åæ æ ï¼æ¯ä¸ä¸ª CPU æä»¤ã尽管æä»¬çå°ä¹±åºæ§è¡åå§ç®çæ¯ä¸ºäºæé«æçï¼ä½æ¯å¨è¿å¤æ ¸æ¶ä»£ææå¥½åä¸å°½äººæï¼å ¶ä¸çæäºâèªä½èªæâçä¼å导è´å¤çº¿ç¨ç¨åºäº§çåç§åæ ·çæå¤ãå æ¤æå¿ è¦åå¨ä¸ç§æºå¶æ¥æ¶é¤ä¹±åºæ§è¡å¸¦æ¥çåå½±åï¼ä¹å°±æ¯è¯´åºè¯¥å 许ç¨åºåæ¾å¼çåè¯å¤çå¨å¯¹æäºå°æ¹ç¦æ¢ä¹±åºæ§è¡ãè¿ç§æºå¶å°±æ¯æè°å åå±éãä¸åæ¶æçå¤çå¨å¨å ¶æä»¤é䏿ä¾äºä¸åçæä»¤æ¥åèµ·å åå±éï¼å¯¹åºå¨ç¼ç¨è¯è¨å½ä¸å°±æ¯æä¾ç¹æ®çå ³é®åæ¥è°ç¨å¤çå¨ç¸å ³çæä»¤ï¼JMM éæä»¬åæ¢è®¨ã ------ ## äºãJava å 忍¡å Java å 忍¡åå³ `Java Memory Model`ï¼ç®ç§° **JMM**ã è¿éçå 忍¡åå¯ä¸æ¯ JVM éçè¿è¡æ¶æ°æ®åºã ãå 忍¡åãå¯ä»¥ç解为**å¨ç¹å®æä½åè®®ä¸ï¼å¯¹ç¹å®çå åæé«éç¼åè¿è¡è¯»å访é®çè¿ç¨æ½è±¡**ã ä¸åæ¶æçç©çè®¡ç®æºå¯ä»¥æä¸ä¸æ ·çå 忍¡åï¼Java èææºä¹æèªå·±çå 忍¡åã Java èææºè§èä¸è¯å¾å®ä¹ä¸ç§ã **Java å 忍¡å**ãæ¥**å±è½æåç§ç¡¬ä»¶åæä½ç³»ç»çå å访é®å·®å¼**ï¼ä»¥å®ç°**让 Java ç¨åºå¨åç§å¹³å°ä¸é½è½è¾¾å°ä¸è´çå åè®¿é®ææ**ï¼ä¸å¿ å 为ä¸åå¹³å°ä¸çç©çæºçå 忍¡åçå·®å¼ï¼å¯¹åå¹³å°å®å¶åå¼åç¨åºã Java å 忍¡åç主è¦ç®æ æ¯å®ä¹ç¨åºä¸å个åéç访é®è§åï¼å³å¨èææºä¸å°åéåå¨å°å ååä»å åä¸ååºåéè¿æ ·çåºå±ç»èãè¿éçåé䏿们å Java 代ç ä¸çåéä¸åï¼å®å æ¬äºå®ä¾å段ãéæåæ®µåæææ°ç»å¯¹è±¡çå ç´ ï¼ä½ä¸å æ¬å±é¨åéåæ¹æ³åæ°ï¼å 为ä»ä»¬æ¯çº¿ç¨ç§æçï¼ä¸ä¼è¢«å ±äº«ã > Java å 忍¡åæ¯ä¸ªå¾å¤æçè§èï¼å¯ä»¥ä»ä¸åçè§è§æ¥è§£è¯»ï¼ç«å¨ç¨åºåçè§è§ï¼æ¬è´¨ä¸å¯ä»¥ç解为ï¼Java å 忍¡åè§èäº JVM å¦ä½æä¾**æéç¦ç¨ç¼å**ï¼è§£å³å¯è§æ§é®é¢ï¼åç¼è¯ä¼åï¼è§£å³æåºæ§é®é¢ï¼çæ¹æ³ãå ·ä½æ¥è¯´ï¼è¿äºæ¹æ³å æ¬ volatileãsynchronized å final ä¸ä¸ªå ³é®åï¼ä»¥åå 项 Happens-Before è§åï¼è¿ä¹æ£æ¯æ¬æçéç¹å 容ã ### JMM ç»æ - **主å å**ï¼Java å 忍¡åè§å®äºææåéé½åå¨å¨ä¸»å å(Main Memory)ä¸ï¼æ¤å¤ç主å åä¸ç©ç硬件ç主å å RAM åå䏿 ·ï¼ä¸¤è å¯ä»¥äºç¸ç±»æ¯ï¼ä½æ¤å¤ä» æ¯èææºå åçä¸é¨åï¼ã - **å·¥ä½å å**ï¼æ¯æ¡çº¿ç¨é½æèªå·±çå·¥ä½å å(Working Memoryï¼åç§°æ¬å°å åï¼å¯ä¸ CPU é«éç¼åç±»æ¯)ï¼çº¿ç¨çå·¥ä½å åä¸ä¿åäºè¯¥çº¿ç¨ä½¿ç¨å°ç主å åä¸çå ±äº«åéç坿¬æ·è´ã**线ç¨å¯¹åéçæææä½é½å¿ é¡»å¨å·¥ä½å åè¿è¡ï¼èä¸è½ç´æ¥è¯»å主å åä¸çåé**ã**å·¥ä½å 忝 JMM çä¸ä¸ªæ½è±¡æ¦å¿µï¼å¹¶ä¸çå®åå¨**ã  ### JMM ä¸ JVM å åç»æ JMM ä¸ Java å ååºåä¸çå ãæ ãæ¹æ³åºç并䏿¯åä¸ä¸ªå±æ¬¡çå åååï¼ä¸¤è åºæ¬æ²¡æå ³ç³»ã妿ä¸å®è¦å强对åºï¼é£ä»åéã主å åãå·¥ä½å åçå®ä¹çï¼ä¸»å å主è¦å¯¹åº Java å ä¸ç对象å®ä¾æ°æ®é¨åï¼å·¥ä½å åå对åºèææºæ çé¨ååºåï¼ä¸ä¸å¾å¯¹åºççåï¼ã  ### JMM ä¸è®¡ç®æºå åç»æ Java å 忍¡åå硬件å åä½ç³»ç»æä¹æ²¡æä»ä¹å ³ç³»ã硬件å åä½ç³»ç»æä¸åºåæ åå ãå¨ç¡¬ä»¶ä¸ï¼çº¿ç¨æ åå é½ä½äºä¸»å åä¸ãçº¿ç¨æ åå çä¸é¨åææ¶å¯è½åºç°å¨é«éç¼åå CPU å¯åå¨ä¸ãå¦ä¸å¾æç¤º:  å½å¯¹è±¡ååéå¯ä»¥åå¨å¨è®¡ç®æºä¸ä¸åçå ååºåæ¶ï¼è¿å°±å¯è½ä¼åºç°æäºé®é¢ã两个主è¦é®é¢æ¯: - çº¿ç¨æ´æ°(å)å°å ±äº«åéçå¯è§æ§ - 读åãæ£æ¥ååå ¥å ±äº«åéæ¶çç«äºæ¡ä»¶ #### å¯è§æ§é®é¢ï¼Visibility of Shared Objectsï¼ å¦æä¸¤ä¸ªæå¤ä¸ªçº¿ç¨å ±äº«ä¸ä¸ªå¯¹è±¡ï¼åä¸ä¸ªçº¿ç¨å¯¹å ±äº«å¯¹è±¡çæ´æ°å¯è½å¯¹å ¶ä»çº¿ç¨ä¸å¯è§ï¼å½ç¶å¯ä»¥ç¨ Java æä¾çå ³é®å volatileï¼ã åè®¾å ±äº«å¯¹è±¡æååå¨å¨ä¸»å åä¸ãå¨ CPU 1ä¸è¿è¡ç线ç¨å°å ±äº«å¯¹è±¡è¯»å ¥å®ç CPU ç¼ååä¿®æ¹ï¼ä½æ¯è¿æ²¡æ¥å¾åå·æ°å主å åï¼è¿æ¶å ¶ä» CPU ä¸è¿è¡ç线ç¨å°±ä¸ä¼çå°å ±äº«å¯¹è±¡çæ´æ¹ãè¿æ ·ï¼æ¯ä¸ªçº¿ç¨é½å¯è½ä»¥èªå·±ç线ç¨ç»æï¼å°±åºç°äºå¯è§æ§é®é¢ï¼å¦ä¸  #### ç«äºæ¡ä»¶ï¼Race Conditionsï¼ è¿ä¸ªå ¶å®å°±æ¯æä»¬å¸¸è¯´çãååæ§é®é¢ãã å¦æä¸¤ä¸ªæå¤ä¸ªçº¿ç¨å ±äº«ä¸ä¸ªå¯¹è±¡ï¼å¹¶ä¸å¤ä¸ªçº¿ç¨æ´æ°è¯¥å ±äº«å¯¹è±¡ä¸çåéï¼åå¯è½åºç°ç«äºæ¡ä»¶ã > ç±äº IO å¤ªæ ¢ï¼æ©æçæä½ç³»ç»å°±åæäºå¤è¿ç¨ï¼å³ä¾¿å¨åæ ¸ç CPU 䏿们ä¹å¯ä»¥ä¸è¾¹å¬çæï¼ä¸è¾¹å Bugï¼è¿ä¸ªå°±æ¯å¤è¿ç¨çåå³ã > > æä½ç³»ç»å 许æä¸ªè¿ç¨æ§è¡ä¸å°æ®µæ¶é´ï¼ä¾å¦ 50 毫ç§ï¼è¿äº 50 æ¯«ç§æä½ç³»ç»å°±ä¼éæ°éæ©ä¸ä¸ªè¿ç¨æ¥æ§è¡ï¼æä»¬ç§°ä¸ºâä»»å¡åæ¢âï¼ï¼è¿ä¸ª 50 毫ç§ç§°ä¸ºâæ¶é´çâã > >  > > è¿éçè¿ç¨å¨çå¾ IO æ¶ä¹æä»¥ä¼éæ¾ CPU ä½¿ç¨æï¼æ¯ä¸ºäºè®© CPU å¨è¿æ®µçå¾ æ¶é´éå¯ä»¥åå«çäºæ ï¼è¿æ ·ä¸æ¥ CPU ç使ç¨ç就䏿¥äºï¼æ¤å¤ï¼å¦æè¿æ¶æå¦å¤ä¸ä¸ªè¿ç¨ä¹è¯»æä»¶ï¼è¯»æä»¶çæä½å°±ä¼æéï¼ç£ç驱å¨å¨å®æä¸ä¸ªè¿ç¨ç读æä½åï¼åç°ææéçä»»å¡ï¼å°±ä¼ç«å³å¯å¨ä¸ä¸ä¸ªè¯»æä½ï¼è¿æ · IO ç使ç¨çä¹ä¸æ¥äºã > > æ¯ä¸æ¯å¾ç®åçé»è¾ï¼ä½æ¯ï¼è½ç¶çä¼¼ç®åï¼æ¯æå¤è¿ç¨åæ¶å¤ç¨å¨æä½ç³»ç»çåå±å²ä¸å´å ·æéç¨ç¢æä¹ï¼Unix å°±æ¯å 为解å³äºè¿ä¸ªé®é¢èååªå¤©ä¸çã > > æ©æçæä½ç³»ç»åºäºè¿ç¨æ¥è°åº¦ CPUï¼ä¸åè¿ç¨é´æ¯ä¸å ±äº«å å空é´çï¼æä»¥è¿ç¨è¦åä»»å¡åæ¢å°±è¦åæ¢å åæ å°å°åï¼èä¸ä¸ªè¿ç¨åå»ºçææçº¿ç¨ï¼é½æ¯å ±äº«ä¸ä¸ªå å空é´çï¼æä»¥çº¿ç¨åä»»å¡åæ¢ææ¬å°±å¾ä½äºãç°ä»£çæä½ç³»ç»é½åºäºæ´è½»éççº¿ç¨æ¥è°åº¦ï¼ç°å¨æä»¬æå°çâä»»å¡åæ¢â齿¯æâ线ç¨åæ¢âã > > Java å¹¶åç¨åºé½æ¯åºäºå¤çº¿ç¨çï¼èªç¶ä¹ä¼æ¶åå°ä»»å¡åæ¢ï¼ä¹è®¸ä½ æ³ä¸å°ï¼ä»»å¡åæ¢ç«ç¶ä¹æ¯å¹¶åç¼ç¨éè¯¡å¼ Bug çæºå¤´ä¹ä¸ãä»»å¡åæ¢çæ¶æºå¤§å¤æ°æ¯å¨æ¶é´çç»æçæ¶åï¼æä»¬ç°å¨åºæ¬é½ä½¿ç¨é«çº§è¯è¨ç¼ç¨ï¼é«çº§è¯è¨é䏿¡è¯å¥å¾å¾éè¦å¤æ¡ CPU æä»¤å®æï¼ä¾å¦ count += 1ï¼è³å°éè¦ä¸æ¡ CPU æä»¤ã > > - æä»¤ 1ï¼é¦å ï¼éè¦æåé count ä»å åå è½½å° CPU çå¯åå¨ï¼ > - æä»¤ 2ï¼ä¹åï¼å¨å¯åå¨ä¸æ§è¡ +1 æä½ï¼ > - æä»¤ 3ï¼æåï¼å°ç»æåå ¥å åï¼ç¼åæºå¶å¯¼è´å¯è½åå ¥çæ¯ CPU ç¼åè䏿¯å åï¼ã > > æä½ç³»ç»åä»»å¡åæ¢ï¼å¯ä»¥åçå¨ä»»ä½ä¸æ¡ CPU æä»¤æ§è¡å®ï¼æ¯çï¼æ¯ CPU æä»¤ï¼è䏿¯é«çº§è¯è¨éç䏿¡è¯å¥ãè¿æ ·ä¸åæ¥çæä½ï¼å°±ä¼åºç° bugã æ³è±¡ä¸ä¸ï¼å¦æçº¿ç¨ A å°ä¸ä¸ªå ±äº«å¯¹è±¡çåéè¯»å ¥å°å®ç CPU ç¼åä¸ãæ¤æ¶ï¼çº¿ç¨ B æ§è¡ç¸åçæä½ï¼ä½æ¯è¿å ¥ä¸åç CPU ç¼åãç°å¨çº¿ç¨ A æ§è¡ +1 æä½ï¼çº¿ç¨ B ä¹è¿æ ·åãç°å¨è¯¥åéå¢å äºä¸¤æ¬¡ï¼å¨æ¯ä¸ª CPU ç¼åä¸ä¸æ¬¡ã 妿è¿äºå¢éæ¯æé¡ºåºæ§è¡çï¼ååéç»æä¼æ¯ 3ï¼å¹¶å°åå§å¼ +2 åå主å åã使¯ï¼è¿ä¸¤ä¸ªå¢éæ¯åæ¶æ§è¡çï¼æ²¡æéå½ç忥ãä¸ç®¡å°åªä¸ªçº¿ç¨çç»æåå主å åï¼æ´æ°åçå¼åªæ¯åå§å¼é« 1ï¼æ¾ç¶æ¯æé®é¢çãå¦ä¸ï¼å½ç¶å¯ä»¥ç¨ Java æä¾çå ³é®å Synchronizedï¼  #### æåºæ§é®é¢ 顾åæä¹ï¼æåºæ§æçæ¯ç¨åºæç §ä»£ç çå åé¡ºåºæ§è¡ãç¼è¯å¨ä¸ºäºä¼åæ§è½ï¼ææ¶å伿¹åç¨åºä¸è¯å¥çå å顺åºï¼ä¾å¦ç¨åºä¸ï¼âa=6ï¼b=7ï¼âç¼è¯å¨ä¼ååå¯è½åæâb=7ï¼a=6ï¼âï¼å¨è¿ä¸ªä¾åä¸ï¼ç¼è¯å¨è°æ´äºè¯å¥ç顺åºï¼ä½æ¯ä¸å½±åç¨åºçæç»ç»æã è¿ä¸ªå°±æ¯æä»¬ä¸æè¯´å°ç代ç ä¹±åºæ§è¡ä¼åã ä¸è¿ææ¶åç¼è¯å¨åè§£éå¨çä¼åå¯è½å¯¼è´ææ³ä¸å°ç Bugã > å¨ Java é¢åä¸ä¸ªç»å ¸çæ¡ä¾å°±æ¯å©ç¨å鿣æ¥å建åä¾å¯¹è±¡ï¼ä¾å¦ä¸é¢ç代ç ï¼å¨è·åå®ä¾ getInstance() çæ¹æ³ä¸ï¼æä»¬é¦å 夿 instance æ¯å¦ä¸ºç©ºï¼å¦æä¸ºç©ºï¼åéå® Singleton.class 并忬¡æ£æ¥ instance æ¯å¦ä¸ºç©ºï¼å¦æè¿ä¸ºç©ºåå建 Singleton çä¸ä¸ªå®ä¾ã > > ```java > public class Singleton { > static Singleton instance; > static Singleton getInstance(){ > if (instance == null) { > synchronized(Singleton.class) { > if (instance == null) > instance = new Singleton(); > } > } > return instance; > } > } > ``` > > å设æä¸¤ä¸ªçº¿ç¨ AãB åæ¶è°ç¨ getInstance() æ¹æ³ï¼ä»ä»¬ä¼åæ¶åç° instance == null ï¼äºæ¯åæ¶å¯¹ Singleton.class å éï¼æ¤æ¶ JVM ä¿è¯åªæä¸ä¸ªçº¿ç¨è½å¤å éæåï¼å设æ¯çº¿ç¨ Aï¼ï¼å¦å¤ä¸ä¸ªçº¿ç¨åä¼å¤äºçå¾ ç¶æï¼å设æ¯çº¿ç¨ Bï¼ï¼çº¿ç¨ A ä¼å建ä¸ä¸ª Singleton å®ä¾ï¼ä¹åéæ¾éï¼ééæ¾åï¼çº¿ç¨ B 被å¤éï¼çº¿ç¨ B 忬¡å°è¯å éï¼æ¤æ¶æ¯å¯ä»¥å éæåçï¼å éæååï¼çº¿ç¨ B æ£æ¥ instance == null æ¶ä¼åç°ï¼å·²ç»åå»ºè¿ Singleton å®ä¾äºï¼æä»¥çº¿ç¨ B ä¸ä¼åå建ä¸ä¸ª Singleton å®ä¾ã > > è¿çä¸å»ä¸åé½å¾å®ç¾ï¼æ æå¯å»ï¼ä½å®é ä¸è¿ä¸ª getInstance() æ¹æ³å¹¶ä¸å®ç¾ãé®é¢åºå¨åªéå¢ï¼ > > åºå¨ new æä½ä¸ï¼æä»¬ä»¥ä¸ºç new æä½åºè¯¥æ¯ï¼ > > 1. åé ä¸åå å Mï¼ > 2. å¨å å M ä¸åå§å Singleton å¯¹è±¡ï¼ > 3. ç¶å M çå°åèµå¼ç» instance åéã > > 使¯å®é ä¸ä¼ååçæ§è¡è·¯å¾å¯è½æ¯è¿æ ·çï¼ > > 1. åé ä¸åå å Mï¼ > 2. å° M çå°åèµå¼ç» instance åéï¼ > 3. æåå¨å å M ä¸åå§å Singleton 对象ã > > ä¼ååä¼å¯¼è´ä»ä¹é®é¢å¢ï¼æä»¬åè®¾çº¿ç¨ A å æ§è¡ getInstance() æ¹æ³ï¼å½æ§è¡å®æä»¤ 2 æ¶æ°å¥½åçäºçº¿ç¨åæ¢ï¼åæ¢å°äºçº¿ç¨ B ä¸ï¼å¦ææ¤æ¶çº¿ç¨ B 乿§è¡ getInstance() æ¹æ³ï¼é£ä¹çº¿ç¨ B 卿§è¡ç¬¬ä¸ä¸ªå¤ææ¶ä¼åç° instance != null ï¼æä»¥ç´æ¥è¿å instanceï¼èæ¤æ¶ç instance æ¯æ²¡æåå§åè¿çï¼å¦ææä»¬è¿ä¸ªæ¶åè®¿é® instance çæååéå°±å¯è½è§¦å空æéå¼å¸¸ã ### JMM ç¹æ§ JMM å°±æ¯ç¨æ¥è§£å³å¦ä¸é®é¢çã **JMMæ¯å´ç»çå¹¶åè¿ç¨ä¸å¦ä½å¤çå¯è§æ§ãååæ§åæåºæ§è¿ 3 个 ç¹å¾å»ºç«èµ·æ¥ç** - **å¯è§æ§**ï¼å¯è§æ§æ¯æå½ä¸ä¸ªçº¿ç¨ä¿®æ¹äºå ±äº«åéçå¼ï¼å ¶ä»çº¿ç¨è½å¤ç«å³å¾ç¥è¿ä¸ªä¿®æ¹ãJava ä¸ç volatileãsynchronziedãfinal é½å¯ä»¥å®ç°å¯è§æ§ - **ååæ§**ï¼å³ä¸ä¸ªæä½æè å¤ä¸ªæä½ï¼è¦ä¹å ¨é¨æ§è¡å¹¶ä¸æ§è¡çè¿ç¨ä¸ä¼è¢«ä»»ä½å ç´ ææï¼è¦ä¹å°±é½ä¸æ§è¡ãå³ä½¿å¨å¤ä¸ªçº¿ç¨ä¸èµ·æ§è¡çæ¶åï¼ä¸ä¸ªæä½ä¸æ¦å¼å§ï¼å°±ä¸ä¼è¢«å ¶ä»çº¿ç¨æå¹²æ°ã - **æåºæ§**ï¼ è®¡ç®æºå¨æ§è¡ç¨åºæ¶ï¼ä¸ºäºæé«æ§è½ï¼ç¼è¯å¨åå¤çå¨å¸¸å¸¸ä¼å¯¹æä»¤åéæï¼ä¸è¬åä¸ºä»¥ä¸ 3 ç§  å线ç¨ç¯å¢éç¡®ä¿ç¨åºæç»æ§è¡ç»æå代ç é¡ºåºæ§è¡çç»æä¸è´ï¼ å¤çå¨å¨è¿è¡éæåºæ¶å¿ é¡»è¦èèæä»¤ä¹é´ç**æ°æ®ä¾èµæ§**ï¼ å¤çº¿ç¨ç¯å¢ä¸çº¿ç¨äº¤æ¿æ§è¡ï¼ç±äºç¼è¯å¨ä¼åéæçåå¨ï¼ä¸¤ä¸ªçº¿ç¨ä¸ä½¿ç¨çåéè½å¦ä¿è¯ä¸è´æ§æ¯æ æ³ç¡®å®çï¼ç»ææ æ³é¢æµ ### å åä¹é´çäº¤äºæä½ å ³äºä¸»å ååå·¥ä½å åä¹é´å ·ä½ç交äºåè®®ï¼å³ä¸ä¸ªåéå¦ä½ä»ä¸»å åæ·è´å°å·¥ä½å åãå¦ä½ä»å·¥ä½å å忥å主å åä¹ç±»çå®ç°ç»èï¼Java å 忍¡åä¸å®ä¹äº 8 ç§ æä½æ¥å®æï¼èææºå®ç°å¿ é¡»ä¿è¯æ¯ä¸ç§æä½é½æ¯ååçãä¸å¯åæåçï¼double å long ç±»åä¾å¤ï¼ - **lock**ï¼éå®ï¼ï¼ä½ç¨äºä¸»å åçåéï¼å®æä¸ä¸ªåéæ è¯ä¸ºä¸æ¡çº¿ç¨ç¬å çç¶æã - **unlock**ï¼è§£éï¼ï¼ä½ç¨äºä¸»å åçåéï¼å®æä¸ä¸ªå¤äºéå®ç¶æçåééæ¾åºæ¥ï¼éæ¾åçåéæå¯ä»¥è¢«å ¶ä»çº¿ç¨éå®ã - **read**ï¼è¯»åï¼ï¼ä½ç¨äºä¸»å åçåéï¼å®æä¸ä¸ªåéçå¼ä»ä¸»å åä¼ è¾å°çº¿ç¨çå·¥ä½å åä¸ï¼ä»¥ä¾¿éåçload å¨ä½ä½¿ç¨ã - **load**ï¼è½½å ¥ï¼ï¼ä½ç¨äºå·¥ä½å åçåéï¼å®æ read æä½ä»ä¸»å åä¸å¾å°çåé弿¾å ¥å·¥ä½å åçåé坿¬ä¸ã - **use**ï¼ä½¿ç¨ï¼ï¼ä½ç¨äºå·¥ä½å åçåéï¼å®æå·¥ä½å åä¸ä¸ä¸ªåéçå¼ä¼ éç»æ§è¡å¼æï¼æ¯å½èææºéå°ä¸ä¸ªéè¦ä½¿ç¨å°åéçå¼çåèç æä»¤æ¶å°ä¼æ§è¡è¿ä¸ªæä½ã - **assign**ï¼èµå¼ï¼ï¼ä½ç¨äºå·¥ä½å åçåéï¼å®æä¸ä¸ªä»æ§è¡å¼ææ¥æ¶å°çå¼èµç»å·¥ä½å åçåéï¼æ¯å½èææºéå°ä¸ä¸ªç»åéèµå¼çåèç æä»¤æ¶æ§è¡è¿ä¸ªæä½ã - **store**ï¼åå¨ï¼ï¼ä½ç¨äºå·¥ä½å åçåéï¼å®æå·¥ä½å åä¸ä¸ä¸ªåéçå¼ä¼ éå°ä¸»å åä¸ï¼ä»¥ä¾¿éåç writeæä½ä½¿ç¨ã - **write**ï¼åå ¥ï¼ï¼ä½ç¨äºä¸»å åçåéï¼å®æ store æä½ä»å·¥ä½å åä¸å¾å°çåéç弿¾å ¥ä¸»å åçåéä¸ã 妿éè¦æä¸ä¸ªåéä»ä¸»å åå¤å¶å°å·¥ä½å åï¼é£å°±è¦é¡ºåºå°æ§è¡ **read å load æä½**ï¼å¦æè¦æåéä»å·¥ä½å å忥å主å åï¼å°±è¦é¡ºåºå°æ§è¡ **store å write æä½**ãæ³¨æï¼**Java å 忍¡ååªè¦æ±ä¸è¿°ä¸¤ä¸ªæä½å¿ é¡»æé¡ºåºæ§è¡ï¼è没æä¿è¯æ¯è¿ç»æ§è¡**ãä¹å°±æ¯è¯´ read ä¸ load ä¹é´ãstore ä¸write ä¹é´æ¯å¯æå ¥å ¶ä»æä»¤çï¼å¦å¯¹ä¸»å åä¸çåé aãb è¿è¡è®¿é®æ¶ï¼ä¸ç§å¯è½åºç°é¡ºåºæ¯ read aãread bãload bãload aã  餿¤ä¹å¤ï¼Java å 忍¡åè¿è§å®äºå¨æ§è¡ä¸è¿° 8 ç§åºæ¬æä½æ¶å¿ 须满足å¦ä¸è§å - ä¸å 许 read å loadãstore å write æä½ä¹ä¸åç¬åºç°ï¼å³ä¸å 许ä¸ä¸ªåéä»ä¸»å å读åäºä½å·¥ä½å å䏿¥åï¼æè ä»å·¥ä½å ååèµ·ååäºä½ä¸»å å䏿¥åçæ åµåºç°ã - ä¸å 许ä¸ä¸ªçº¿ç¨ä¸¢å¼å®çæè¿ç assign æä½ï¼å³åéå¨å·¥ä½å å䏿¹åäºä¹åå¿ é¡»æè¯¥åå忥å主å åã - ä¸å 许ä¸ä¸ªçº¿ç¨æ åå å°ï¼æ²¡æåçè¿ä»»ä½ assign æä½ï¼ææ°æ®ä»çº¿ç¨çå·¥ä½å å忥å主å åã - ä¸ä¸ªæ°çåéåªè½å¨ä¸»å åä¸âè¯çâï¼ä¸å 许å¨å·¥ä½å åä¸ç´æ¥ä½¿ç¨ä¸ä¸ªæªè¢«åå§åï¼load æ assignï¼çåéï¼æ¢å¥è¯è¯´ï¼å°±æ¯å¯¹ä¸ä¸ªåé宿½ useãstore æä½ä¹åï¼å¿ é¡»å æ§è¡è¿äº assign å load æä½ã - ä¸ä¸ªåéå¨å䏿¶å»åªå è®¸ä¸æ¡çº¿ç¨å¯¹å ¶è¿è¡ lock æä½ï¼ä½ lock æä½å¯ä»¥è¢«å䏿¡çº¿ç¨é夿§è¡å¤æ¬¡ï¼å¤æ¬¡æ§è¡ lock åï¼åªææ§è¡ç¸å次æ°ç unlock æä½ï¼åéæä¼è¢«è§£éã - 妿坹ä¸ä¸ªåéæ§è¡ lock æä½ï¼é£å°ä¼æ¸ 空工ä½å å䏿¤åéçå¼ï¼å¨æ§è¡å¼æä½¿ç¨è¿ä¸ªåéåï¼éè¦éæ°æ§è¡ load æ assign æä½åå§ååéçå¼ã - 妿ä¸ä¸ªåéäºå 没æè¢« lock æä½éå®ï¼é£å°±ä¸å è®¸å¯¹å®æ§è¡ unlock æä½ï¼ä¹ä¸å è®¸å» unlock ä¸ä¸ªè¢«å ¶ä»çº¿ç¨éå®ä½çåéã - 对ä¸ä¸ªåéæ§è¡ unlock æä½ä¹åï¼å¿ é¡»å ææ¤åé忥å主å åä¸ï¼æ§è¡ storeãwrite æä½ï¼ã #### long å double ååéçç¹æ®è§å Java å 忍¡åè¦æ± lockï¼unlockï¼readï¼loadï¼assignï¼useï¼storeï¼write è¿ 8 个æä½é½å ·æååæ§ï¼ä½å¯¹äº64 ä½çæ°æ®ç±»åï¼ long æ doubleï¼ï¼å¨æ¨¡åä¸å®ä¹äºä¸æ¡ç¸å¯¹å®½æ¾çè§å®ï¼å è®¸èææºå°æ²¡æè¢« volatile 修饰ç 64 使°æ®ç读åæä½åå为两次 32 ä½çæä½æ¥è¿è¡ï¼å³å è®¸èææºå®ç°éæ©å¯ä»¥ä¸ä¿è¯ 64 使°æ®ç±»åçloadï¼storeï¼readï¼write è¿ 4 个æä½çååæ§ï¼å³ **long å double çéååæ§åå®**ã > 以 32 ä½ CPU 䏿§è¡ long ååéçåæä½ä¸ºä¾æ¥è¯´æè¿ä¸ªé®é¢ï¼long åå鿝 64 ä½ï¼å¨ 32 ä½ CPU 䏿§è¡åæä½ä¼è¢«æåæä¸¤æ¬¡åæä½ï¼åé« 32 ä½ååä½ 32 ä½ï¼å¦ä¸å¾æç¤ºï¼ã > >  妿å¤çº¿ç¨çæ åµä¸ double æ long ç±»åå¹¶æªå£°æä¸º volatileï¼å¯è½ä¼åºç°âå个åéâçæ°å¼ï¼ä¹å°±æ¯æ¢éåå¼ï¼ä¹éä¿®æ¹åçå¼ã è½ç¶ Java è§èå 许ä¸é¢çå®ç°ï¼ä½åç¨èææºä¸åºæ¬é½éç¨äºååæ§çæä½ï¼å æ¤å¨æ¥å¸¸ä½¿ç¨ä¸å ä¹ä¸ä¼åºç°è¯»åå°âå个åéâçæ åµï¼soï¼è¿ä¸ªäºè§£ä¸å°±è¡ã ### å è¡åçåå å è¡åçï¼happens-beforeï¼æ¯ Java å 忍¡åä¸å®ä¹ç两项æä½ä¹é´çååºå ³ç³»ï¼**妿æä½ A å è¡åçäºæä½ Bï¼é£ä¹ A çç»æå¯¹ B å¯è§**ã > Happens-Before 约æäºç¼è¯å¨çä¼åè¡ä¸ºï¼è½å 许ç¼è¯å¨ä¼åï¼ä½æ¯è¦æ±ç¼è¯å¨ä¼ååä¸å®éµå® Happens-Before è§åã happens-before å ³ç³»çåæéè¦å为**å线ç¨åå¤çº¿ç¨**çæ åµï¼ - **å线ç¨ä¸ç happens-before** åèç çå å顺åºå¤©ç¶å å« happens-before å ³ç³»ï¼å 为å线ç¨å å ±äº«ä¸ä»½å·¥ä½å åï¼ä¸å卿°æ®ä¸è´æ§çé®é¢ã å¨ç¨åºæ§å¶æµè·¯å¾ä¸é åçåèç happens-before é åçåèç ï¼å³é åçåèç æ§è¡å®ä¹åæä½ç»æå¯¹é åçåèç å¯è§ãç¶èï¼è¿å¹¶ä¸æå³çåè ä¸å®å¨åè ä¹åæ§è¡ãå®é ä¸ï¼å¦æåè ä¸ä¾èµåè çè¿è¡ç»æï¼é£ä¹å®ä»¬å¯è½ä¼è¢«éæåºã - **å¤çº¿ç¨ä¸ç happens-before** å¤çº¿ç¨ç±äºæ¯ä¸ªçº¿ç¨æå ±äº«åéç坿¬ï¼å¦ææ²¡æå¯¹å ±äº«åéå忥å¤çï¼çº¿ç¨ 1 æ´æ°æ§è¡æä½ A å ±äº«åéçå¼ä¹åï¼çº¿ç¨ 2 å¼å§æ§è¡æä½ Bï¼æ¤æ¶æä½ A 产ççç»æå¯¹æä½ B ä¸ä¸å®å¯è§ã ä¸ºäºæ¹ä¾¿ç¨åºå¼åï¼Java å 忍¡åå®ç°äºä¸è¿°çå è¡åçå ³ç³»ï¼â天ç¶çâå è¡åçå ³ç³»ï¼æ éä»»ä½åæ¥å¨åå©å°±åå¨ï¼ï¼ - **ç¨åºæ¬¡åºè§åï¼** ä¸ä¸ªçº¿ç¨å ï¼æç §ä»£ç 顺åºï¼ä¹¦åå¨åé¢çæä½å è¡åçäºä¹¦åå¨åé¢çæä½ã - **管ç¨éå®è§åï¼** ä¸ä¸ª unLock æä½å è¡åçäºåé¢å¯¹åä¸ä¸ªéç lock æä½ã - **volatileåéè§åï¼** 对ä¸ä¸ªåéçåæä½å è¡åçäºåé¢å¯¹è¿ä¸ªåéç读æä½ã - **ä¼ éè§åï¼** 妿æä½ A å è¡åçäºæä½ Bï¼èæä½ B åå è¡åçäºæä½ Cï¼åå¯ä»¥å¾åºæä½ A å è¡åçäºæä½ Cã - **线ç¨å¯å¨è§åï¼** Thread对象ç `start()` æ¹æ³å è¡åçäºæ¤çº¿ç¨çæ¯ä¸ä¸ªå¨ä½ã - **线ç¨ä¸æè§åï¼** å¯¹çº¿ç¨ `interrupt()` æ¹æ³çè°ç¨å è¡åçäºè¢«ä¸æçº¿ç¨çä»£ç æ£æµå°ä¸æäºä»¶çåçã - **线ç¨ç»ç»è§åï¼** 线ç¨ä¸ææçæä½é½å è¡åçäºçº¿ç¨çç»æ¢æ£æµï¼æä»¬å¯ä»¥éè¿`Thread.join()`æ¹æ³ç»æã`Thread.isAlive()`çè¿åå¼ææ®µæ£æµå°çº¿ç¨å·²ç»ç»æ¢æ§è¡ã - **对象ç»ç»è§åï¼** ä¸ä¸ªå¯¹è±¡çåå§å宿å è¡åçäºå®ç `finalize() `æ¹æ³çå¼å§ ### å åå±é ä¸è¾¹çä¸ç³»åæä½ä¿è¯äºæ°æ®ä¸è´æ§ï¼Java ä¸å¦ä½ä¿è¯åºå±æä½çæåºæ§åå¯è§æ§ï¼å¯ä»¥éè¿å åå±éã å åå±éæ¯è¢«æå ¥ä¸¤ä¸ª CPU æä»¤ä¹é´çä¸ç§æä»¤ï¼ç¨æ¥ç¦æ¢å¤ç卿令åçéæåºï¼åå±é䏿 ·ï¼ï¼ä»èä¿é**æåºæ§**çãå¦å¤ï¼ä¸ºäºè¾¾å°å±éçææï¼å®ä¹ä¼ä½¿å¤çå¨åå ¥ã读åå¼ä¹åï¼å°ä¸»å åçå¼åå ¥é«éç¼åï¼æ¸ ç©ºæ æéåï¼ä»èä¿é**å¯è§æ§**ã egï¼ ``` Store1; Store2; Load1; StoreLoad; //å åå±é Store3; Load2; Load3; ``` 对äºä¸é¢çä¸ç» CPU æä»¤ï¼Store表示åå ¥æä»¤ï¼Load表示读åæä»¤ï¼ï¼StoreLoad å±éä¹åç Store æä»¤æ æ³ä¸ StoreLoad å±éä¹åç Load æä»¤è¿è¡äº¤æ¢ä½ç½®ï¼å³**éæåº**ã使¯ StoreLoad å±éä¹ååä¹åçæä»¤æ¯å¯ä»¥äºæ¢ä½ç½®çï¼å³ Store1 å¯ä»¥å Store2 äºæ¢ï¼Load2 å¯ä»¥å Load3 äºæ¢ã 常è§ç 4 ç§å±é - **LoadLoad** å±éï¼ å¯¹äºè¿æ ·çè¯å¥ Load1; LoadLoad; Load2ï¼å¨ Load2 ååç»è¯»åæä½è¦è¯»åçæ°æ®è¢«è®¿é®åï¼ä¿è¯ Load1 è¦è¯»åçæ°æ®è¢«è¯»å宿¯ã - **StoreStore** å±éï¼ å¯¹äºè¿æ ·çè¯å¥ Store1; StoreStore; Store2ï¼å¨ Store2 ååç»åå ¥æä½æ§è¡åï¼ä¿è¯Store1 çåå ¥æä½å¯¹å ¶å®å¤çå¨å¯è§ã - **LoadStore** å±éï¼ å¯¹äºè¿æ ·çè¯å¥ Load1; LoadStore; Store2ï¼å¨ Store2 ååç»åå ¥æä½è¢«æ§è¡åï¼ä¿è¯Load1 è¦è¯»åçæ°æ®è¢«è¯»å宿¯ã - **StoreLoad** å±éï¼ å¯¹äºè¿æ ·çè¯å¥ Store1; StoreLoad; Load2ï¼å¨ Load2 ååç»ææè¯»åæä½æ§è¡åï¼ä¿è¯Store1 çåå ¥å¯¹ææå¤çå¨å¯è§ãå®çå¼éæ¯åç§å±é䏿大çï¼å²å·åç¼å²å¨ï¼æ¸ ç©ºæ æåéåï¼ãå¨å¤§å¤æ°å¤çå¨çå®ç°ä¸ï¼è¿ä¸ªå±éä¹è¢«ç§°ä¸º**å ¨è½å±é**ï¼å ¼å ·å ¶å®ä¸ç§å åå±éçåè½ã Java ä¸å¯¹å åå±éç使ç¨å¨ä¸è¬ç代ç ä¸ä¸å¤ªå®¹æè§å°ï¼å¸¸è§çæ volatile å synchronized å ³é®å修饰ç代ç åï¼è¿å¯ä»¥éè¿ Unsafe è¿ä¸ªç±»æ¥ä½¿ç¨å åå±éãï¼ä¸ä¸ç« æ¯æ¯è¿äºï¼ å¢å¦ï¼Java å 忍¡åå°±æ¯éè¿ä»¥ä¸å®ä¹çè¿äºæ¥è§£å³å¯è§æ§ãååæ§åæåºæ§é®é¢çã ## åè ãæ·±å ¥çè§£ Java èææºã第äºç ãJava å¹¶åç¼ç¨å®æã http://tutorials.jenkov.com/java-concurrency/java-memory-model.html https://juejin.im/post/5bf2977751882505d840321d#heading-5 http://rsim.cs.uiuc.edu/Pubs/popl05.pdf http://ifeve.com/wp-content/uploads/2014/03/JSR133䏿ç.pdf