# 常è§é®é¢ï¼å¿
çï¼
## 为ä»ä¹è¦ååç¬å¼ä¸ä¸ªé¢è¯çªå»çï¼
JavaGuide å·²ç»æäºå¨çº¿é
è¯»çæ¬ï¼å°åï¼https://javaguide.cn/ï¼ï¼é
读ä½éªä¹å¾ä¸éï¼ä¸ºä»ä¹æè¿è¦åè±è¿ä¹å¤æ¶é´åç¬å¼ä¸ä¸ªé¢è¯çªå»çå¢ï¼
1. å¾å¤åå¦ç±äºæäºåå æ¯è¾å欢ç PDF çµåçæè
ææå°çéæ±ï¼[JavaGuide](https://javaguide.cn/) å项ç®å
容è¿å¤ï¼ä¸å¤ªéåæ´çæ PDF çæ¬ï¼
2. ãJavaGuide é¢è¯çªå»çã转为é¢è¯æé ï¼å
å®¹ç¸æ¯äº[JavaGuide](https://javaguide.cn/) åé¡¹ç®æ´ç²¾ç®ã
## å¦ä½è·åææ°çæ¬ï¼
ä½ å¯ä»¥éè¿æçå
¬ä¼å·è·åå° **ãJavaGuide é¢è¯çªå»çã** çææ°çæ¬ã
## å¦ä½å¦ä¹ æ¬é¡¹ç®ï¼
ä¸è®ºæ¯å¨çº¿çæ¬è¿æ¯ PDF çæ¬é½æä¾äºé常详ç»çç®å½ï¼å»ºè®®å¯ä»¥ä»å¤´å°å°¾çä¸éï¼å¦æåºç¡ä¸éçè¯ä¹å¯ä»¥æèªå·±éè¦çç« èæ¥çãççè¿ç¨ä¸èªå·±è¦å¤æèï¼ç¢°å°ä¸æçå°æ¹ï¼èªå·±è®°å¾è¦å¤æç´¢ï¼éè¦è®°å¿çå°æ¹ä¹ä¸è¦åå¬èªå·±çèåã
## 为ä»ä¹ä¼æå°é¨åæç« æ æ³æ¥çï¼
ãJavaGuide é¢è¯çªå»çãå
±æ 40+ç¯æç« ï¼ä»
æ 4 ç¯æç« æ¯æç[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)ä¸å±ï¼å±äºæçå
é¨å°å[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)ä¸çæç« ï¼ä¸å½±åæ´ä½é
读ä½éªã
## å¦ä½è´¡ç®ï¼
大家é
读è¿ç¨ä¸å¦æéå°é误æè
å¯ä»¥å®åçå°æ¹ï¼å¯ä»¥å¨ Github/Gitee ç issue åºä¸æäº¤æµï¼
- Githubï¼https://github.com/Snailclimb/JavaGuide-Interview
- Giteeï¼https://gitee.com/SnailClimb/JavaGuide-Interview
æè
ï¼ä½ å¯ä»¥éè¿é®ç®± [email protected]_ ä¸æäº¤æµã
å¸æå¤§å®¶ç»ææåé¦çæ¶åå¯ä»¥æç
§å¦ä¸æ ¼å¼ï¼
> é®é¢ï¼æè¿°æ¸
æ¥åªä¸ç¯æç« çæè¿°åå¨é®é¢ã
>
> æ¹è¿ï¼æè¿°æ¸
æ¥å¦ä½å»æ¹è¿æé®é¢çæè¿°ã
>
> åèææ¡£ï¼å¯éï¼ï¼ç¸å
³çä¸äºåèèµææ¯å¦å®æ¹ææ¡£çæè¿°ã书ç±ä¸çæè¿°ã
ä¸ºäºæé«åç¡®æ§å·²ç»ä¸å¿
è¦çæ¶é´è±è´¹ï¼å¸æå¤§å®¶å°½éç¡®ä¿èªå·±æ³æ³çåç¡®æ§ã
------
# é¢è¯æåï¼é
奿ç¨ï¼
**ãJava é¢è¯æåã** æ¯æç[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)çä¸ä¸ªå
é¨å°åï¼åãJavaGuide é¢è¯çªå»çãçå
容äºè¡¥ãç¸æ¯äºå¼æºçæ¬æ¥è¯´ï¼ãJava é¢è¯æåãæ·»å äºä¸é¢è¿äºå
容ï¼ä¸ä»
ä»
æ¯è¿äºå
容ï¼ï¼
- 10+ ç¯æç« ææææä½ å¦ä½åå¤é¢è¯ã
- æ´å
¨é¢çå
«è¡æé¢è¯é¢ï¼ç³»ç»è®¾è®¡ãå¸¸è§æ¡æ¶ãåå¸å¼ãé«å¹¶å ......ï¼ã
- ä¼è´¨é¢ç»ç²¾éã
- ææ¯é¢è¯é¢èªæµã
- ç»çº§æ»ç¥ï¼æå©äºä¸ªäººæé¿çç»éªï¼ã
## å
容æ¦è§

### é¢è¯åå¤ç¯
å¨ **ãé¢è¯åå¤ç¯ã** ï¼æåäº 10+ ç¯æç« ææææä½ å¦ä½åå¤é¢è¯ï¼æ¶µç项ç®ç»éªãç®åç¼åãæºç å¦ä¹ ãç®æ³åå¤ãé¢è¯èµæºçå
容ã

å¦å¤ï¼èèå°å¾å¤å°ä¼ä¼´ç¼ºå°é¡¹ç®ç»åï¼æè¿æ¨èäºå¾å¤å°ä¼ä½ä¼è´¨ç宿项ç®ï¼æè§é¢ä¹æå¼æºé¡¹ç®ï¼æä¸å¡ç³»ç»ï¼ä¹æåç§å«é鿝è¾é«çè½®å类项ç®ã

### ææ¯é¢è¯é¢ç¯
**ãææ¯é¢è¯é¢ç¯ã** çå
容å JavaGuide 弿ºçæ¬äºè¡¥ï¼ä¸ä»
ä»
å
æ¬æåºæ¬ç Javaãå¸¸è§æ¡æ¶çå
«è¡æï¼è¿å
æ¬ç³»ç»è®¾è®¡ãåå¸å¼ãé«å¹¶åçè¿é¶å
容ã

### é¢ç»ç¯
å¤äººäº:â**ä»å±±ä¹ç³ï¼å¯ä»¥æ»ç**â ãåäºå¦ä¹ åé´å«äººçé¢è¯çæåç»éªæè
失败çæè®ï¼å¯ä»¥è®©èªå·±å°èµ°è®¸å¤å¼¯è·¯ã
**ãé¢ç»ç¯ã** 主è¦ä¼å享ä¸äºé«è´¨éç Java å端é¢ç»ï¼ææ ¡æçï¼ä¹æç¤¾æçï¼æå¤§åçï¼ä¹æä¸å°åçã
å¦æä½ æ¯éç§ççåå¦ï¼ä¹è½å¨è¿äºæç« 䏿¾å°å¯¹åºçéç§ççåå¦åçé¢ç»ã

å¹¶ä¸ï¼[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)è¿æä¸é¨å享é¢ç»åé¢è¯é¢çä¸é¢ï¼éé¢ä¼å享å¾å¤ä¼è´¨çé¢ç»åé¢è¯é¢ã



### ææ¯é¢è¯é¢èªæµç¯
为äºè®©å°ä¼ä¼´ä»¬èªæµä»¥æ£æ¥èªå·±çææ¡æ
åµï¼æè¿æ¨åºäº **ãææ¯é¢è¯é¢èªæµã** ç³»åãä¸è¿ï¼ç®ååªæ´æ°äº Java åæ°æ®åºçèªæµï¼æ£å¨æç»æ´æ°ä¸ã

### ç»çº§æ»ç¥ç¯
**ãç»çº§æ»ç¥ç¯ã** è¿ä¸ªç³»å主è¦å
容ä¸äºæå©äºä¸ªäººæé¿çç»éªå享ã

æ¯ä¸ç¯å
容é½é常干货ï¼ä¸å°çåçäºä¹å表示æ¶è·æ¼«æ¼«ãä¸è¿ï¼æéè¦çè¿æ¯ç¥è¡åä¸ã
## æçå
¶ä»èµæº
é¤äº **ãJava é¢è¯æåã** ä¹å¤ï¼æçè¿æ **ãJava å¿
读æºç ç³»åã**ï¼ç®åå·²ç»æ´çäº Dubbo 2.6.x ãNetty 4.xãSpringBoot2.1 çæºç ï¼ã **ãä»é¶å¼å§åä¸ä¸ª RPC æ¡æ¶ã**ï¼å·²æ´æ°å®ï¼ ã**ãKafka 常è§é¢è¯é¢/ç¥è¯ç¹æ»ç»ã** çå¤ä¸ªä¸å±å°åã

å¦å¤ï¼æçè¿ä¼æè¯»ä¹¦æ´»å¨ãå¦ä¹ æå¡ãç®åä¿®æ¹ãå
è´¹æé®ãæµ·é Java ä¼è´¨é¢è¯èµæºä»¥ååç§ä¸å®æ¶çç¦å©ã

## æç鿶伿
两年åï¼æççå®ä»·æ¯ **50/å¹´** ï¼è¿æ¯æççæä½å®ä»·ï¼æè¿ééäº 33 å
伿 å¸ãæ£é¤äºæçæç»è´¹ï¼åäºåç§ç¦å©ä¹åï¼å ä¹å°±æ¯çº¯ç²¹åå
¬çã
æå
´è¶£çå°ä¼ä¼´å¯ä»¥ççæå¨ 2020-01-03 åç头æ¡ï¼[åäºä¸ä¸ªå¾ä¹
没æ¢åçäºæ
](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486049&idx=1&sn=e0161b409e8f164251bdaa0c83a476bc&chksm=cea245aaf9d5ccbcafdb95a546d959508814085620aabdbb4385c4b8cea6e50bf157c3697041&token=1614894361&lang=zh_CN#rd)ï¼å»èå¤ä¸ä¸ã

éçæ¶é´æ¨ç§»ï¼æç积累çå¹²è´§èµæºè¶æ¥è¶å¤ï¼æè±å¨æçä¸çæ¶é´ä¹è¶æ¥è¶å¤ãäºæ¯ï¼æå°æççå®ä»·æ
¢æ
¢è°æ´ä¸ºäº **159/å¹´**ï¼åç»ä¼å°æççä»·æ ¼è°æ´ä¸º **199/å¹´**ï¼æ³è¦å å
¥çå°ä¼ä¼´ä¸å®è¦å°½æ©ã
ä½ å¯ä»¥æ·»å æçå¾®ä¿¡ï¼æ²¡æææºå·åç³è¯·å¾®ä¿¡ï¼æ
使ç¨ä¼ä¸å¾®ä¿¡ãä¸è¿ï¼è¯·æ¾å¿ï¼è¿ä¸ªå·çæ¶æ¯ä¹æ¯ææ¬äººå¤çï¼å¹³æ¶æå¸¸çè¿ä¸ªå¾®ä¿¡ï¼é¢åæçä¸å±ä¼æ å¸(æ¨èð)ï¼éæ¶ **130/å¹´** å å
¥(ç»è´¹åä»·)ï¼

æè
ä½ ä¹å¯ä»¥ç´æ¥ä½¿ç¨ä¸é¢è¿å¼ **20** å
ç伿 å¸ï¼**139/å¹´** å å
¥ã

è¿å
¥æçä¹åï¼ä½ å¯ä»¥ä¸ºèªå·±å¶å®ä¸ä¸ªç®æ ï¼æ¯å¦èªå·±æ³è¦è¿å
¥ææè¿ä¸éçå
¬å¸æè
è¾¾æä»ä¹æå°±ï¼ä¸å®è¦æ¯è¿ç®æç¹ææçç®æ ï¼ãå¾
ä½ å®æç®æ 卿çå享ä¹åï¼æä¼å°æççé¨ç¥¨è´¹éè¿ç»ä½ ã
**çè¯æ¬¢è¿åå¤é¢è¯çå°ä¼ä¼´å å
¥æçä¸èµ·äº¤æµï¼çå¿å¸æè½å¤å¸®å©å°æ´å¤å°ä¼ä¼´ï¼**
------
# æ´æ°è®°å½
V1.0â2020-03-07
第ä¸çãJavaGuide é¢è¯çªå»çãæ£å¼å®ç»åå¸ï¼
V1.1â2020-03-13
**ä¿®å¤é®é¢ï¼**
- [x] æ¯ä¸ªç« èé½éå¤ä¸éç®å½ï¼å¤æ»äºå¥½å¤é¡µ
- [x] 强çè¦æ±å ä¸çæ¬å·åå叿¥æï¼è¯»è
å°±ç¥éèªå·±çæ¯ä»ä¹çæ¬äº
- [x] 2.1 Java åºç¡é¨å p36+p37 æç« 龿¥å¤±æ
- [x] 3.3 è ThreadLocal é¨åçä¸ä¸ªç¬è¯¯
- [x] æ°´å°è¿éï¼æä¸ç¹å½±åé
读
- [x] ææ¡£ååå¼å¤´å ä¸çæ¬è¡¨ç¤ºç¤ºä¾ï¼V1.1-JavaGuide é¢è¯çªå»ç
**å¢å /ä¿®æ¹å
容ï¼**
- [x] ä¸å¤æé¢è¯é¨åï¼å®åäº âèªæä»ç»â é¨åçå
容并ä¸å¢å ææ¯é¢å¯è½ä¼é®åªäºæ¹åçé®é¢ãå¦ä½å¦ä¹ çå
容ã
- [x] 第ä¸èå¸¸è§æ¡æ¶é¨åå¢å äº Kafka 常è§é¢è¯é¢
V2.0â2020-04-02
**ä¿®å¤é®é¢ï¼**
- [x] ä¿®å¤äºé¨åéå«å,è¿é¨å对æ´ä½é
读影åä¸å¤§æä»¥ä¸åè¿å¤éè¿°ã
- [x] å¢å äºé¡µç
**å¢å /ä¿®æ¹å
容ï¼**
- [x] Java åºç¡ç¥è¯é¨åèªå¨æè£
箱添å äºä¸ä¸ªåèæç« ã
- [x] æä¾äºå¨çº¿é
è¯»çæ¬ï¼[https://snailclimb.gitee.io/javaguide-interview/#/](https://snailclimb.gitee.io/javaguide-interview/#/)
- [x] è®¡ç®æºåºç¡è¿ä¸ç« èå¢å äºï¼æä½ç³»ç»å¸¸è§é®é¢æ»ç»ï¼è¿ç¯æç« 乿´æ°å¨äºå
¬ä¼å·ï¼[æåé¢è¯å®ä¹é´å
³äºæä½ç³»ç»çä¸åºå¯¹å¼ï¼åäºå¾ä¹
ï¼å¸æå¯¹ä½ æå¸®å©ï¼](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486468&idx=1&sn=7189b610fbb300ed7f5d5b71e331c8f4&chksm=cea243cff9d5cad92819361ed40cabc8607f225e2f5c8f96b393cb95b5731086856349bdc517&token=1220790017&lang=zh_CN#rd)
V3.0â2020-06-16
- [x] ä¿®å¤å¤åºé¨å读è
æå°äºç¬è¯¯
- [x] 第ä¹ç« - **çå®å¤§åé¢è¯ç°åº** å¢å äº **æåé¿éé¢è¯å®ç䏿¬¡éé
(ä¸)**ï¼ä¸ç¯è±äº Guide å¾å¤æ¶é´çæç« ï¼åå¨å
¬ä¼å·ä¸é
è¯»ä¸æ¯è®å¥½ï¼ç»å¯¹å¹²è´§~~~ï¼
- [x] å¢å ä¸ä¼æå¾
ç **Netty 常è§é¢è¯é¢æ»ç»**
- [x] å¢å Java é¢è¯ç¸å
³ç弿ºé¡¹ç®
- [x] å¢å ç®æ³ç±»é¢è¯ç¸å
³ç弿ºé¡¹ç®
V4.0â2020-10-16
**ä¿®å¤é®é¢ï¼**
- [x] ä¿®å¤é¨åæç« åèé
è¯»é¾æ¥
**å¢å /ä¿®æ¹å
容ï¼**
- [x] 夿é¢è¯é¨åéæå®å ï¼ç»åæäº 3 é¨åï¼
1. æ ¡æ/社æé¢è¯æå
2. ç¨åºåç®åä¹é
3. 大é¨åç¨åºåå¨é¢è¯åå¾å
³å¿çä¸äºé®é¢
- [x] Java åºç¡ãéåãå¤çº¿ç¨ãJVM é¨åéæå®å
- [x] æ°æ®ç»æé¨åéæå®å
- [x] æä½ç³»ç»é¨åéæå®å
- [x] Redis é¨åå
容éæå®å
- [x] å¢å äºç³»ç»è®¾è®¡é¢è¯æå
- [x] å¢å äº 18 éæå¸¸è§ç Spring Boot é¢è¯é¢ãä¸è¿ï¼è¿é¨åå
容ççæ¡æ´æ°å¨äº[ç¥è¯æç](http://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=100013795&idx=1&sn=aa2db4799c432bb944b6786ae0ec4c56&chksm=4ea1b92879d6303e9077546e2bc42a78f0cd3e18d9adb06e9f15e49e3d8337ec4bd384a25367#rd)ã
- [x] ä¼è´¨é¢ç»é¨åå¢å äºä¸¤ç¯è¯»è
é¢ç»ï¼å鿬ç§ã0 å®ä¹ ã0 æ¯èµ/项ç®ç»åã3 个æä¸å²¸ç¾åº¦ãå为|åè|è
¾è®¯|京ä¸|ç½æ|æ»´æ»´é¢ç»å享ï¼6 个 offerï¼
V5.0â2022-8-25
å
¨æ°çæ¬ï¼æç»å å
å®¹ï¼æç»å®åç²¾è¿ï¼
ä¸ä»
ä»
å±éäºä¸é¢è¿äºå·¥ä½ï¼
- [x] éæ°ç»å¶ 100+ å¾è§£
- [x] é¢è¯åå¤é¨åæ°å¢é¡¹ç®ç»éªæåãé¢è¯å¸¸è§è¯æ±æ«ç²çå
容ã
- [x] æ ¹æ®å½å Java é¢è¯å®é
æ
åµï¼å®åãJavaGuide é¢è¯çªå»çãæ¶åå°çææç¥è¯ç¹------
# 1. é¢è¯åå¤
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
é¢è¯åå¤é¨åå±äºè¡¥å
å
容ï¼ç²¾éèª[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)ï¼å°é¨åå
容å±äº[æçç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)ä¸å±ï¼è¿æçè§£ã
## 1.1 ç¨åºåé¢è¯æ±èæå
> æ¬æèéèª **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** çãé¢è¯åå¤ç¯ã
### åè¨
大家身边ä¸å®æå¾å¤ç¼ç¨æ¯ä½ å害使¯æ¾çå·¥ä½å¹¶æ²¡æä½ 好çæåï¼**ææ¯é¢è¯ä¸åäºç¼ç¨ï¼ç¼ç¨å害ä¸ä»£è¡¨ææ¯é¢è¯å°±ä¸å®è½è¿ã**
ç°å¨ä½ å»é¢ä¸ªè¯ï¼ä¸ç®ååå¤ä¸ä¸åï¼é£ç®ç´å°±æ¯å¾æªå£ä¸æãæä»¬å¤§é¨åé½åªæ¯æ®éäººï¼æ²¡æåè¿é¡¶çº§å¨åæè
è·å¾è¿é¡¶çº§å¤§èµå¥é¡¹ãå¨è¿æ ·ä¸ä¸ªææ¯é¢è¯æ°å´ä¸ï¼æä»¬éè¦è±è´¹å¾å¤ç²¾åæ¥åå¤é¢è¯ï¼æ¥æé«èªå·±çææ¯è½åãâ[é¢è¯é ç«ç®ï¼å·¥ä½æ§èºä¸é](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247491596&idx=1&sn=36fbf80922f71c200990de11514955f7&chksm=cea1afc7f9d626d1c70d5e54505495ac499ce6eb5e05ba4f4bb079a8563a84e27f17ceff38af&token=353590436&lang=zh_CN&scene=21#wechat_redirect)â å°±æ¯ç®åçä¸ä¸ªå¸¸æï¼é¢è®¡æªæ¥å¾ä¹
ä¹è¿æ¯ä¼è¿æ ·ã
åå¤é¢è¯ä¸çäºèå°èªææè
æ»è®°ç¡¬èé¢è¯é¢ã **ä¸å®ä¸è¦å¯¹é¢è¯æ±æä¾¥å¹¸å¿çãæéè¿éèªèº«ç¡¬ï¼** åä¸ä¸è¦è§å¾èªå·±çå ç¯é¢ç»ï¼çå ç¯é¢è¯é¢è§£æå°±è½éè¿é¢è¯äºãä¸å®è¦éä¸å¿æ¥æ·±å
¥å¦ä¹ ï¼
è¿ç¯æä¼ä»å®è§é¢åºåç®åèèå¦ä½åå¤ Java é¢è¯ã
### å°½æ©ä»¥æ±èä¸ºå¯¼åæ¥å¦ä¹
ææ¯æ¯è¾å»ºè®®è¿å¨å¦æ ¡çåå¦å°½å¯è½æ©ä¸ç¹ä»¥æ±èä¸ºå¯¼åæ¥å¦ä¹ çã
**è¿æ ·æ´æé对æ§ï¼å¹¶ä¸å¯ä»¥å¤§æ¦çåå°èªå·±å¤å¨è¿·è«çæ¶é´ï¼å¾å¤§ç¨åº¦ä¸è¿å¯ä»¥è®©èªå·±å°èµ°å¾å¤å¼¯è·¯ã**
使¯ï¼ä¸è¦æâ以æ±è为导åå¦ä¹ âç解为âæå°±ä¸ç¨å¦è¯¾å ä¸é£äºè®¡ç®æºåºç¡è¯¾ç¨äºâï¼
æå¨ä¹åçå¾å¤æ¬¡å享ä¸é½å¼ºè°è¿ï¼**ä¸å®è¦ç¨å¿å¦ä¹ è®¡ç®æºåºç¡ç¥è¯ï¼æä½ç³»ç»ãè®¡ç®æºç»æåçãè®¡ç®æºç½ç»çç䏿¯æ²¡æå®é
ç¨å¤çå¦ç§ï¼ï¼ï¼**
ä½ ä¼åç°å¤§åé¢è¯ä½ ä¼ç¨å°ï¼ä»¥åå·¥ä½ä¹åä½ ä¹ä¼ç¨å°ãæåå«å举 2 个ä¾åå§ï¼
- **é¢è¯ä¸** ï¼ååèãè
¾è®¯è¿äºå¤§åçææ¯é¢è¯ä»¥åå 乿æå
¬å¸çç¬è¯é½ä¼èæä½ç³»ç»ç¸å
³çé®é¢ã
- **å·¥ä½ä¸** ï¼å¨å®é
使ç¨ç¼åçæ¶åï¼ä½ ä¼åç°å¨æä½ç³»ç»ä¸å¯ä»¥æ¾å°å¾å¤ç¼åææ³çå½±åãæ¯å¦ CPU Cache ç¼åçæ¯å
åæ°æ®ç¨äºè§£å³ CPU å¤çé度åå
åä¸å¹é
çé®é¢ï¼å
åç¼åçæ¯ç¡¬çæ°æ®ç¨äºè§£å³ç¡¬ç访é®éåº¦è¿æ
¢çé®é¢ã忝妿ä½ç³»ç»å¨é¡µè¡¨æ¹æ¡åºç¡ä¹ä¸å¼å
¥äºå¿«è¡¨æ¥å éèæå°åå°ç©çå°åç转æ¢ãæä»¬å¯ä»¥æå¿«è¡¨ç解为ä¸ç§ç¹æ®çé«éç¼å²åå¨å¨ï¼Cacheï¼ã
**å¦ä½æ±è为导åå¦ä¹ å¢ï¼** ç®çæ¥è¯´å°±æ¯ï¼æ ¹æ®æèè¦æ±æ´çä¸ä»½ç®æ å²ä½çæè½æ¸
åï¼ç¶åæç
§æè½æ¸
åå»å¦ä¹ åæåã
1. ä½ é¦å
ææ¸
æ¥èªå·±è¦æ¾ä»ä¹å·¥ä½
2. ç¶åæ ¹æ®æèå²ä½çè¦æ±æ¢³çä¸ä»½æè½æ¸
å
3. æ ¹æ®æè½æ¸
åå好æç»çç®å
4. æååæç
§å»ºç«çè¦æ±å»å¦ä¹ åæåã
è¿å
¶å®ä¹æ¯ **以ç»ä¸ºå§** ææ³çè¿ç¨ã
**ä½ä¸ºä»¥ç»ä¸ºå§ï¼** ç®åæ¥è¯´ï¼ä»¥ç»ä¸ºå§å°±æ¯æä»¬å¯ä»¥ç«å¨ç»ææ¥èèé®é¢ï¼ä»ç»æåºåï¼æ ¹æ®ç»ææ¥ç¡®å®èªå·±è¦åçäºæ
ã
ä½ ä¼åç°ï¼å
¶å®å ä¹ä»»ä½é¢åé½å¯ä»¥ç¨å° **以ç»ä¸ºå§** çææ³ã
### äºè§£æéç®åçé»éæ¶é´
é¢è¯ä¹åï¼ä½ è¯å®æ¯å
è¦ææ¸
æ¥æ¥æåç§æçå
·ä½æ¶é´çã
æ£æè°éä¸é¶åï¼éä¹é¶åï¼éè¿äºè¿ä¸ªæ¶é´ï¼å¾å¤å
¬å¸é½æ²¡æ HC äºã
**ç§æä¸è¬ 7 æä»½å°±å¼å§äºï¼å¤§æ¦ä¸ç´æç»å° 9 æåºã**
**æ¥æä¸è¬ 3 æä»½å°±å¼å§äºï¼å¤§æ¦ä¸ç´æç»å° 4 æåºã**
å¾å¤å
¬å¸ï¼å°¤å
¶å¤§åï¼å°äº 9 æä¸æ¬(ç§æ)/3 æä¸æ¬ï¼æ¥æï¼ï¼å¾å¯è½å°±ä¼æ²¡æ HC äºãé¢è¯çè¯ä¸è¬é½æ¯è³å°æ¯ 3 轮起æ¥ï¼ä¸äºå¤§åæ¯å¦é¿éãåèå¯è½ä¼æ 5 è½®é¢è¯ã**é¢è¯å¤±è´¥è¯çä¸è¦ç´§ï¼æä¸é¢è¡¨ç°å·®çè¯ä¹ä¸è¦ç´§ï¼è°æ´å¥½å¿æãå䏿¯åä¸éæ©å¯¹å§ï¼ä½ è½æè¿ä¹å¤ä¼ä¸å¢! è°æ´å¿æã** ä»å¹´é¢è¯çè¯ï¼å ä¸ºç«æ
åå ï¼æäºå
¬å¸è¿æ¯å¯è½ä¼è¿æ¯éä¸å¨çº¿ä¸è¿è¡é¢è¯ãç¶åï¼è¿æ¯å ä¸ºç«æ
çå½±åï¼å¯è½ä¼æ¯å¾å¹´æ´é¾æ¾å·¥ä½ï¼å¯¹å¤§åå½±åè¾å°ï¼ã
### ç¥éå¦ä½è·åæèä¿¡æ¯
**1.ç®æ ä¼ä¸çå®ç½/å
¬ä¼å·** ï¼æåæ¶ææå¨çè·åç§æä¿¡æ¯çéå¾ã
**2.ç客ç½** : æ¯å¹´ç§æ/æ¥æï¼é½ä¼æå¤§æ¹éçå
¬å¸ä¼å°ç客ç½å叿èä¿¡æ¯ï¼å¹¶ä¸è¿ä¼æå¤§éçå
¬å¸åå·¥æ¥å°è¿éåå
æ¨çå¸åã
**3.è¶
级ç®å**
è¶
级ç®åç®åæ´åäºå大ä¼ä¸çæ ¡åæèå
¥å£ï¼å°åï¼https://www.wondercv.com/jobs/ã
å¦æä½ æ¯æ ¡æçè¯ï¼ç¹å»âæ ¡æç½ç³âå°±å¯ä»¥ç´æ¥è·³è½¬å°å大ä¼ä¸çæ ¡åæèå
¥å£çæ´å页é¢äºã

**4.认è¯çæå**
å¦æä½ æè®¤è¯çæåå¨ç®æ ä¼ä¸å·¥ä½çè¯ï¼ä½ ä¹å¯ä»¥æ¾ä»ä»¬äºè§£ç§æä¿¡æ¯ï¼å¹¶ä¸å¯ä»¥è®©ä»ä»¬å¸®ä½ å
æ¨ã
**5.宣讲ä¼ç°åº**
Guide 彿¶ä¹åå äºå åºå®£è®²ä¼ãä¸è¿ï¼ææ¯å¨èå·ä¸å¦ï¼é£è¾¹æ²¡ä»ä¹æ¯è¾å¥½ç妿 ¡ï¼ä¸è¬æ²¡æå
¬å¸å»å¼å®£è®²ä¼ãæä»¥ï¼æå½æ¶æ¯ç´æ¥è·å°æ¦æ±æ¥äºï¼åå äºæ¦æ±ç工大å¦ä»¥ååä¸ç§æå¤§å¦çå åºå®£è®²ä¼ãæ»ä½æè§è¿æ¯å¾ä¸éçï¼
**6.å
¶ä»**
æ ¡åå°±ä¸ä¿¡æ¯ç½ã妿 ¡è®ºåãç级 or 年级 QQ 群ãå大æèç½ç«æ¯å¦æå¾......
### å¤è±ç¹æ¶é´å®åç®å
ä¸å®ä¸å®ä¸å®è¦éè§ç®ååï¼æå们ï¼è³å°è¦è± 2~3 天æ¶é´æ¥ä¸é¨å®åèªå·±çç®åã
æè¿çäºå¾å¤ä»½ç®åï¼æ»¡æçå¾å°ï¼æç®åæ¿åºä¸ä»½æ¥è¯´åæä¸ä¸ï¼æ¬¢è¿å¨è¯è®ºåºè¡¥å
ï¼ã
**1.个人ä»ç»æ²¡å¤ªå¤å®ç¨çä¿¡æ¯ã**

ææ¯å客ãGithub 以å卿 ¡è·å¥ç»åçè¯ï¼è½å就尽éåå¨è¿éã ä½ å¯ä»¥åèä¸é¢ ð çæ¨¡æ¿è¿è¡ä¿®æ¹ï¼

**2.项ç®ç»åè¿äºç®åï¼å®å
¨æ²¡æè´¨éå¯è¨**

æ¯ä¸ä¸ªé¡¹ç®ç»åççå°±ä¸ä¸¤å¥è¯å¯ä»¥æè¿°äºä¹ï¼è¿æ¯èªå·±ä¸æ³åï¼è¿æ¯è¯´ä¸æ¯èªå·±åçï¼ä¸æ¢å¤åã
妿æé¡¹ç®çè¯ï¼ææ¯é¢è¯ç¬¬ä¸æ¥ï¼é¢è¯å®ä¸è¬é½æ¯è®©ä½ èªå·±ä»ç»ä¸ä¸ä½ ç项ç®ãä½ å¯ä»¥ä»ä¸é¢å 个æ¹åæ¥èèï¼
1. å¯¹é¡¹ç®æ´ä½è®¾è®¡çä¸ä¸ªæåï¼é¢è¯å®å¯è½ä¼è®©ä½ ç»ç³»ç»çæ¶æå¾ï¼
2. å¨è¿ä¸ªé¡¹ç®ä¸ä½ è´è´£äºä»ä¹ãåäºä»ä¹ãæ
ä»»äºä»ä¹è§è²
3. ä»è¿ä¸ªé¡¹ç®ä¸ä½ å¦ä¼äºé£äºä¸è¥¿ï¼ä½¿ç¨å°äºé£äºææ¯ï¼å¦ä¼äºé£äºæ°ææ¯ç使ç¨
4. ä½ æ¯å¦ä½åè°é¡¹ç®ç»æåååå¼åçæè
å¨éå°æä¸ä¸ªæ£æçé®é¢çæ¶åä½ æ¯å¦ä½è§£å³çåæè
è¯´ä½ å¨è¿ä¸ªé¡¹ç®ç¨äºä»ä¹ææ¯å®ç°äºä»ä¹åè½æ¯å¦ï¼ä¼åäºæ°æ®åºç设计åå°äºåä½å段ãç¨ redis åç¼åæé«äºè®¿é®é度ãä½¿ç¨æ¶æ¯éååå³°åéæµãè¿è¡äºæå¡æåå¹¶éæäº dubbo å nacos ççã
**3.è®¡ç®æºäºçº§è¿ä¸ªè¯ä¹¦å¯¹äºè®¡ç®æºä¸ä¸å®å
¨ä¸ç¨åäºï¼æ²¡æå«ééçã**

**4.æè½ä»ç»é®é¢å¤ªå¤§ã**

- ææ¯åè¯æå¥½è§è大å°åæ¯è¾å¥½ï¼æ¯å¦ java->Java ï¼spring boot -> Spring Boot ãè¿ä¸ªè½ç¶æäºé¢è¯å®ä¸ä¼ä»æï¼ä½æ¯å¾å¤é¢è¯å®é½ä¼å¨æè¿ä¸ªç»èçã
- æè½ä»ç»å¤ªæï¼æ²¡æäº®ç¹ãä¸éè¦å
¨æï¼æä¸ªé¢ååå¾å¥½å°±è¡äºï¼
- 对 Java åå°å¼åçé¨åæè½æ¯å¦ Spring Boot ççæåº¦ä»
ä»
为äºè§£ï¼æ æ³æ»¡è¶³ä¼ä¸çè¦æ±ã
ç¸å
³é
读ï¼[ç¨åºåç®åå°åºè¯¥æä¹åï¼æåªäºæ³¨æçç¹ï¼](https://articles.zsxq.com/id_kjg2e3l2gvb7.html)
### æåå夿æ¯é¢è¯åææç®æ³
é¢è¯ä¹åä¸å®è¦æååå¤ä¸ä¸å¸¸è§çé¢è¯é¢ï¼
- èªå·±é¢è¯ä¸å¯è½æ¶ååªäºç¥è¯ç¹ãé£äºç¥è¯ç¹æ¯éç¹ã
- é¢è¯ä¸åªäºé®é¢ä¼è¢«ç»å¸¸é®å°ãé¢è¯ä¸èªå·±æ¹å¦ä½åçã(强ç䏿¨èæ»è®°ç¡¬èï¼ç¬¬ä¸ï¼éè¿èè¿ç§æ¹å¼ä½ è½è®°ä½å¤å°ï¼è½è®°ä½å¤ä¹
ï¼ç¬¬äºï¼èé¢çæ¹å¼çå¦ä¹ å¾é¾åæä¸å»ï¼)
è¿åå
容åªä¼ä»ç»é¢è¯å¤§æ¦ä¼æ¶åå°åªæ¹é¢çç¥è¯ç¹ï¼å
·ä½è¿äºç¥è¯ç¹æ¶µçåªäºé®é¢ï¼åé¢çæç« æä»ç»å°ã
**Java** :
- Java åºç¡
- Java éå
- Java å¹¶å
- JVM
**è®¡ç®æºåºç¡** ï¼
- ç®æ³
- æ°æ®ç»æ
- è®¡ç®æºç½ç»
- æä½ç³»ç»
**æ°æ®åº** ï¼
- MySQL
- Redis
**å¸¸ç¨æ¡æ¶** ï¼
- Spring
- SpringBoot
- MyBatis
- Netty
- Zookeeper
- Dubbo
**åå¸å¼** :
- CAP ç论 å BASE ç论ãPaxos ç®æ³å Raft ç®æ³
- RPC
- åå¸å¼äºå¡
- åå¸å¼ ID
**é«å¹¶å** ï¼
- æ¶æ¯éå
- 读åå离&ååºå表
- è´è½½åè¡¡
**é«å¯ç¨** ï¼
- éæµ
- é级
- çæ

ä¸åç±»åçå
¬å¸å¯¹äºæè½çè¦æ±ä¾§éç¹æ¯ä¸åçæ¯å¦è
¾è®¯ãåèå¯è½æ´éè§è®¡ç®æºåºç¡æ¯å¦ç½ç»ãæä½ç³»ç»è¿æ¹é¢çå
容ãé¿éãç¾å¢è¿ç§å¯è½æ´éè§ä½ ç项ç®ç»åã宿è½åã
å
³äºå¦ä½åå¤ç®æ³é¢è¯è¯·çãJava é¢è¯æåãçãé¢è¯åå¤ç¯ãä¸å¯¹åºçæç« ã
### æååå¤èªæä»ç»
èªæä»ç»ä¸è¬æ¯ä½ åé¢è¯å®çç¬¬ä¸æ¬¡é¢å¯¹é¢æ£å¼äº¤æµï¼æ¢ä½æèä¸ä¸ï¼åå¦ä½ æ¯é¢è¯å®çè¯ï¼ä½ æ³å¬å°è¢«ä½ é¢è¯ç人å¦ä½ä»ç»èªå·±å¢ï¼ä¸å®ä¸æ¯å®¢å¥å°è¯´è¯´èªå·±å欢ç¼ç¨ãå¹³æ¶è±äºå¾å¤æ¶é´æ¥å¦ä¹ ãèªå·±çå
´è¶£ç±å¥½æ¯æçå§ï¼
æè§å¾ä¸ä¸ªå¥½çèªæä»ç»åºè¯¥å
å«è¿å ç¹è¦ç´ ï¼
1.
2. æéç¹æ¾å¨èªå·±å¨è¡çå°æ¹ä»¥åèªå·±çä¼å¿ä¹å¤ï¼
3. éç¹çªåºèªå·±çè½åæ¯å¦èªå·±çå®ä½ç bug çè½åç¹å«å害ï¼
ä»ç¤¾æåæ ¡æä¸¤ä¸ªè§åº¦æ¥ä¸¾ä¾åå§ï¼æä¸é¢ç两个ä¾åä»
ä¾åèï¼èªæä»ç»å¹¶ä¸éè¦æ»è®°ç¡¬èï¼è®°ä½è¦è¯´çè¦ç¹ï¼é¢è¯çæ¶åæ ¹æ®å
¬å¸çæ
åµä¸´åºåæ¥ä¹æ¯æ²¡é®é¢çãå¦å¤ï¼ç½ä¸ä¸è¬å»ºè®®çæ¯åå¤å¥½ä¸¤ä»½èªæä»ç»ï¼ä¸ä»½å¯¹ hr 说çï¼ä¸»è¦è®²è½çªåºèªå·±çç»åï¼ä¼çç¼ç¨ææ¯ä¸è¯å¸¦è¿ï¼å¦ä¸ä»½å¯¹ææ¯é¢è¯å®è¯´çï¼ä¸»è¦è®²èªå·±ä¼çææ¯ç»èå项ç®ç»éªã
**社æï¼**
> é¢è¯å®ï¼æ¨å¥½ï¼æå«ç¬ç§å¿ãæç®åæ 1 å¹´åçå·¥ä½ç»éªï¼çç»ä½¿ç¨ SpringãMyBatis çæ¡æ¶ãäºè§£ Java åºå±åçæ¯å¦ JVM è°ä¼å¹¶ä¸æç丰å¯çåå¸å¼å¼åç»éªã离å¼ä¸ä¸å®¶å
¬å¸æ¯å ä¸ºææ³å¨ææ¯ä¸å¾å°æ´å¤çé»ç¼ãå¨ä¸ä¸ä¸ªå
¬å¸æåä¸äºä¸ä¸ªåå¸å¼çµå交æç³»ç»çå¼åï¼è´è´£æå»ºäºæ´ä¸ªé¡¹ç®çåºç¡æ¶æå¹¶ä¸éè¿ååºå表解å³äºåå§æ°æ®åºä»¥åä¸äºç¸å
³è¡¨è¿äºåºå¤§çé®é¢ï¼ç®åè¿ä¸ªç½ç«æé«æ¯æ 10 ä¸äººåæ¶è®¿é®ãå·¥ä½ä¹ä½ï¼æå©ç¨èªå·±çä¸ä½æ¶é´åäºä¸ä¸ªç®åç RPC æ¡æ¶ï¼è¿ä¸ªæ¡æ¶ç¨å°äº Netty è¿è¡ç½ç»éä¿¡ï¼ ç®åæå·²ç»å°è¿ä¸ªé¡¹ç®å¼æºï¼å¨ Github 䏿¶è·äº 2k ç Star! 说å°ä¸ä½ç±å¥½çè¯ï¼ææ¯è¾å欢éè¿å客æ´çå享èªå·±æå¦ç¥è¯ï¼ç°å¨å·²ç»æ¯å¤ä¸ªå客平å°ç认è¯ä½è
ã çæ´»ä¸ææ¯ä¸ä¸ªæ¯è¾ç§¯æä¹è§ç人ï¼ä¸è¬ä¼éè¿è¿å¨æççæ¹å¼æ¥æ¾æ¾ãæä¸ç´é½é常æ³å å
¥è´µå
¬å¸ï¼æè§å¾è´µå
¬å¸çæååææ¯æ°å´æé½é叏忬¢ï¼æå¾
è½ä¸ä½ å
±äºï¼
**æ ¡æï¼**
> é¢è¯å®ï¼æ¨å¥½ï¼æå«ç§å¿ã大妿¶é´æä¸»è¦å©ç¨è¯¾å¤æ¶é´å¦ä¹ äº Java 以å SpringãMyBatis çæ¡æ¶ ã卿 ¡æé´åä¸è¿ä¸ä¸ªèè¯ç³»ç»çå¼åï¼è¿ä¸ªç³»ç»ç主è¦ç¨äº SpringãMyBatis å shiro è¿ä¸ç§æ¡æ¶ãæå¨å
¶ä¸ä¸»è¦æ
ä»»å端å¼åï¼ä¸»è¦è´è´£äºæé管çåè½æ¨¡åçæå»ºãå¦å¤ï¼æå¨å¤§å¦çæ¶ååå è¿ä¸æ¬¡è½¯ä»¶ç¼ç¨å¤§èµï¼æåæçå¢éåçå¨çº¿è®¢é¤ç³»ç»æåè·å¾äºç¬¬äºåçæç»©ãæè¿å©ç¨èªå·±çä¸ä½æ¶é´åäºä¸ä¸ªç®åç RPC æ¡æ¶ï¼è¿ä¸ªæ¡æ¶ç¨å°äº Netty è¿è¡ç½ç»éä¿¡ï¼ ç®åæå·²ç»å°è¿ä¸ªé¡¹ç®å¼æºï¼å¨ Github 䏿¶è·äº 2k ç Star! 说å°ä¸ä½ç±å¥½çè¯ï¼ææ¯è¾å欢éè¿å客æ´çå享èªå·±æå¦ç¥è¯ï¼ç°å¨å·²ç»æ¯å¤ä¸ªå客平å°ç认è¯ä½è
ã çæ´»ä¸ææ¯ä¸ä¸ªæ¯è¾ç§¯æä¹è§ç人ï¼ä¸è¬ä¼éè¿è¿å¨æççæ¹å¼æ¥æ¾æ¾ãæä¸ç´é½é常æ³å å
¥è´µå
¬å¸ï¼æè§å¾è´µå
¬å¸çæååææ¯æ°å´æé½é叏忬¢ï¼æå¾
è½ä¸ä½ å
±äºï¼
### åå°æ±æ¨
å°±åç°å¨çææ¯é¢è¯ä¸æ ·ï¼å¤§å®¶é½è¯´å
å·äºï¼æ±æ¨ç°å¨çé¢è¯çç¹ä¹é¾ãç¶èï¼åçº¯æ±æ¨æç¨ä¹ï¼ä½ 对å
¶ä»æ±èè
说ï¼â大家é½ä¸è¦å· Leetcode äºåï¼é½ä¸è¦ååå¤é«å¹¶åãé«å¯ç¨çé¢è¯é¢äºåï¼ç°å¨é½è¿ä¹å·äºï¼â
ä¼æäººå¬ä½ çä¹ï¼**ä½ ä¸åå¤é¢è¯ï¼ä½æ¯å
¶ä»äººä¼åå¤é¢è¯åï¼é£ä½ æ¯ä¸æ¯å»åï¼è¿æ¯ççå害å°ä¸éè¦åå¤é¢è¯å¢ï¼**
å æ¤ï¼åå¤ Java é¢è¯çç¬¬ä¸æ¥ï¼æä»¬ä¸å®è¦å°½éåå°æ±æ¨ãæ±æ¨ç声é³å¤äºä¹åï¼ä¼ååå½±åèªå·±ï¼ä¼è®©èªå·±åå¾ååç¦èã
### é¢è¯ä¹ååæ¶å¤ç
å¦æå¤±è´¥ï¼ä¸è¦ç°å¿ï¼å¦æéè¿ï¼åå¿çåãé¢è¯åå·¥ä½å®é
䏿¯ä¸¤åäºï¼å¯è½å¾å¤é¢è¯æªéè¿ç人ï¼å·¥ä½è½åæ¯ä½ 强çå¤ï¼åä¹äº¦ç¶ã
é¢è¯å°±åæ¯ä¸åºå
¨æ°çå¾ç¨ï¼å¤±è´¥åèå©é½æ¯å¹³å¸¸ä¹äºãæä»¥ï¼ååä½ä¸è¦å 为é¢è¯å¤±è´¥èç°å¿ã丧失æå¿ãä¹ä¸è¦å 为é¢è¯éè¿è沾沾èªåï¼çå¾
ä½ çå°æ¯æ´ç¾å¥½çæªæ¥ï¼ç»§ç»å æ²¹ï¼
### æ»ç»
è¿ç¯æç« å
容æç¹å¤ï¼å¦æè¿ç¯æç« åªè½è®©ä½ è®°ä½ 4 å¥è¯ï¼é£è¯·è®°ä½ä¸é¢è¿ 4 å¥ï¼
1. ä¸å®è¦æååå¤é¢è¯ï¼ææ¯é¢è¯ä¸åäºç¼ç¨ï¼ç¼ç¨å害ä¸ä»£è¡¨ææ¯é¢è¯å°±ä¸å®è½è¿ã
2. ä¸å®ä¸è¦å¯¹é¢è¯æ±æä¾¥å¹¸å¿çãæéè¿éèªèº«ç¡¬ï¼åä¸ä¸è¦è§å¾èªå·±çå ç¯é¢ç»ï¼çå ç¯é¢è¯é¢è§£æå°±è½éè¿é¢è¯äºãä¸å®è¦éä¸å¿æ¥æ·±å
¥å¦ä¹ ï¼
3. 建议大å¦çå°½å¯è½æ©ä¸ç¹ä»¥æ±èä¸ºå¯¼åæ¥å¦ä¹ çãè¿æ ·æ´æé对æ§ï¼å¹¶ä¸å¯ä»¥å¤§æ¦çåå°èªå·±å¤å¨è¿·è«çæ¶é´ï¼å¾å¤§ç¨åº¦ä¸è¿å¯ä»¥è®©èªå·±å°èµ°å¾å¤å¼¯è·¯ã 使¯ï¼ä¸è¦æâ以æ±è为导åå¦ä¹ âç解为âæå°±ä¸ç¨å¦è¯¾å ä¸é£äºè®¡ç®æºåºç¡è¯¾ç¨äºâï¼
4. ææç®æ³æ¯å½ä¸ææ¯é¢è¯çæ é
ï¼å°½æ©åå¤ï¼
æ¬æèéèª **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** çãé¢è¯åå¤ç¯ãã

------
## 1.2 ç¨åºåç®åå°±è¯¥è¿æ ·å
> æ¬æèéèª **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** çãé¢è¯åå¤ç¯ã
### åè¨
ä¸ä»½å¥½çç®åå¯ä»¥å¨æ´ä¸ªç³è¯·é¢è¯ä»¥åé¢è¯è¿ç¨ä¸èµ·å°é常éè¦çä½ç¨ã
**为ä»ä¹è¯´ç®åå¾éè¦å¢ï¼** æä»¬å¯ä»¥ä»ä¸é¢å ç¹æ¥è¯´ï¼
**1.ç®å就忝æä»¬çä¸ä¸ªé¨é¢ä¸æ ·ï¼å®å¨å¾å¤§ç¨åº¦ä¸å³å®äºæ¯å¦è½å¤è·å¾é¢è¯æºä¼ã**
- åå¦ä½ æ¯ç½ç³ï¼ä½ çç®åå¿
ç¶ä¼ç»è¿ HR ççéï¼ä¸å¼ ç®å HR å¯è½ä¹å°±è±è´¹ 10 ç§éçä¸ä¸ï¼ç¶å HR å°±ä¼å³å®ä½ è¿ä¸å
³æ¯ Fail è¿æ¯ Passã
- åå¦ä½ æ¯å
æ¨ï¼å¦æä½ çç®å没æä»ä¹ä¼å¿çè¯ï¼å°±ç®æ¯å
æ¨ä½ ç人åç¨å¿ï¼ä¹æ è½ä¸ºåã
å¦å¤ï¼å°±ç®ä½ éè¿äºç¬¬ä¸è½®ççéè·å¾é¢è¯æºä¼ï¼åé¢çé¢è¯ä¸ï¼é¢è¯å®ä¹ä¼æ ¹æ®ä½ çç®åæ¥å¤æä½ ç©¶ç«æ¯å¦å¼å¾ä»è±è´¹å¾å¤æ¶é´å»é¢è¯ã
**2.ç®åä¸çå
容å¾å¤§ç¨åº¦ä¸å³å®äºé¢è¯å®æé®çä¾§éç¹ã**
- ä¸è¬æ
åµä¸ä½ çç®å䏿³¨æä½ ä¼çä¸è¥¿æä¼è¢«é®å°ï¼Javaãæ°æ®ç»æãç½ç»ãç®æ³è¿äºåºç¡æ¯æ¯ä¸ªäººå¿
é®çï¼ï¼æ¯å¦åäºä½ çç»ä½¿ç¨ Redis,é£é¢è¯å®å°±å¾å¤§æ¦çä¼é®ä½ redis çä¸äºé®é¢ã忝å¦ä½ åäºä½ å¨é¡¹ç®ä¸ä½¿ç¨äºæ¶æ¯éåï¼é£é¢è¯å®å¤§æ¦çé®å¾å¤æ¶æ¯éåç¸å
³çé®é¢ã
- æè½çç»åº¦å¨å¾å¤§ç¨åº¦ä¸ä¹å³å®äºé¢è¯å®æé®ç深度ã
å¨ä¸å¤¸å¤§èªå·±è½åçæ
åµä¸ï¼ååºä¸ä»½å¥½çç®å乿¯ä¸é¡¹å¾æ£çè½åã
### ç®å模æ¿
ç®åçæ ·å¼ççé常é常éè¦ï¼ï¼ï¼å¦æä½ çç®åæ ·å¼ä¸å°æ²¡æåçè¯ï¼é¢è¯å®ççæ²¡æçä¸å»ç欲æãä¸å¤©å¤çä¸ç¾ä»½çç®åççè¦ï¼ä½ 䏿ï¼
æè¿éçè¯ï¼æ¨èå¤§å®¶ä½¿ç¨ Markdown è¯æ³åç®åï¼ç¶ååå° Markdown æ ¼å¼è½¬æ¢ä¸º PDF æ ¼å¼åè¿è¡ç®åæéã
å¦æä½ å¯¹ Markdown è¯æ³ä¸å¤ªäºè§£çè¯ï¼å¯ä»¥è±åä¸ªå°æ¶ç®åçä¸ä¸ Markdown è¯æ³è¯´æ:ã
ä¸é¢æ¯ææ¶éçä¸äºè¿ä¸éçç®å模æ¿ï¼
- æ¨åç®åï¼æ¨èðï¼ ï¼ https://resume.mdedit.online ã
- typora+markdown+css èªå®ä¹ç®å模æ¿ï¼æ¨èðï¼ ï¼https://github.com/Snailclimb/typora-markdown-resume
- æç®ç®å ï¼ https://www.polebrief.com/index
- Markdown ç®åæçå·¥å
·ï¼https://resume.mdnice.com/
- è¶
级ç®å ï¼ https://www.wondercv.com/
ä¸é¢è¿äºç®å模æ¿å¤§å¤æ¯åªæ 1 页å
容ï¼å¾é¾å±ç°è¶³å¤çä¿¡æ¯éãå¦æä½ ä¸æ¯é¡¶çº§å¤§çï¼æ¯å¦ ACM 大èµè·å¥ï¼çè¯ï¼æå»ºè®®è¿æ¯å°½å¯è½å¤åä¸ç¹å¯ä»¥çªåºä½ èªå·±è½åçå
容ï¼2~3 页çå¯ï¼è®°å¾ç²¾ç¼è¯è¨ï¼ä¸è¦è¿å¤åºè¯ï¼ã
åæ»ç»å ç¹**ç®åæççæ³¨æäºé¡¹**ï¼
1. å°½éç®æ´ï¼ä¸è¦å¤ªè±éè¡å¨ã
2. ä¸äºææ¯åè¯ä¸è¦å¼éäºå¤§å°åæ¯å¦ MySQL ä¸è¦åæ mysqlï¼Java ä¸è¦åæ javaã
3. 䏿忰åè±æä¹é´å ä¸ç©ºæ ¼çè¯çèµ·æ¥ä¼èæä¸ç¹ã
### ç®åå
容
#### 个人信æ¯
- æåºæ¬ç ï¼å§åï¼èº«ä»½è¯ä¸çé£ä¸ªï¼ãå¹´é¾ãçµè¯ãç±è´¯ãèç³»æ¹å¼ãé®ç®±å°å
- æ½å¨å å项 ï¼ Githubå°åãå客å°åï¼å¦æææ¯å客åGithub䏿²¡æä»ä¹å
容çè¯ï¼å°±ä¸è¦åäºï¼
示ä¾ï¼

#### æ±èæå
ä½ æ³è¦åºèä»ä¹å²ä½ï¼å¸æå¨ä»ä¹åå¸ãå¦å¤ï¼ä½ ä¹å¯ä»¥å°æ±èæåæ¾å°ä¸ªäººä¿¡æ¯è¿ååã
示ä¾ï¼

#### æè²ç»å
æè²ç»åä¹ä¸å¯æç¼ºãéè¿æè²ç»åçä»ç»ï¼ä½ è¦ç¡®ä¿è½è®©é¢è¯å®å°±å¯ä»¥ç¥éä½ çå¦åãä¸ä¸ãæ¯ä¸å¦æ ¡ä»¥åæ¯ä¸çæ¥æã
示ä¾ï¼
> å京çå·¥å¤§å¦ ç¡å£«ï¼è½¯ä»¶å·¥ç¨ 2019.09 - 2022.01
> æ¹åå¤§å¦ å¦å£«ï¼åºç¨åå¦ 2015.09 ~ 2019.06
#### ä¸ä¸æè½
å
é®ä¸ä¸ä½ èªå·±ä¼ä»ä¹ï¼ç¶åççä½ æåçå
¬å¸éè¦ä»ä¹ãä¸è¬ HR å¯è½å¹¶ä¸å¤ªæææ¯ï¼æä»¥ä»å¨çéç®åçæ¶åå¯è½å°±ç¯çä½ ä¸ä¸æè½çå
³é®è¯æ¥çã对äºå
¬å¸æè¦æ±èä½ ä¸ä¼çæè½ï¼ä½ å¯ä»¥è±å 天æ¶é´å¦ä¹ ä¸ä¸ï¼ç¶åå¨ç®åä¸å¯ä»¥åä¸èªå·±äºè§£è¿ä¸ªæè½ã
ä¸é¢è¿ä¸ªä¸ä¸æè½ä»ç»ï¼ä½ å¯ä»¥æ ¹æ®èªå·±çå®é
æ
åµåèä¸ä¸ã

æè¿éååç¬æ¾ä¸ä¸ªæçè¿çæä½åå¦çæè½ä»ç»ï¼æä»¬æ¥æ¾æ¾é®é¢ã

ä¸å¾ä¸çæè½ä»ç»åå¨çé®é¢ï¼
- ææ¯åè¯æå¥½è§è大å°åæ¯è¾å¥½ï¼æ¯å¦ java->Java ï¼spring boot -> Spring Boot ãè¿ä¸ªè½ç¶æäºé¢è¯å®ä¸ä¼ä»æï¼ä½æ¯å¾å¤é¢è¯å®é½ä¼å¨æè¿ä¸ªç»èçã
- æè½ä»ç»å¤ªæï¼æ²¡æäº®ç¹ãä¸éè¦å
¨æï¼æä¸ªé¢ååå¾å¥½å°±è¡äºï¼
- 对 Java åå°å¼åçé¨åæè½æ¯å¦ Spring Boot ççæåº¦ä»
ä»
为äºè§£ï¼æ æ³æ»¡è¶³ä¼ä¸çè¦æ±ã
#### å®ä¹ ç»å/å·¥ä½ç»å
å·¥ä½ç»åé对社æï¼å®é
ç»åéå¯¹æ ¡æã
å·¥ä½ç»å建议éç¨æ¶é´ååºçæ¹å¼æ¥ä»ç»ï¼å®ä¹ ç»åå»ºè®®å°ææä»·å¼çæ¾å¨æåé¢ã
示ä¾ï¼
> **XXX å
¬å¸ ï¼201X å¹´ X æ ~ 201X å¹´ X æ ï¼**
>
> - **èä½**ï¼Java å端å¼åå·¥ç¨å¸
> - **å·¥ä½å
容**ï¼ä¸»è¦è´è´£ XXX
#### 项ç®ç»å
ç®å䏿ä¸ä¸¤ä¸ªé¡¹ç®ç»å徿£å¸¸ï¼ä½æ¯çæ£è½æé¡¹ç®ç»åå¾å¥½çå±ç¤ºç»é¢è¯å®çé常å°ã
å¾å¤æ±èè
ç项ç®ç»åä»ç»é½ä¼é¢ä¸´è¿äºå°å¦ãè¿äºç®åãæ²¡çªåºäº®ç¹çé®é¢ã
项ç®ç»ååºè¯¥çªåºèªå·±åäºä»ä¹ï¼ç®åæ¦æ¬é¡¹ç®åºæ¬æ
åµã项ç®ç»ååå¾çææå°½éè¦éåä¸ä¸ï¼å¤ææä¸äºäº®ç¹æ¯å¦èªå·±æ¯å¦ä½è§£å³é¡¹ç®ä¸åå¨ä¹ä¸ä¸ªçç¹ç ãé¤äºè§£å³çç¹ï¼è¿è½å¦ä½ææäº®ç¹å¢ï¼ ä»ä½ é¡¹ç®æ¶åå°çææ¯ä¸æ¥ææï¼æ³æ³è¿äºææ¯è½ä¸ºé¡¹ç®å¸¦æ¥åªäºæ¹è¿ã
ææ¯ä¼ååå¾çææå°½éè¦éåä¸ä¸ï¼
- æä½¿ç¨ xxx ææ¯è§£å³äº xxx é®é¢ï¼ç³»ç» qps ä» xxx æé«å°äº xxxã
- æä½¿ç¨ xxx ææ¯äºä¼åäº xxx æ¥å£ï¼ç³»ç» qps ä» xxx æé«å°äº xxxã
å¦å¤ï¼å¦æä½ è§å¾ä½ çé¡¹ç®ææ¯æ¯è¾è½åçè¯ï¼å¯ä»¥èªå·±ç§ä¸è¿è¡æ¹è¿ãéè¦çæ¯è®©é¡¹ç®æ¯è¾æäº®ç¹ï¼éè¿ä»ä¹æ¹å¼å°±æ æè°äºã
项ç®ç»åä»ç»æ¨¡æ¿ï¼

个人工ä½å
容æè¿°æå¥½å¯ä»¥ä½ç°èªå·±ç综åç´ è´¨ï¼æ¯å¦ä½ æ¯å¦ä½åè°é¡¹ç®ç»æåååå¼åçæè
å¨éå°æä¸ä¸ªæ£æçé®é¢çæ¶åä½ æ¯å¦ä½è§£å³çåæè
è¯´ä½ å¨è¿ä¸ªé¡¹ç®ä¼åäºæä¸ªæ¨¡åçæ§è½ã示ä¾ï¼é¡¹ç®ç MySQL æ°æ®åºä¸çæå¼ è¡¨çæ°æ®éè¾¾å°åä¸çº§å«ï¼æ¥è¯¢é度éå¸¸ç¼æ
¢ï¼æ°æ®åºååéå¸¸å¤§ï¼æä½¿ç¨ `Sharding-JDBC` è¿è¡äºååºå表ï¼åè¡¨çæ°æ®éé½å¨ 300w 以ä¸ã
#### è£èªå¥é¡¹ï¼å¯éï¼
å¦æä½ æå«é鿝è¾é«çç«èµï¼æ¯å¦ACMãé¿éçå¤©æ± å¤§èµï¼çè·å¥ç»åçè¯ï¼è£èªå¥é¡¹è¿åå
容ä¸å®è¦åä¸ä¸ï¼å¹¶ä¸ï¼ä½ è¿å¯ä»¥å°è£èªå¥é¡¹è¿åå
容éå½å¾åæ¾ï¼æ¾å¨ä¸ä¸ªæ´å æ¾ç¼çä½ç½®ã
#### æ ¡åç»å
å¦æææ¯è¾äº®ç¼çæ ¡åç»åçè¯å°±ç®ååä¸ä¸ï¼æ²¡æå°±ä¸åï¼
#### 个人è¯ä»·
**个人è¯ä»·å°±æ¯å¯¹èªå·±ç解读ï¼ä¸å®è¦çªåºèªå·±ç亮ç¹**ï¼å¤å¥ãåè¦è¿äºæ¯è¾èçä¸è¥¿å°±ä¸è¦æ¯äºï¼ãæ¯å¦ä½ å¯ä»¥è¯´èªå·±çå¦ä¹ è½å强ï¼ç¤ºä¾ï¼å¤§ä¸åå å½å®¶è½¯ä»¶è®¾è®¡å¤§èµçæ¶åå¿«é䏿 Python åäºä¸ä¸ªå¯é
ç½®åçç¬è«ç³»ç»ã忝å¦ä½ å¯ä»¥è¯´èªå·±æå¢éç²¾ç¥ï¼ç¤ºä¾ï¼å¤§ä¸åå æè½¯ä»¶è®¾è®¡æ¯èµçæ¶ååè°é¡¹ç®ç»å
5 åå¼ååå¦ï¼å¹¶å¯¹ç¼ç éå°å°é¾çå妿ä¾å¸®å©ï¼æç»é¡ºå©å¨ 1 个æçæ¶é´å®æé¡¹ç®çæ ¸å¿åè½ã
**个人è¯ä»·ä¸å®è¦ç®æ´æ¸
æ°ï¼é¿å
åºè¯ï¼**
### STAR æ³åå FAB æ³å
#### STAR æ³åï¼Situation Task Action Resultï¼
ç¸ä¿¡å¤§å®¶ä¸å®å¬è¯´è¿ STAR æ³åã对äºé¢è¯ï¼ä½ å¯ä»¥å°è¿ä¸ªæ³åç¨å¨èªå·±çç®å以ååé¢è¯å®æ²é交æµçè¿ç¨ä¸ã
STAR æ³åç±ä¸é¢ 4 个åè¯ç»æï¼STAR æ³åçååå°±æ¯ç±å®ä»¬çé¦åæ¯ç»æï¼ï¼
- **Situationï¼** æ
æ¯ã äºæ
æ¯å¨ä»ä¹æ
åµä¸åççï¼
- **Task:ï¼** ä»»å¡ãä½ ç任塿¯ä»ä¹ï¼
- **Actionï¼** è¡å¨ãä½ åäºä»ä¹ï¼
- **Resultï¼** ç»æãæç»çç»æææ ·ï¼
#### FAB æ³åï¼Feature Advantage Benefitï¼
é¤äº STAR æ³åï¼ä½ è¿éè¦äºè§£å¨éå®è¡ä¸ç»å¸¸ç¨å°çä¸ä¸ªå«å FAB çæ³åã
FAB æ³åç±ä¸é¢ 3 个åè¯ç»æï¼FAB æ³åçååå°±æ¯ç±å®ä»¬çé¦åæ¯ç»æï¼ï¼
- **Featureï¼** ä½ çç¹å¾/ä¼å¿æ¯ä»ä¹ï¼
- **Advantageï¼** æ¯å«äººå¥½å¨åªäºå°æ¹ï¼
- **Benefitï¼** 妿éä½£ä½ ï¼æèæ¹ä¼å¾å°ä»ä¹å¥½å¤ã
ç®åæ¥è¯´ï¼**FAB æ³åä¸»è¦æ¯è®©ä½ çé¢è¯å®ç¥éä½ çä¼å¿åä½ è½ä¸ºå
¬å¸å¸¦æ¥çä»·å¼ã**
### 注æäºé¡¹
1. ä¸å®è¦ä½¿ç¨ PDF æ ¼å¼æéï¼ä¸è¦ä½¿ç¨ word æè
å
¶ä»æ ¼å¼æéãè¿æ¯æåºæ¬çï¼
2. 大é¨åå
¬å¸ç HR é½è¯´æä»¬ä¸çéå¦åï¼éªä½ çï¼ï¼ãå¦æä½ çå¦åæ¯è¾å·®ï¼è®°å¾éè¿å
¶ä»æ¹å¼å¼¥è¡¥æ¯å¦ææå¤§åçå®ä¹ ç»åãè·å¾äºææå¤§èµçå¥ççã
3. 大é¨ååºå±çæ¾å·¥ä½çç¡¬ä¼¤æ¯æ²¡æå·¥ä½ç»éªæå®ä¹ ç»åï¼æä»¥å¦æä½ æ¯åºå±çå°±ä¸è¦éè¿ç§æåæ¥æã䏿¦éè¿ï¼ä½ åé¢å°±æå¤§å¯è½ä¼é¢ä¸´ç¤¾æï¼è¿ä¸ªæ¶å没æå·¥ä½ç»éªçä½ å¯è½å°±ä¼é¢ä¸´åç§ç¢°å£ï¼å¯¼è´æ¾ä¸å°ä¸ä¸ªå¥½çå·¥ä½ã
4. ä½ ä¸ä¼çä¸è¥¿å°±ä¸è¦åå¨ç®åã
5. å°èªå·±ç项ç®ç»åå®ç¾çå±ç¤ºåºæ¥é常éè¦ï¼çªåºäº®ç¹ã
6. é¢è¯å工使¯ä¸¤åäºï¼èªæçäººä¼æé¢è¯å®å¾èªå·±æ
é¿çé¢åé¢ï¼å
¶ä»äººå被é¢è¯å®çµçé¼»åèµ°ãè½è¯´é¢è¯å工使¯ä¸¤åäºï¼ä½æ¯ä½ è¦æ³è¦è·å¾èªå·±æ»¡æç offer ï¼ä½ èªèº«çå®åå¿
é¡»è¦å¼ºã
### æå·§
1. å°½éé¿å
主è§è¡¨è¿°ï¼å°ä¸ç¹è¯ä¹æ¨¡ç³ç形容è¯ï¼å°½éè¦ç®æ´æäºï¼é»è¾ç»ææ¸
æ°ã
2. ææ¯å客ãGithub 以åè·å¥ç»åçå¯ä»¥ç´æ¥è¯æèªå·±è½åçä¸è¥¿ï¼è½å就尽éåå¨è¿éã使¯ï¼å¦æææ¯å客å Github 䏿²¡æä»ä¹å
容çè¯ï¼å°±ä¸è¦åäºã
3. 注æç®åç宿§ï¼ä¸å®ä¸è¦åèªå·±ä¸ä¼çä¸è¥¿ï¼æè
å¸¦ææ¬ºéªæ§çå
容ãé彿¶¦è²æ²¡æé®é¢ã
4. 项ç®ç»å建议以æ¶é´ååºæåºï¼å¦å¤é¡¹ç®ç»åä¸å¨äºå¤ï¼ç²¾é 2~3 å³å¯ï¼ï¼èå¨äºæäº®ç¹ã
5. 妿å
容è¿å¤çè¯ï¼ä¸éè¦éæå
容å缩å°ä¸é¡µï¼ä¿ææç干忴æ´å°±å¯ä»¥äºã
6. ç®åæåæå¥½è½å ä¸ï¼âæè°¢æ¨è±æ¶é´é
读æçç®åï¼æå¾
è½ææºä¼åæ¨å
±äºãâè¿å¥è¯ï¼æ¾çä½ ä¼å¾æç¤¼è²ã
æ¬æèéèª **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** çãé¢è¯åå¤ç¯ãã

------
## 1.3 常è§é¢è¯é¢èªæµï¼ä»è´¹ï¼
é¢è¯ä¹åï¼å¼ºçå»ºè®®å¤§å®¶å¤æ¿å¸¸è§çé¢è¯é¢æ¥è¿è¡èªæµï¼æ£æ¥ä¸ä¸èªå·±çææ¡æ
åµï¼è¿æ¯ä¸ç§é常å®ç¨çå¤æææ¯é¢è¯çå°æå·§ã
å¨ **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** ç **ãææ¯é¢è¯é¢èªæµç¯ã** ï¼ææ»ç»äº Java é¢è¯ä¸æéè¦çç¥è¯ç¹çæå¸¸è§çé¢è¯é¢å¹¶æç
§é¢è¯æé®çæ¹å¼å±ç°åºæ¥ã

æ¯ä¸éç¨äºèªæµçé¢è¯é¢æé½ä¼ç»åºéè¦ç¨åº¦ï¼æ¹ä¾¿å¤§å®¶å¨æ¶é´æ¯è¾ç´§å¼ çæ¶åæ ¹æ®èªèº«æ
嵿¥éæ©æ§èªæµãå¹¶ä¸ï¼æè¿ä¼ç»åºæç¤ºï¼æ¹ä¾¿ä½ åå¿èµ·å¯¹åºçç¥è¯ç¹ã
å¨é¢è¯ä¸å¦æä½ å®å¨æ²¡æå¤´ç»ªçè¯ï¼ä¸ä¸ªå¥½çé¢è¯å®ä¹æ¯ä¼ç»ä½ æç¤ºçã

欢è¿åå¤ Java é¢è¯ä»¥åå¦ä¹ Java çåå¦å å
¥æç **[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)** ï¼å¹²è´§é常å¤ï¼å¦ä¹ æ°å´éå¸¸å¥½ï¼æ¶è´¹è½ç¶æ¯ç½èä»·ï¼ä½æçéçå
容æè®¸æ¯ä½ åå ä¸ä¸çå¹è®çè´¨éè¿è¦é«ã

ææèªå·±çååï¼ä¸å²éèï¼ç¨å¿åå
容ï¼çå¿å¸æå¸®å©å°ä½ ï¼
å¦æä½ æå
´è¶£çè¯ï¼ä¸å¦¨è± 3 åéå·¦å³ççæçç详ç»ä»ç»ï¼ **[JavaGuide ç¥è¯æç详ç»ä»ç»](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)**ï¼ææ«æä¼æ å¸ï¼ã

------
## 1.4 é¢è¯å¸¸è§è¯æ±æ«ç²
> æ¬æèéèª **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** çãé¢è¯åå¤ç¯ã
### æ¥æåç§æ
æ¥æçæ¶åä¸è¬ä¼åæ¶è¿è¡ **ååºå±çææå®ä¹ çæè** å **åºå±çæ ¡åæè** ï¼ååºå±çæçæ¯æ¥å¹´æ¯ä¸ç卿 ¡å¤§å¦çï¼ã
ä¸è¿ï¼ è¿ä¸ªæ¶ååºå±çæ ¡åæèçå²ä½ç¸å¯¹å·²ç»æ¯è¾å°äºï¼åºæ¬æ¯å¯¹ç§æçè¡¥æï¼ç§æçæ¶åææ¯åºå±çæ ¡åæèçå
³é®æ¶æã
æ¥ææé´ï¼éä¸è¿è¡çå®ä¹ çæèä¸è¬æ¯ææå®ä¹ çæèã
ç§æä¸è¬ 7 æä»½å°±å¼å§äºï¼å¤§æ¦ä¸ç´æç»å° 9 æåºãæ¥æä¸è¬ 3 æä»½å°±å¼å§äºï¼å¤§æ¦ä¸ç´æç»å° 4 æåºãå¾å¤å
¬å¸ï¼å°¤å
¶å¤§åï¼å°äº 9 æä¸æ¬(ç§æ)/3 æä¸æ¬ï¼æ¥æï¼ï¼å¾å¯è½å°±ä¼æ²¡æ HC äºã
### ææå®ä¹ 忥叏å®ä¹
ææå®ä¹ é常æ¯å¨æ¥æçæ¶åå¼å§å¤§è§æ¨¡æèï¼é¢è¯é¾åº¦å¤§äºæ¥å¸¸çå®ä¹ æèï¼æ§ä»·æ¯ä¹æ¯æ¥å¸¸å®ä¹ è¦é«ã
ä¸è¬æ¥è¯´ï¼ææå®ä¹ ä¼å¨ 6-7 æä¹å°±æ¯ææé£ä¼å
¥èã
æ¥å¸¸å®ä¹ é常å
¨å¹´é½ä¼è¿è¡ï¼ä¸è¬ä¸ºé¨é¨çæ£æï¼ä¸ä¸ä¼ç»è½¬æ£åé¢ãæ¥å¸¸å®ä¹ ççæè对象é常æ¯å¤§ä¸ã大äºãç ä¸ãç äºçåå¦ã
ä¸è¬æ¥è¯´ï¼æ¿å°æ¥å¸¸å®ä¹ offer åï¼ç«å»å°±ä¼å
¥èã
### æåæ¹
**为ä»ä¹å¾å¤å
¬å¸ææåæ¹ï¼**
徿æ¾åï¼æåæ¹å°±æ¯å个å
¬å¸æåæ¢å¤ºä¸æ³¢ä¼ç§æ¯ä¸çã
ä½ æ²¡å¿
è¦æ
å¿è¿ä¸ªæåæ¹çå«ééå¦ä½ï¼è§å¾èªå·±è½åè¶³å¤çè¯ï¼ä¸å®è¦ææ¡è¿æ¬¡æºä¼ï¼æåæ¹è¿æ¯ä¼æå¾å¤ sp çè³ ssp offer çï¼
**为ä»ä¹æ¨èæåæ¹å¢ï¼**
å ä¸ºï¼æåæ¹çç»æå¹¶ä¸å½±åä½ çç§æï¼ä¹å°±æ¯è¯´ä½ å¯ä»¥å¤ä¸æ¬¡æºä¼ãè¿æ ·çè¯ï¼å³ä½¿ä½ 失败äºï¼ä¹æ²¡å
³ç³»ï¼å¥½å¥½åæä¸ä¸èªå·±ççæ¿ï¼åªååå¤ç§æå°±å®äºäºï¼å¹¶ä¸è®¸å¤å
¬å¸çæåæ¹æ¯ç´æ¥é¢è¯ï¼å
ç¬è¯çã
使¯ï¼æè¿éå»ºè®®ï¼ææåæ¹çæ¶åï¼ä¸è¦ä¸æ¬¡æä½ ææ³å»çå
¬å¸å
¨æäºãæ¯å¦ä½ ææ³å»è
¾è®¯ãç¾åº¦ãé¿éãé£ä¹ä½ æåæ¹å¯ä»¥æç¾åº¦ï¼åæä¸¤ä¸ªå°ä¸äºçå
¬å¸ï¼ç¶åæ ¹æ®å 次çé¢è¯åé¦ç»§ç»æåèªå·±ï¼åéç»å»æèªå·±ææ³å»çå
¬å¸ãè½ç¶å¾å¤å
¬å¸é½è¯´é¢è¯æäºä¸å½±åæ£å¼æ¹åæï¼ä½æ¯ä½ é¢è¯çæ¶å伿è¯ä»·è®°å½çï¼è¿ä¸ªé¢è¯è®°å½ hr æ¯å¯ä»¥çå°çï¼ä»¥åçé¢è¯å®é¢è¯ä¹ä¼çå°ã妿é¢è¯å®ç»ä½ çè¯ä»·è®°å½æ¯è¾ä¸æ§è¿å¥½ï¼ä½å¦æé¢è¯å®ç»ä½ ä¸ä¸ªå¾å·®çé¢è¯è¯ä»·ãé£ä¹æ£å¼æ¹çæ¶å hr çç®åå°±ä¸ä¼éè¿ä½ äºãæå»å¹´é¢è¯å¿«ææåæ¹æ²¡è¿ï¼ä¸ç¥éé£ä½é¢è¯å®ç»æåçæ¯ä»ä¹è¯ä»·ï¼ç®ååæå«çé¨é¨å°±éä¸è¿äºã使¯é¢åèè½ç¶ç¬¬ä¸æ¬¡é¢è¯æ²¡éè¿ï¼æåç»è¿æ¯è¢«å¾å¤é¨é¨æã
妿æåæ¹æé£ç§é¨é¨ç»ç»çé¢é¢è¯ï¼å°±æ¯ä¸ä¼è¢«å½å
¥å
¬å¸ç³»ç»çé¢è¯ï¼è¿ç§æºä¼ä½ è¦æææç®åãè¿ç§é¢è¯æºä¼å¾é¾å¾ï¼å
¬å¸ä¸ä¼æä½ çé¢è¯è®°å½ï¼é¢è¯æ²¡è¿ä¹ä¸ä¼å½±åä½ åç»æå«çé¨é¨ï¼è¿è·å¾äºä¸æ¬¡é¾å¾çé¢è¯æºä¼ãä¸å®ä¸è¦å 为è§å¾èªå·±æ²¡åå¤å¥½èæ¾å¼è¿ç§é¢è¯ï¼å¤§åçæ¯ä¸æ¬¡é¢è¯é½æ¯ç¹å«å¥½çå¦ä¹ æºä¼ãå
¶å®è®¸å¤äººæåå æ¬¡é¢è¯é½æ¯ä¸è½éè¿çï¼ç»åè¿å 次失败ï¼ç¶åæ»ç»é¢è¯ä¸çé®é¢ï¼ä½ 就离大å offer è¶æ¥è¶è¿äºã
å·å·åè¯ä½ ï¼è¿äºå¤§åå¯è½ä¼ç»ç»é£ç§ä¸çé¢è¯è®°å½çé¨é¨é¢é¢è¯ï¼é¿éãç¾åº¦ã京ä¸ãåèè·³å¨ ~ 大家å¯ä»¥å»æ¾å¨è¿äºå
¬å¸å·¥ä½çå¦é¿å¦å§äºè§£ï¼ä¹å¯ä»¥å»ç客ä¸äºè§£ã
### å
æ¨
æ¯å¹´çç§æå¼å§ä»¥å大家å¯è½ä¼çå°å¤§éçå
æ¨å®£ä¼ ã使¯ä¸åå½¢å¼çå
æ¨å·®å«å
¶å®æ¯å¾å¤§çãå¦æåªæ¯ä»ç½ä¸é便æ¾ä¸ä¸ªå
æ¨ç ï¼å
æ¨äººé½ä¸è®¤è¯å°±æç®åæäºï¼è¿ç§å
æ¨æ¯æ²¡ç¨çãæç¨çå
æ¨æ¯ï¼å
æ¨è
å¯ä»¥ç´æ¥æä½ çç®å交å°çéç®åçé¨é¨ HR æéï¼è¿æ · HR è½å¿«éçå°ä½ çç®åï¼å¹¶ä¸ç»ä½ 宿é¢è¯ã
### HCï¼Headcountï¼
ä¿ç§°äººå¤´ï¼ç¨å¾®ä¸ä¸ç¹è®²å°±æ¯è¿å®¶å
¬å¸æç®æç人æ°ãå
¬å¸ä¼å½ç¨å¾å¤å®ä¹ çï¼ä¹æâ广æ offerâç说æ³ï¼æäººçä½ï¼ä½å®é
æååªä¼å½ç¨å
¶ä¸çä¸é¨åï¼ä¸ä¼å½åææãæåçæ£å½åçå®ä¹ çï¼å³å¯è½¬æ£ãèä¸è¢«å½åçä¸é¨åï¼å¯è½æ¯ä¸å¨ HC ä¹å
ï¼ç±äºå·¥ä½è½åãå·¥ä½éè¦ççã 以å¾é½æ¯å
å®äº HC åå offerï¼ä½æè¿æ°é»ä¸ä¹æå¾å¤ä¼ä¸æ¯å
åäº offerï¼ä½åæ¥å以 HC å·²æå¤ä¸ºç±æ¥ææ¶å®ä¹ ççãæä»¥åå¦ä»¬å¨æ¾å®ä¹ ï¼ç³è¯·æ ¡æçæ¶åè¦æ ¼å¤æ³¨æè¿ä¸ç¹ã
### é¢è¯è®°å½
大家è¿è¡äºèç½å
¬å¸ç»ç»çé¢è¯ï¼é½ä¼çä¸èªå·±çé¢è¯è®°å½ãé¢è¯è®°å½ä¸ä¼æé¢è¯å®çé¢è¯è¯è¯ãè¿ä¸ªé¢è¯è®°å½ï¼æ¯ä»¥åé¢è¯ä½ çé¢è¯å®è¿æ HR é½è½çå°çã
### é¢é¢è¯
é¨é¨æ¶å°ä½ çç®ååï¼å
ä¸å½å
¥å
¬å¸ç³»ç»ï¼ç± HR çéã妿éè¿ç®åçéãé¨é¨ç´æ¥åèµ·é¢é¢è¯ï¼é¢è¯éè¿åï¼å½å
¥ç³»ç»ç´æ¥èµ°ä¸é¢çæµç¨ãé¢è¯ä¸è¿ï¼ä¸å½±åä½ æè¿ä¸ªå
¬å¸çå
¶å®é¨é¨ï¼å 为å
¬å¸æ²¡æä½ çé¢è¯è®°å½ãæ¾é¢é¢è¯çé徿¯æ¾èªå·±å¨è¿ä¸ªå
¬å¸çå¸å
å¸å§ï¼æè
å¨ç客ç½ä¸æ¾é¨é¨ç´æçå¸åãé¢é¢è¯å¨é¨åå
¬å¸æ¯ä¸åè§çã
### 主管é¢
ä¸»ç®¡é¢æçæ¯é¨é¨çææ¯ä¸»ç®¡å¯¹ä½ è¿è¡é¢è¯ï¼èµ°å°è¿ä¸å
³å¯ä»¥è¯æå¤§å®¶çææ¯å·²ç»é®é¢ä¸å¤§äºã主管é¢åºæ¬ä¸é½ä¼éç¨å鮿æ¯ï¼åèçæ³çå½¢å¼å¯¹ä½ è¿è¡é¢è¯ãææ¶åä¹ä¼é®ä½ 卿 ¡çä¸äºæ´»å¨ç»åï¼çè³ä¼é®ä½ æ¯ä¸è®ºæå¨åä»ä¹ã主管é¢é¤äºè坿æ¯å¤ï¼ä¸ä¸ªéè¦çèå¯ç¹æ¯èå¯ä½ æ¯å¦åå¢éå¥åã
### HR é¢
HR 颿çå°±æ¯äººåèµæºå¯¹ä½ è¿è¡é¢è¯ãHR é常第ä¸ä¸ªé®é¢å°±æ¯ä½ æ¯åªäººï¼è¿ä¸ªé®é¢å
¶å®æ¯æ³çä½ æ¯ä¸æ¯æ¥å
¬å¸é¢è¯è§£é·åçãå¦æä½ é¢çæ¯ä¸å®¶å京çå
¬å¸ï¼èä¸ä½ æ¯æ²³åäººãæ²³å人ã山西人çå京å¨è¾¹çåå¸ï¼ä½ 说äºä½ æ¯åªäººä»¥åä½ å°±ä¸ç¨å¤è¯´äºã使¯å¦æä½ å®¶æ¯è¥¿åé£è¾¹çï¼ä¸å¦åæ¯å¨ä¸åé£åè¾¾ä¸çï¼åæ°å·§ä½ é¢çæ¯ä¸ä¸ªå¹¿å·æ·±å³çå
¬å¸ï¼ä½ æå¥½è¯´æ¸
æ¥ä½ ä¸ºå¥æ³å»é£è¾¹å·¥ä½ãå¦å¤ï¼HR ä¼é®ä¸äºå¨æ ¡ç»åï¼éè¿äº¤æµæ¥å¤æä½ çæ§æ ¼æ¯å¦ç¬¦åå¢éã对äºï¼è¿æä¸ä¸ª HR 常é®é®é¢ï¼ä½ æ¿å°äºåªäº offerï¼è¿ä¸ªé®é¢ä½ å°±è¦ç©åºä¸äºæ¯è¾ç¡¬ç offer äºï¼å 为ä¼è´¨äººæè°é½æ³æ¢ã使¯ä½ ç©åºç offer è¦åç°å¨é¢è¯çå
¬å¸æ¯å¨ä¸ä¸ªé级ä¸çãä¸è¦ä½ é¢è¯çæ¯ä¸ä¸ªå°å
¬å¸ï¼ä½ è·äººå®¶è¯´ä½ å·²ç»æ¿å°äºåèçå·¥çï¼ä½ è§å¾äººå®¶ç¸ä¿¡ä¸ç¸ä¿¡ç»äºä½ offer ä½ ä¼æ¥ï¼
### å
«è¡æ
åç§é¢è¯é¢é¢ç®ï¼ä¸»è¦æ¯ä¸äºæ¦å¿µæ§çç¥è¯ï¼æ¯å¦ `jvm` çè¿è¡æ¶æ°æ®åºçææã `mysql` çç´¢å¼ä¹ç±»çï¼è¿äºé®é¢çåçä¸è¬æåºå®å¥è·¯ãç°å¨çé¢è¯ä¸»è¦å°±æ¯å
«è¡æ+ç®æ³ãæå¨ä¹åçæç« ä¹å¨æ»ç»é¢è¯å
«è¡æçéç¹ï¼é¢è®¡ä¸å¨å
è½ååºæ¥ãé¢è¯å
«è¡æèççæ¯é¢è¯æåçå¿
è¦ä¸å
忡件ãç°å¨èå
«è¡æä¹æ¯ä¸ä¸ªæ½®æµï¼ä½æ¯æå
¶å®ä¸å¤ªå欢è¿ä¸ªæ½®æµã大家å¨å¹³æ¶å¦ä¹ æ¶è¿æ¯è¦æå¥½åºç¡ï¼ææå¹³æ¶çå°çæ¯è¾å¥½çè®¡ç®æºåºç¡èµææ¶é卿çå
¬ä¼å·éï¼å¤§å®¶å
³æ³¨ CS æå ï¼åå¤è®¡ç®æºåºç¡å°±è½é¢åã
### ææç®æ³
ææç®æ³ç®åæ¥è¯´å°±æ¯å®æé¢è¯å®ç»ä½ å¸ç½®çç®æ³é¢ï¼æäºå
¬å¸æä¾æè·¯å³å¯ï¼ãå½å
ç°å¨çæ ¡æé¢è¯å¼å§è¶æ¥è¶éè§ç®æ³äºï¼å°¤å
¶æ¯ååèè·³å¨ãè
¾è®¯è¿ç±»å¤§å
¬å¸ãç»å¤§é¨åå
¬å¸çæ ¡æç¬è¯æ¯æç®æ³é¢çï¼å¦æ AC çæ¯è¾ä½çè¯ï¼åºæ¬å°±ææäºã
### 常è§é¢è¯
ç°å¨äºèç½å¤§åç常è§é¢è¯å¤§å¤é½éç¨è¿ç§å½¢å¼ï¼ååå°æ¶èªæä»ç»ãé®é¡¹ç®ãèé¢è¯å
«è¡æï¼ååå°æ¶ä¸é代ç é¢ã
æ¬æèéèª **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** çãé¢è¯åå¤ç¯ãã

------
## 1.5 ä¼è´¨é¢ç»æ±æ»ï¼ä»è´¹ï¼
å¤äººäº:â**ä»å±±ä¹ç³ï¼å¯ä»¥æ»ç**â ãåäºå¦ä¹ åé´å«äººçé¢è¯çæåç»éªæè
失败çæè®ï¼å¯ä»¥è®©èªå·±å°èµ°è®¸å¤å¼¯è·¯ã
å¨ **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** ç **ãé¢ç»ç¯ã** ï¼æåäº«äº 15+ ç¯é«è´¨éç Java å端é¢ç»ï¼ææ ¡æçï¼ä¹æç¤¾æçï¼æå¤§åçï¼ä¹æä¸å°åçã
å¦æä½ æ¯éç§ççåå¦ï¼ä¹è½å¨è¿äºæç« 䏿¾å°å¯¹åºçéç§ççåå¦åçé¢ç»ã

å¹¶ä¸ï¼**[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)** è¿æä¸é¨å享é¢ç»åé¢è¯é¢çä¸é¢ï¼éé¢ä¼å享å¾å¤ä¼è´¨çé¢ç»åé¢è¯é¢ã



欢è¿åå¤ Java é¢è¯ä»¥åå¦ä¹ Java çåå¦å å
¥æç **[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)** ï¼å¹²è´§é常å¤ï¼å¦ä¹ æ°å´éå¸¸å¥½ï¼æ¶è´¹è½ç¶æ¯ç½èä»·ï¼ä½æçéçå
容æè®¸æ¯ä½ åå ä¸ä¸çå¹è®çè´¨éè¿è¦é«ã

ææèªå·±çååï¼ä¸å²éèï¼ç¨å¿åå
容ï¼çå¿å¸æå¸®å©å°ä½ ï¼
å¦æä½ æå
´è¶£çè¯ï¼ä¸å¦¨è± 3 åéå·¦å³ççæçç详ç»ä»ç»ï¼ **[JavaGuide ç¥è¯æç详ç»ä»ç»](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)**ï¼ææ«æä¼æ å¸ï¼ã
------
## 1.6 项ç®ç»éªæå
> æ¬æèéèª **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** çãé¢è¯åå¤ç¯ã
### 没æé¡¹ç®ç»éªæä¹å?
没æé¡¹ç®ç»éªæ¯å¤§é¨ååºå±çä¼ç¢°å°çä¸ä¸ªé®é¢ãçè³è¯´ï¼æå¾å¤æå·¥ä½ç»éªçç¨åºåï¼å¯¹èªå·±å¨å
¬å¸åç项ç®ä¸æ»¡æï¼ä¹æ³æ¾ä¸ä¸ªæ¯è¾æææ¯å«éçé¡¹ç®æ¥åã
说å ç§æè§å¾æ¯è¾é è°±çè·å项ç®ç»éªçæ¹å¼ï¼å¸æè½å¤å¯¹ä½ æå¯åã
#### 宿项ç®è§é¢/䏿
å¨ç½ä¸æ¾ä¸ä¸ªç¬¦åèªå·±è½å䏿¾å·¥ä½éæ±ç宿项ç®è§é¢æè
䏿 ï¼è·çèå¸ä¸èµ·åã
ä½ å¯ä»¥éè¿æ
课ç½ãåå©åå©ãæå¾ãæå®¢æ¶é´ãå¹è®æºæï¼æ¯å¦é»é©¬ãå°ç¡
è°·ï¼çæ¸ éè·åå°éåèªå·±ç宿项ç®è§é¢/䏿 ã

å°½ééæ©ä¸ä¸ªéåèªå·±ç项ç®ï¼æ²¡å¿
è¦å¿
é¡»ååå¸å¼/å¾®æå¡é¡¹ç®ï¼å¯¹äºç»å¤§é¨åå妿¥è¯´ï¼è½æä¸ä¸ªåæºé¡¹ç®å好就已ç»å¾ä¸éäºã
æé¢è¯è¿å¾å¤æ±èè
ï¼ç®åä¸ççæå¾®æå¡ç项ç®ç»éªï¼ç»æé便é®ä¸¤ä¸ªé®é¢å°±ç¥éæ ¹æ¬ä¸æ¯èªå·±åçæè
说åçæ¶ååæ ¹æ²¡è®¤çæèãè¿ç§æ
åµä¼ç»æçä¸é常ä¸å¥½çå°è±¡ã
æå¨[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)çãé¢è¯åå¤ç¯ãä¸ä¹è¯´è¿ï¼
> ä¸ªäººè®¤ä¸ºä¹æ²¡å¿
è¦éè¦å»åå¾®æå¡æè
åå¸å¼é¡¹ç®ï¼ä¸ä¸å®å¯¹ä½ é¢è¯æå©ãå¾®æå¡æè
åå¸å¼é¡¹ç®æ¶åçç¥è¯ç¹å¤ªå¤ï¼ä¸è¬äººå¾é¾åéãå¹¶ä¸ï¼è¿ç±»é¡¹ç®å
¶å®å¯¹äºæ ¡æçæ¥è¯´ç¨å¾®æä¸ç¹è¶
æ äºãå³ä½¿ä½ ååºæ¥ï¼å¾å¤é¢è¯å®ä¹ä¼è®¤ä¸ºä¸æ¯ä½ ç¬ç«å®æçã
>
> å
¶å®ï¼ä½ è½æä¸ä¸ªåä½é¡¹ç®åå°æè´ä¹å¾å¥½ï¼å¯¹äºä¸ªäººè½åæå䏿¯åå¾®æå¡æè
åå¸å¼é¡¹ç®å·®ãå¦ä½åå°æè´ï¼ä»£ç è´¨éè¿é就䏿äºï¼æ´éè¦çæ¯ä½ è¦å°½é让èªå·±çé¡¹ç®æä¸äºäº®ç¹ï¼æ¯å¦ä½ æ¯å¦ä½æåé¡¹ç®æ§è½çãå¦ä½è§£å³é¡¹ç®ä¸åå¨çä¸ä¸ªçç¹çï¼ï¼é¡¹ç®ç»ååå¾çææå°½éè¦éåä¸ä¸æ¯å¦æä½¿ç¨ xxx ææ¯è§£å³äº xxx é®é¢ï¼ç³»ç» qps ä» xxx æé«å°äº xxxã
è·çèå¸åçè¿ç¨ä¸ï¼ä½ ä¸å®è¦æèªå·±çæèï¼ä¸è¦æµ
å°è¾æ¢ã对äºå¾å¤ç¥è¯ç¹ï¼å«äººç讲解å¯è½åªæ¯æ»¡è¶³é¡¹ç®å°±å¤äºï¼ä½ èªå·±æ³å¤ç¹ç¥è¯çè¯ï¼å¯¹äºéè¦çç¥è¯ç¹å°±è¦èªå·±å¦ä¼å»æ·±å
¥å¦ä¹ ã
#### å®æç±»å¼æºé¡¹ç®
Github æè
ç äºä¸é¢æå¾å¤å®æç±»å«é¡¹ç®ï¼ä½ å¯ä»¥éæ©ä¸ä¸ªæ¥ç ç©¶ï¼ä¸ºäºè®©èªå·±å¯¹è¿ä¸ªé¡¹ç®æ´å çè§£ï¼å¨çè§£åæä»£ç çåºç¡ä¸ï¼ä½ å¯ä»¥å¯¹åæé¡¹ç®è¿è¡æ¹è¿æè
å¢å åè½ã
ä½ å¯ä»¥åè [Java ä¼è´¨å¼æºå®æé¡¹ç®](https://javaguide.cn/open-source-project/practical-project.html) ä¸é¢æ¨èçå®æç±»å¼æºé¡¹ç®ï¼è´¨éé½å¾é«ï¼é¡¹ç®ç±»å乿¯è¾å
¨é¢ï¼æ¶µçå客/论åç³»ç»ãèè¯/å·é¢ç³»ç»ãååç³»ç»ãæé管çç³»ç»ãå¿«éå¼åèææ¶ä»¥ååç§è½®åã

ä¸å®è¦è®°ä½ï¼ **ä¸å
è¦åï¼è¿è¦æ¹è¿ï¼æ¹åãä¸è®ºæ¯å®æé¡¹ç®è§é¢æè
䏿 è¿æ¯å®æç±»å¼æºé¡¹ç®ï¼é½ä¸å®ä¼æå¾å¤å¯ä»¥å®åæ¹è¿çå°æ¹ã**
#### ä»å¤´å¼å§å
èªå·±å¨æå»åä¸ä¸ªèªå·±æ³å®æçä¸è¥¿ï¼éå°ä¸ä¼çä¸è¥¿å°±ä¸´æ¶å»å¦ï¼ç°å¦ç°åã
è¿ä¸ªè¦æ±æ¯è¾é«ï¼æå»ºè®®ä½ å·²ç»æäºä¸ä¸ªé¡¹ç®ç»éªä¹åï¼åéç¨è¿ä¸ªæ¹æ³ãå¦æä½ æ²¡æåè¿é¡¹ç®çè¯ï¼è¿æ¯èèå®å®éç¨ä¸é¢ä¸¤ä¸ªæ¹æ³æ¯è¾å¥½ã
#### åå åç§å¤§å
¬å¸ç»ç»çåç§å¤§èµ
妿åå è¿ç§èµäºè½è·å¥çè¯ï¼é¡¹ç®å«ééé常é«ãå³ä½¿æ²¡è·å¥ä¹æ²¡å¥ï¼ä¹å¯ä»¥åç®åä¸ã

#### åä¸å®é
项ç®
é常æ
åµä¸ï¼ä½ æå¦ä¸é徿¥è§¦å°ä¼ä¸å®é
项ç®çå¼åï¼
1. è叿¥ç项ç®ï¼
2. èªå·±æ¥çç§æ´»ï¼
3. å®ä¹ /工使¥è§¦å°ç项ç®ï¼
è叿¥ç项ç®åèªå·±æ¥çç§æ´»é叏齿¯ä¸äºåä¸å¡ç项ç®ï¼å¾å°ä¼æ¶åå°æ§è½ä¼åãè¿ç§æ
åµä¸ï¼ä½ å¯ä»¥èè对项ç®è¿è¡æ¹è¿ï¼å«æè±æ¶é´ï¼æä¸ªæ¶é´ç¨å¿å好ä¸ä»¶äºæ
就好æ¯å¦ä½ 对项ç®çæ°æ®æ¨¡åè¿è¡æ¹è¿ãå¼å
¥ç¼åæé«è®¿é®é度ççã
å®ä¹ /工使¥è§¦å°ç项ç®ç±»ä¼¼ï¼å¦æéå°ä¸äºåä¸å¡ç项ç®ï¼ä¹æ¯è¦èªå·±ç§ä¸å¯¹é¡¹ç®è¿è¡æ¹è¿ä¼åã
尽鿝çç对项ç®è¿è¡äºä¼åï¼è¿æ¬èº«ä¹æ¯å¯¹ä¸ªäººè½åçæåãå¦æä½ å®å¨æ¯æ²¡æ¶é´å»å®è·µçè¯ï¼ä¹æ²¡å
³ç³»ï¼åéè¿ä¸ªé¡¹ç®ä¼åææ®µå°±å¥½ï¼æä¸äºé¢è¯å¯è½ä¼éå°çé®é¢æååå¤ä¸ä¸ã
### è·çè§é¢åç项ç®ä¼è¢«é¢è¯å®å«å¼ä¸ï¼
å¾å¤åºå±ç齿¯è·çè§é¢åç项ç®ï¼è¿ä¸ªå¤§é¨åé¢è¯å®é½å¿ç¥èæã
䏿é¤ç¡®å®æäºé¢è¯å®ä¸åè¿ä¸å¥ï¼è¿ä¸ªä¹ç人ãä¸è¿æç¸ä¿¡å¤§å¤æ°é¢è¯å®é½æ¯è½çè§£çï¼æ¯ç«ä½ å¨å¦æ ¡çæ¶åå®é
䏿¯æ²¡æä»ä¹è·å¾å®é
项ç®ç»éªçéå¾çã
大é¨ååºå±çç项ç®ç»éªé½æ¯èªå·±å¨ç½ä¸æ¾çæè
åä½ ä¸æ ·ä¹°çä»è´¹è¯¾ç¨è·çåçï¼æå°é¨åæ¯æ¯è¾çå®ç项ç®ã ä»ä½ è½æ³çåä¸ä¸ªå®æé¡¹ç®æ¥è¯´ï¼æè§å¾åè¡·æ¯å¥½çï¼ç¡®å®ä¹è½çæ£å¦å°ä¸è¥¿ã 使¯ï¼ç©¶ç«æå¤å°æ¯èªå·±ææ¡äºå¾éè¦ãçè§é¢æå¿è®³çæ¯è¢«å¨æ¥åï¼èªå·±å¤æ¹è¿ä¸ä¸ï¼å¤æèä¸ä¸ï¼å°±ç®æ¯ä½ è·çè§é¢åç项ç®ï¼ä¹æ¯å¯ä»¥ä¼åçï¼
**å¦æä½ æ³çæ£å¦å°ä¸è¥¿çè¯ï¼å»ºè®®ä¸å
è¦æé¡¹ç®åçº¯å®æè·èµ·æ¥ï¼è¿è¦å»èªå·±å°è¯çä¼åï¼**
ç®å说å 个æ¯è¾å®¹æçä¼åç¹ï¼
1. **å
¨å±å¼å¸¸å¤ç** ï¼å¾å¤é¡¹ç®è¿æ¹é¢é½åç䏿¯å¾å¥½ï¼å¯ä»¥åèæçè¿ç¯æç« ï¼[ãä½¿ç¨æä¸¾ç®åå°è£
ä¸ä¸ªä¼é
ç Spring Boot å
¨å±å¼å¸¸å¤çï¼ã](https://mp.weixin.qq.com/s/Y4Q4yWRqKG_lw0GLUsY2qw) æ¥åä¼åã
2. **项ç®çææ¯éåä¼å** ï¼æ¯å¦ä½¿ç¨ Guava 忬å°ç¼åçå°æ¹å¯ä»¥æ¢æ **Caffeine** ãCaffeine çåæ¹é¢ç表ç°è¦æ´å 好ï¼åæ¯å¦ Controller 屿¯å¦æ¾äºå¤ªå¤çä¸å¡é»è¾ã
3. **æ°æ®åºæ¹é¢** ï¼æ°æ®åºè®¾è®¡å¯å¦ä¼åï¼ç´¢å¼æ¯å¦ä½¿ç¨ä½¿ç¨æ£ç¡®ï¼SQL è¯å¥æ¯å¦å¯ä»¥ä¼åï¼æ¯å¦éè¦è¿è¡è¯»åå离ï¼
4. **ç¼å** ï¼é¡¹ç®ææ²¡æåªäºæ°æ®æ¯ç»å¸¸è¢«è®¿é®çï¼æ¯å¦å¼å
¥ç¼åæ¥æé«ååºé度ï¼
5. **å®å
¨** ï¼ é¡¹ç®æ¯å¦åå¨å®å
¨é®é¢ï¼
6. ......
ç¶åï¼**åç»å¤§å®¶æ¨èä¸ä¸ª IDEA ä¼å代ç çå°æå·§ï¼è¶
级å®ç¨ï¼**
åæä½ ç代ç ï¼å³é®é¡¹ç®-> Analyze->Inspect Code

æ«æå®æä¹åï¼IDEA ä¼ç»åºä¸äºå¯è½åå¨ç代ç åå³éæ¯å¦å½åé®é¢ã

å¹¶ä¸ï¼ä½ è¿å¯ä»¥èªå®ä¹æ£æ¥è§åã

### å¦ä½ä¼å项ç®ç»åæ§ä»·æ¯æ´é«ï¼
é¢è¯ä¹åï¼ä½ å¯ä»¥è·çç½ä¸çæç¨ï¼ä»æ§è½ä¼åæ¹åå
¥æå»æ¹è¿ä¸ä¸èªå·±ç项ç®ã为ä»ä¹å»ºè®®ä»æ§è½ä¼åæ¹åå
¥æå¢ï¼å 为æ§è½ä¼åæ¹åæ¹è¿ç¸æ¯è¾äºä¸å¡æ¹åçæ¹è¿æ§ä»·æ¯ä¼æ´é«ï¼æ´å®¹æä½ç°å¨ç®åä¸ãå¹¶ä¸ï¼æ´éè¦çæ¯ï¼æ§è½ä¼åæ¹åæ´å®¹æå¨é¢è¯ä¹åæååå¤ï¼é¢è¯å®ä¹æ´å欢æé®è¿ç±»é®é¢ã
ä½ é¡¹ç®æ²¡æç¨å°çæ§è½ä¼åææ®µï¼åªè¦ä½ ææåéå¹¶ä¸è§å¾åçï¼ä½ å°±å®å
¨å¯ä»¥åå¨ç®åä¸ãä¸è¿ï¼å»ºè®®ä½ è¿æ¯è¦å®è·µä¸ä¸ï¼åæµä¸æ³¢ï¼åå¾çææä¹è¦éåä¸ä¸æ¯å¦æä½¿ç¨ xxx ææ¯è§£å³äº xxx é®é¢ï¼ç³»ç» qps ä» xxx æé«å°äº xxxã
### å¿
é¡»æ¯å¾®æå¡é¡¹ç®ææäº®ç¹ï¼
ä¸ªäººè®¤ä¸ºä¹æ²¡å¿
è¦éè¦å»åå¾®æå¡æè
åå¸å¼é¡¹ç®ï¼ä¸ä¸å®å¯¹ä½ é¢è¯æå©ãå¾®æå¡æè
åå¸å¼é¡¹ç®æ¶åçç¥è¯ç¹å¤ªå¤ï¼ä¸è¬äººå¾é¾åéãå¹¶ä¸ï¼è¿ç±»é¡¹ç®å
¶å®å¯¹äºæ ¡æçæ¥è¯´ç¨å¾®æä¸ç¹è¶
æ äºãå³ä½¿ä½ ååºæ¥ï¼å¾å¤é¢è¯å®ä¹ä¼è®¤ä¸ºä¸æ¯ä½ ç¬ç«å®æçã
å
¶å®ï¼ä½ è½æä¸ä¸ªåä½é¡¹ç®åå°æè´ä¹å¾å¥½ï¼å¯¹äºä¸ªäººè½åæå䏿¯åå¾®æå¡æè
åå¸å¼é¡¹ç®å·®ãå¦ä½åå°æè´ï¼ä»£ç è´¨éè¿é就䏿äºï¼æ´éè¦çæ¯ä½ è¦å°½é让èªå·±çé¡¹ç®æä¸äºäº®ç¹ï¼æ¯å¦ä½ æ¯å¦ä½æåé¡¹ç®æ§è½çãå¦ä½è§£å³é¡¹ç®ä¸åå¨çä¸ä¸ªçç¹çï¼ï¼é¡¹ç®ç»ååå¾çææå°½éè¦éåä¸ä¸æ¯å¦æä½¿ç¨ xxx ææ¯è§£å³äº xxx é®é¢ï¼ç³»ç» qps ä» xxx æé«å°äº xxxã
æ¬æèéèª **[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)** çãé¢è¯åå¤ç¯ãã

------
# 2. Java
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
## 2.1. Java åºç¡
> è¿é¨åå
容æèª [JavaGuide](https://javaguide.cn/) ä¸é¢å ç¯æç« ï¼
>
> - [Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸)](https://javaguide.cn/java/basis/java-basic-questions-01.html)
> - [Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸)](https://javaguide.cn/java/basis/java-basic-questions-02.html)
> - [Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸)](https://javaguide.cn/java/basis/java-basic-questions-03.html)
### JVM vs JDK vs JRE
#### JVM
Java èææºï¼JVMï¼æ¯è¿è¡ Java åèç çèææºãJVM æé对ä¸åç³»ç»çç¹å®å®ç°ï¼Windowsï¼Linuxï¼macOSï¼ï¼ç®çæ¯ä½¿ç¨ç¸åçåèç ï¼å®ä»¬é½ä¼ç»åºç¸åçç»æãåèç åä¸åç³»ç»ç JVM å®ç°æ¯ Java è¯è¨â䏿¬¡ç¼è¯ï¼éå¤å¯ä»¥è¿è¡âçå
³é®æå¨ã
**JVM 并䏿¯åªæä¸ç§ï¼åªè¦æ»¡è¶³ JVM è§èï¼æ¯ä¸ªå
¬å¸ãç»ç»æè
个人é½å¯ä»¥å¼åèªå·±çä¸å± JVMã** ä¹å°±æ¯è¯´æä»¬å¹³æ¶æ¥è§¦å°ç HotSpot VM ä»
ä»
æ¯æ¯ JVM è§èçä¸ç§å®ç°èå·²ã
é¤äºæä»¬å¹³æ¶æå¸¸ç¨ç HotSpot VM å¤ï¼è¿æ J9 VMãZing VMãJRockit VM ç JVM ãç»´åºç¾ç§ä¸å°±æå¸¸è§ JVM ç对æ¯ï¼[Comparison of Java virtual machines](https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines) ï¼æå
´è¶£çå¯ä»¥å»ççãå¹¶ä¸ï¼ä½ å¯ä»¥å¨ [Java SE Specifications](https://docs.oracle.com/javase/specs/index.html) 䏿¾å°åä¸ªçæ¬ç JDK 对åºç JVM è§èã

#### JDK å JRE
JDK æ¯ Java Development Kit 缩åï¼å®æ¯åè½é½å
¨ç Java SDKã宿¥æ JRE ææ¥æçä¸åï¼è¿æç¼è¯å¨ï¼javacï¼åå·¥å
·ï¼å¦ javadoc å jdbï¼ãå®è½å¤å建åç¼è¯ç¨åºã
JRE æ¯ Java è¿è¡æ¶ç¯å¢ã宿¯è¿è¡å·²ç¼è¯ Java ç¨åºæéçææå
容çéåï¼å
æ¬ Java èææºï¼JVMï¼ï¼Java ç±»åºï¼java å½ä»¤åå
¶ä»çä¸äºåºç¡æä»¶ã使¯ï¼å®ä¸è½ç¨äºå建æ°ç¨åºã
å¦æä½ åªæ¯ä¸ºäºè¿è¡ä¸ä¸ Java ç¨åºçè¯ï¼é£ä¹ä½ åªéè¦å®è£
JRE å°±å¯ä»¥äºãå¦æä½ éè¦è¿è¡ä¸äº Java ç¼ç¨æ¹é¢çå·¥ä½ï¼é£ä¹ä½ å°±éè¦å®è£
JDK äºã使¯ï¼è¿ä¸æ¯ç»å¯¹çãææ¶ï¼å³ä½¿æ¨ä¸æç®å¨è®¡ç®æºä¸è¿è¡ä»»ä½ Java å¼åï¼ä»ç¶éè¦å®è£
JDKãä¾å¦ï¼å¦æè¦ä½¿ç¨ JSP é¨ç½² Web åºç¨ç¨åºï¼é£ä¹ä»ææ¯ä¸è®²ï¼æ¨åªæ¯å¨åºç¨ç¨åºæå¡å¨ä¸è¿è¡ Java ç¨åºãé£ä½ 为ä»ä¹éè¦ JDK å¢ï¼å 为åºç¨ç¨åºæå¡å¨ä¼å° JSP 转æ¢ä¸º Java servletï¼å¹¶ä¸éè¦ä½¿ç¨ JDK æ¥ç¼è¯ servletã
### ä»ä¹æ¯åèç ?éç¨åèç ç好夿¯ä»ä¹?
å¨ Java ä¸ï¼JVM å¯ä»¥çè§£ç代ç å°±å«ååèç ï¼å³æ©å±å为 `.class` çæä»¶ï¼ï¼å®ä¸é¢åä»»ä½ç¹å®çå¤çå¨ï¼åªé¢åèææºãJava è¯è¨éè¿åèç çæ¹å¼ï¼å¨ä¸å®ç¨åº¦ä¸è§£å³äºä¼ ç»è§£éåè¯è¨æ§è¡æçä½çé®é¢ï¼åæ¶åä¿çäºè§£éåè¯è¨å¯ç§»æ¤çç¹ç¹ãæä»¥ï¼ Java ç¨åºè¿è¡æ¶ç¸å¯¹æ¥è¯´è¿æ¯é«æçï¼ä¸è¿ï¼å C++ï¼Rustï¼Go çè¯è¨è¿æ¯æä¸å®å·®è·çï¼ï¼èä¸ï¼ç±äºåèç å¹¶ä¸é对ä¸ç§ç¹å®çæºå¨ï¼å æ¤ï¼Java ç¨åºæ 须鿰ç¼è¯ä¾¿å¯å¨å¤ç§ä¸åæä½ç³»ç»çè®¡ç®æºä¸è¿è¡ã
**Java ç¨åºä»æºä»£ç å°è¿è¡çè¿ç¨å¦ä¸å¾æç¤ºï¼**

æä»¬éè¦æ ¼å¤æ³¨æçæ¯ `.class->æºå¨ç ` è¿ä¸æ¥ãå¨è¿ä¸æ¥ JVM ç±»å è½½å¨é¦å
å è½½åèç æä»¶ï¼ç¶åéè¿è§£éå¨éè¡è§£éæ§è¡ï¼è¿ç§æ¹å¼çæ§è¡é度ä¼ç¸å¯¹æ¯è¾æ
¢ãèä¸ï¼æäºæ¹æ³å代ç 忝ç»å¸¸éè¦è¢«è°ç¨ç(ä¹å°±æ¯æè°ççç¹ä»£ç )ï¼æä»¥åé¢å¼è¿äº JITï¼just-in-time compilationï¼ ç¼è¯å¨ï¼è JIT å±äºè¿è¡æ¶ç¼è¯ãå½ JIT ç¼è¯å¨å®æç¬¬ä¸æ¬¡ç¼è¯åï¼å
¶ä¼å°åèç 对åºçæºå¨ç ä¿å䏿¥ï¼ä¸æ¬¡å¯ä»¥ç´æ¥ä½¿ç¨ãèæä»¬ç¥éï¼æºå¨ç çè¿è¡æçè¯å®æ¯é«äº Java è§£éå¨çãè¿ä¹è§£éäºæä»¬ä¸ºä»ä¹ç»å¸¸ä¼è¯´ **Java æ¯ç¼è¯ä¸è§£éå
±åçè¯è¨** ã
> HotSpot éç¨äºæ°æ§è¯ä¼°(Lazy Evaluation)çåæ³ï¼æ ¹æ®äºå
«å®å¾ï¼æ¶è大é¨åç³»ç»èµæºçåªæé£ä¸å°é¨åç代ç ï¼çç¹ä»£ç ï¼ï¼èè¿ä¹å°±æ¯ JIT æéè¦ç¼è¯çé¨åãJVM 伿 ¹æ®ä»£ç æ¯æ¬¡è¢«æ§è¡çæ
嵿¶éä¿¡æ¯å¹¶ç¸åºå°ååºä¸äºä¼åï¼å æ¤æ§è¡ç次æ°è¶å¤ï¼å®çé度就è¶å¿«ãJDK 9 å¼å
¥äºä¸ç§æ°çç¼è¯æ¨¡å¼ AOT(Ahead of Time Compilation)ï¼å®æ¯ç´æ¥å°åèç ç¼è¯ææºå¨ç ï¼è¿æ ·å°±é¿å
äº JIT é¢ççåæ¹é¢çå¼éãJDK æ¯æåå±ç¼è¯å AOT åä½ä½¿ç¨ã
### 为ä»ä¹ä¸å
¨é¨ä½¿ç¨ AOT å¢ï¼
AOT å¯ä»¥æåç¼è¯èçå¯å¨æ¶é´ï¼é£ä¸ºä»ä¹ä¸å
¨é¨ä½¿ç¨è¿ç§ç¼è¯æ¹å¼å¢ï¼
é¿è¯ç说ï¼è¿å Java è¯è¨çå¨æç¹æ§æåä¸ä¸ç¼çèç³»äºã举个ä¾åï¼CGLIB 卿代ç使ç¨çæ¯ ASM ææ¯ï¼èè¿ç§ææ¯å¤§è´åçæ¯è¿è¡æ¶ç´æ¥å¨å
åä¸çæå¹¶å 载修æ¹åçåèç æä»¶ä¹å°±æ¯ `.class` æä»¶ï¼å¦æå
¨é¨ä½¿ç¨ AOT æåç¼è¯ï¼ä¹å°±ä¸è½ä½¿ç¨ ASM ææ¯äºãä¸ºäºæ¯æç±»ä¼¼çå¨æç¹æ§ï¼æä»¥éæ©ä½¿ç¨ JIT 峿¶ç¼è¯å¨ã
### 为ä»ä¹è¯´ Java è¯è¨âç¼è¯ä¸è§£éå¹¶åâï¼
å
¶å®è¿ä¸ªé®é¢æä»¬è®²åèç çæ¶åå·²ç»æå°è¿ï¼å 为æ¯è¾éè¦ï¼æä»¥æä»¬è¿éåæä¸ä¸ã
æä»¬å¯ä»¥å°é«çº§ç¼ç¨è¯è¨æç
§ç¨åºçæ§è¡æ¹å¼å为两ç§ï¼
- **ç¼è¯å** ï¼[ç¼è¯åè¯è¨](https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E8%AA%9E%E8%A8%80) ä¼éè¿[ç¼è¯å¨](https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E5%99%A8)å°æºä»£ç 䏿¬¡æ§ç¿»è¯æå¯è¢«è¯¥å¹³å°æ§è¡çæºå¨ç ãä¸è¬æ
åµä¸ï¼ç¼è¯è¯è¨çæ§è¡é度æ¯è¾å¿«ï¼å¼åæçæ¯è¾ä½ã常è§çç¼è¯æ§è¯è¨æ CãC++ãGoãRust ççã
- **è§£éå** ï¼[è§£éåè¯è¨](https://zh.wikipedia.org/wiki/%E7%9B%B4%E8%AD%AF%E8%AA%9E%E8%A8%80)ä¼éè¿[è§£éå¨](https://zh.wikipedia.org/wiki/ç´è¯å¨)ä¸å¥ä¸å¥çå°ä»£ç è§£éï¼interpretï¼ä¸ºæºå¨ä»£ç ååæ§è¡ãè§£éåè¯è¨å¼åæçæ¯è¾å¿«ï¼æ§è¡é度æ¯è¾æ
¢ã常è§çè§£éæ§è¯è¨æ PythonãJavaScriptãPHP ççã

æ ¹æ®ç»´åºç¾ç§ä»ç»ï¼
> ä¸ºäºæ¹åç¼è¯è¯è¨çæçèåå±åºç[峿¶ç¼è¯](https://zh.wikipedia.org/wiki/å³æç·¨è¯)ææ¯ï¼å·²ç»ç¼©å°äºè¿ä¸¤ç§è¯è¨é´çå·®è·ãè¿ç§ææ¯æ··åäºç¼è¯è¯è¨ä¸è§£éåè¯è¨çä¼ç¹ï¼å®åç¼è¯è¯è¨ä¸æ ·ï¼å
æç¨åºæºä»£ç ç¼è¯æ[åèç ](https://zh.wikipedia.org/wiki/åèç )ãå°æ§è¡ææ¶ï¼åå°åèç ç´è¯ï¼ä¹åæ§è¡ã[Java](https://zh.wikipedia.org/wiki/Java)ä¸[LLVM](https://zh.wikipedia.org/wiki/LLVM)æ¯è¿ç§ææ¯ç代表产ç©ã
>
> ç¸å
³é
读ï¼[åºæ¬å | Java 峿¶ç¼è¯å¨åçè§£æåå®è·µ](https://tech.meituan.com/2020/10/22/java-jit-practice-in-meituan.html)
è¿æ¯å 为 Java è¯è¨æ¢å
·æç¼è¯åè¯è¨çç¹å¾ï¼ä¹å
·æè§£éåè¯è¨çç¹å¾ãå 为 Java ç¨åºè¦ç»è¿å
ç¼è¯ï¼åè§£é两个æ¥éª¤ï¼ç± Java ç¼åçç¨åºéè¦å
ç»è¿ç¼è¯æ¥éª¤ï¼çæåèç ï¼`.class` æä»¶ï¼ï¼è¿ç§åèç å¿
é¡»ç± Java è§£é卿¥è§£éæ§è¡ã
### Oracle JDK vs OpenJDK
å¯è½å¨çè¿ä¸ªé®é¢ä¹åå¾å¤äººåæä¸æ ·å¹¶æ²¡ææ¥è§¦å使ç¨è¿ OpenJDK ãé£ä¹ Oracle JDK å OpenJDK ä¹é´æ¯å¦åå¨é大差å¼ï¼ä¸é¢æéè¿æ¶éå°çä¸äºèµæï¼ä¸ºä½ è§£çè¿ä¸ªè¢«å¾å¤äººå¿½è§çé®é¢ã
å¯¹äº Java 7ï¼æ²¡ä»ä¹å
³é®çå°æ¹ãOpenJDK 项ç®ä¸»è¦åºäº Sun æèµ ç HotSpot æºä»£ç ãæ¤å¤ï¼OpenJDK 被é为 Java 7 çåèå®ç°ï¼ç± Oracle å·¥ç¨å¸ç»´æ¤ãå
³äº JVMï¼JDKï¼JRE å OpenJDK ä¹é´çåºå«ï¼Oracle å客å¸åå¨ 2012 å¹´æä¸ä¸ªæ´è¯¦ç»ççæ¡ï¼
> é®ï¼OpenJDK åå¨åºä¸çæºä»£ç ä¸ç¨äºæå»º Oracle JDK ç代ç ä¹é´æä»ä¹åºå«ï¼
>
> çï¼é常æ¥è¿ - æä»¬ç Oracle JDK çæ¬æå»ºè¿ç¨åºäº OpenJDK 7 æå»ºï¼åªæ·»å äºå 个é¨åï¼ä¾å¦é¨ç½²ä»£ç ï¼å
¶ä¸å
æ¬ Oracle ç Java æä»¶å Java WebStart çå®ç°ï¼ä»¥åä¸äºéæºçç¬¬ä¸æ¹ç»ä»¶ï¼å¦å¾å½¢å
æ
åå¨ï¼ä¸äºå¼æºçç¬¬ä¸æ¹ç»ä»¶ï¼å¦ Rhinoï¼ä»¥åä¸äºé¶ç¢çä¸è¥¿ï¼å¦éå ææ¡£æç¬¬ä¸æ¹åä½ãå±ææªæ¥ï¼æä»¬çç®çæ¯å¼æº Oracle JDK çææé¨åï¼é¤äºæä»¬èèåä¸åè½çé¨åã
**æ»ç»ï¼**ï¼æç¤ºï¼ä¸é¢æ¬å·å
çå
容æ¯åºäºåæè¡¥å
说æçï¼å 为åæå¤ªè¿äºæ¦æ¶©é¾æï¼ç¨äººè¯éæ°è§£éäºä¸ï¼å¦æä½ ç徿éé¢çæ¯è¯ï¼å¯ä»¥å¿½ç¥æ¬å·è§£éçå
容ï¼
1. Oracle JDK å¤§æ¦æ¯ 6 个æå䏿¬¡ä¸»è¦çæ¬ï¼ä» 2014 å¹´ 3 æ JDK 8 LTS åå¸å° 2017 å¹´ 9 æ JDK 9 åå¸ç»åäºé¿è¾¾ 3 å¹´å¤çæ¶é´ï¼æä»¥å¹¶ä¸æ»æ¯ 6 个æï¼ï¼è OpenJDK çæ¬å¤§æ¦æ¯ä¸ä¸ªæåå¸ä¸æ¬¡ãä½è¿ä¸æ¯åºå®çï¼æè§å¾äºè§£è¿ä¸ªæ²¡å¥ç¨å¤ã详æ
åè§ï¼[https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence](https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence) ã
2. OpenJDK æ¯ä¸ä¸ªåèæ¨¡å并䏿¯å®å
¨å¼æºçï¼è Oracle JDK æ¯ OpenJDK çä¸ä¸ªå®ç°ï¼å¹¶ä¸æ¯å®å
¨å¼æºçï¼ï¼ä¸ªäººè§ç¹ï¼ä¼æå¨ç¥ï¼JDK åæ¥æ¯ SUN å
¬å¸å¼åçï¼åæ¥ SUN å
¬å¸ååç»äº Oracle å
¬å¸ï¼Oracle å
¬å¸ä»¥ Oracle æ°æ®åºèèåï¼è Oracle æ°æ®åºåæ¯éæºçï¼è¿ä¸ªæ¶å Oracle å
¬å¸å°±ä¸æ³å®å
¨å¼æºäºï¼ä½æ¯åæ¥ç SUN å
¬å¸åæ JDK ç»å¼æºäºï¼å¦æè¿ä¸ªæ¶å Oracle æ¶è´åæ¥ä¹åå°±æä»ç»éæºï¼å¿
ç¶ä¼å¼å
¶å¾å¤ Java å¼åè
ç䏿»¡ï¼å¯¼è´å¤§å®¶å¯¹ Java 失å»ä¿¡å¿ï¼é£ Oracle å
¬å¸æ¶è´åæ¥ä¸å°±æ Java ç卿éäºåï¼ç¶åï¼Oracle å
¬å¸å°±æ³äºä¸ªéªæä½ï¼è¿æ ·å§ï¼ææä¸é¨åæ ¸å¿ä»£ç 弿ºåºæ¥ç»ä½ 们ç©ï¼å¹¶ä¸æè¦åä½ ä»¬èªå·±æç JDK åºåä¸ï¼ä½ ä»¬å« OpenJDKï¼æå« Oracle JDKï¼æå叿çï¼ä½ 们继ç»ç©ä½ 们çï¼è¦æ¯ä½ 们æåºæ¥ä»ä¹å¥½ç©çä¸è¥¿ï¼æåç»åå¸ Oracle JDK ä¹ä¼æ¿æ¥ç¨ä¸ä¸ï¼ä¸ä¸¾ä¸¤å¾ï¼ï¼OpenJDK 弿ºé¡¹ç®ï¼[https://github.com/openjdk/jdk](https://github.com/openjdk/jdk)
3. Oracle JDK æ¯ OpenJDK æ´ç¨³å®ï¼è¯å®å¦ï¼Oracle JDK ç± Oracle å
é¨å¢éè¿è¡åç¬ç åçï¼èä¸å叿¶é´æ¯ OpenJDK æ´é¿ï¼è´¨éæ´æä¿éï¼ãOpenJDK å Oracle JDK ç代ç å ä¹ç¸åï¼OpenJDK çä»£ç æ¯ä» Oracle JDK ä»£ç æ´¾çåºæ¥çï¼å¯ä»¥çè§£ä¸ºå¨ Oracle JDK 忝䏿äºä¸æ¡æ°çåæ¯å« OpenJDKï¼æä»¥å¤§é¨å代ç ç¸åï¼ï¼ä½ Oracle JDK ææ´å¤çç±»åä¸äºé误修å¤ãå æ¤ï¼å¦ææ¨æ³å¼åä¼ä¸/åä¸è½¯ä»¶ï¼æå»ºè®®æ¨éæ© Oracle JDKï¼å 为å®ç»è¿äºå½»åºçæµè¯å稳å®ãæäºæ
åµä¸ï¼æäºäººæå°å¨ä½¿ç¨ OpenJDK å¯è½ä¼éå°äºè®¸å¤åºç¨ç¨åºå´©æºçé®é¢ï¼ä½æ¯ï¼åªéåæ¢å° Oracle JDK å°±å¯ä»¥è§£å³é®é¢ï¼
4. å¨ååºæ§å JVM æ§è½æ¹é¢ï¼Oracle JDK ä¸ OpenJDK ç¸æ¯æä¾äºæ´å¥½çæ§è½ï¼
5. Oracle JDK ä¸ä¼ä¸ºå³å°åå¸ççæ¬æä¾é¿ææ¯æï¼å¦ææ¯ LTS é¿ææ¯æçæ¬çè¯ä¹ä¼ï¼æ¯å¦ JDK 8ï¼ä½å¹¶ä¸æ¯æ¯ä¸ªçæ¬é½æ¯ LTS çæ¬ï¼ï¼ç¨æ·æ¯æ¬¡é½å¿
é¡»éè¿æ´æ°å°ææ°çæ¬è·å¾æ¯ææ¥è·åææ°çæ¬ï¼
6. Oracle JDK ä½¿ç¨ BCL/OTN åè®®è·å¾è®¸å¯ï¼è OpenJDK æ ¹æ® GPL v2 许å¯è·å¾è®¸å¯ã
> æ¢ç¶ Oracle JDK è¿ä¹å¥½ï¼é£ä¸ºä»ä¹è¿è¦æ OpenJDKï¼
>
> çï¼
>
> 1. OpenJDK æ¯å¼æºçï¼å¼æºæå³çä½ å¯ä»¥å¯¹å®æ ¹æ®ä½ èªå·±çéè¦è¿è¡ä¿®æ¹ãä¼åï¼æ¯å¦ Alibaba åºäº OpenJDK å¼åäº Dragonwell8ï¼[https://github.com/alibaba/dragonwell8](https://github.com/alibaba/dragonwell8)
>
> 2. OpenJDK æ¯åä¸å
è´¹çï¼è¿ä¹æ¯ä¸ºä»ä¹éè¿ yum å
管çå¨ä¸é»è®¤å®è£
ç JDK æ¯ OpenJDK è䏿¯ Oracle JDKï¼ãè½ç¶ Oracle JDK 乿¯åä¸å
è´¹ï¼æ¯å¦ JDK 8ï¼ï¼ä½å¹¶ä¸æ¯ææçæ¬é½æ¯å
è´¹çã
>
> 3. OpenJDK æ´æ°é¢çæ´å¿«ãOracle JDK ä¸è¬æ¯æ¯ 6 个æåå¸ä¸ä¸ªæ°çæ¬ï¼è OpenJDK ä¸è¬æ¯æ¯ 3 个æåå¸ä¸ä¸ªæ°çæ¬ãï¼ç°å¨ä½ ç¥éä¸ºå¥ Oracle JDK æ´ç¨³å®äºå§ï¼å
å¨ OpenJDK è¯è¯æ°´ï¼æå¤§é¨åé®é¢é½è§£å³æäºæå¨ Oracle JDK ä¸åå¸ï¼
>
> åºäºä»¥ä¸è¿äºåå ï¼OpenJDK è¿æ¯æåå¨çå¿
è¦çï¼

ð æå±ä¸ä¸ï¼
- BCL åè®®ï¼Oracle Binary Code License Agreementï¼ï¼ å¯ä»¥ä½¿ç¨ JDKï¼æ¯æåç¨ï¼ï¼ä½æ¯ä¸è½è¿è¡ä¿®æ¹ã
- OTN åè®®ï¼Oracle Technology Network License Agreementï¼ï¼ 11 åä¹åæ°åå¸ç JDK ç¨ç齿¯è¿ä¸ªåè®®ï¼å¯ä»¥èªå·±ç§ä¸ç¨ï¼ä½æ¯åç¨éè¦ä»è´¹ã

ç¸å
³é
读 ðï¼[ãDifferences Between Oracle JDK and OpenJDKã](https://www.baeldung.com/oracle-jdk-vs-openjdk)
### Java è¯è¨å
³é®åæåªäºï¼
| åç±» | å
³é®å | | | | | | |
| :------------------- | -------- | ---------- | -------- | ------------ | ---------- | --------- | ------ |
| è®¿é®æ§å¶ | private | protected | public | | | | |
| ç±»ï¼æ¹æ³ååé修饰符 | abstract | class | extends | final | implements | interface | native |
| | new | static | strictfp | synchronized | transient | volatile | enum |
| ç¨åºæ§å¶ | break | continue | return | do | while | if | else |
| | for | instanceof | switch | case | default | assert | |
| é误å¤ç | try | catch | throw | throws | finally | | |
| å
ç¸å
³ | import | package | | | | | |
| åºæ¬ç±»å | boolean | byte | char | double | float | int | long |
| | short | | | | | | |
| åéå¼ç¨ | super | this | void | | | | |
| ä¿çå | goto | const | | | | | |
> Tipsï¼ææçå
³é®å齿¯å°åçï¼å¨ IDE ä¸ä¼ä»¥ç¹æ®é¢è²æ¾ç¤ºã
>
> `default` è¿ä¸ªå
³é®åå¾ç¹æ®ï¼æ¢å±äºç¨åºæ§å¶ï¼ä¹å±äºç±»ï¼æ¹æ³ååé修饰符ï¼è¿å±äºè®¿é®æ§å¶ã
>
> - å¨ç¨åºæ§å¶ä¸ï¼å½å¨ `switch` ä¸å¹é
ä¸å°ä»»ä½æ
嵿¶ï¼å¯ä»¥ä½¿ç¨ `default` æ¥ç¼åé»è®¤å¹é
çæ
åµã
> - å¨ç±»ï¼æ¹æ³ååé修饰符ä¸ï¼ä» JDK8 å¼å§å¼å
¥äºé»è®¤æ¹æ³ï¼å¯ä»¥ä½¿ç¨ `default` å
³é®åæ¥å®ä¹ä¸ä¸ªæ¹æ³çé»è®¤å®ç°ã
> - å¨è®¿é®æ§å¶ä¸ï¼å¦æä¸ä¸ªæ¹æ³å没æä»»ä½ä¿®é¥°ç¬¦ï¼åé»è®¤ä¼æä¸ä¸ªä¿®é¥°ç¬¦ `default`ï¼ä½æ¯è¿ä¸ªä¿®é¥°ç¬¦å ä¸äºå°±ä¼æ¥éã
â ï¸ æ³¨æ ï¼è½ç¶ `true`, `false`, å `null` çèµ·æ¥åå
³é®åä½å®é
ä¸ä»ä»¬æ¯åé¢å¼ï¼åæ¶ä½ ä¹ä¸å¯ä»¥ä½ä¸ºæ è¯ç¬¦æ¥ä½¿ç¨ã
宿¹ææ¡£ï¼[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/\_keywords.html](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html)
### èªå¢èªåè¿ç®ç¬¦
å¨å代ç çè¿ç¨ä¸ï¼å¸¸è§çä¸ç§æ
嵿¯éè¦æä¸ªæ´æ°ç±»ååéå¢å 1 æåå° 1ï¼Java æä¾äºä¸ç§ç¹æ®çè¿ç®ç¬¦ï¼ç¨äºè¿ç§è¡¨è¾¾å¼ï¼å«åèªå¢è¿ç®ç¬¦ï¼++)åèªåè¿ç®ç¬¦ï¼--ï¼ã
++ å -- è¿ç®ç¬¦å¯ä»¥æ¾å¨åéä¹åï¼ä¹å¯ä»¥æ¾å¨åéä¹åï¼å½è¿ç®ç¬¦æ¾å¨åéä¹åæ¶(åç¼)ï¼å
èªå¢/åï¼åèµå¼ï¼å½è¿ç®ç¬¦æ¾å¨åéä¹åæ¶(åç¼)ï¼å
èµå¼ï¼åèªå¢/åãä¾å¦ï¼å½ `b = ++a` æ¶ï¼å
èªå¢ï¼èªå·±å¢å 1ï¼ï¼åèµå¼ï¼èµå¼ç» bï¼ï¼å½ `b = a++` æ¶ï¼å
èµå¼(èµå¼ç» b)ï¼åèªå¢ï¼èªå·±å¢å 1ï¼ãä¹å°±æ¯ï¼++a è¾åºçæ¯ a+1 çå¼ï¼a++è¾åºçæ¯ a å¼ãç¨ä¸å¥å£è¯å°±æ¯ï¼â符å·å¨åå°±å
å /åï¼ç¬¦å·å¨åå°±åå /åâã
### æååéä¸å±é¨åéçåºå«ï¼
- **è¯æ³å½¢å¼** ï¼ä»è¯æ³å½¢å¼ä¸çï¼æåå鿝å±äºç±»çï¼èå±é¨å鿝å¨ä»£ç åææ¹æ³ä¸å®ä¹çåéææ¯æ¹æ³çåæ°ï¼æååéå¯ä»¥è¢« `public`,`private`,`static` ç修饰符æä¿®é¥°ï¼èå±é¨åéä¸è½è¢«è®¿é®æ§å¶ä¿®é¥°ç¬¦å `static` æä¿®é¥°ï¼ä½æ¯ï¼æååéåå±é¨åéé½è½è¢« `final` æä¿®é¥°ã
- **å卿¹å¼** ï¼ä»åéå¨å
åä¸çå卿¹å¼æ¥ç,妿æååéæ¯ä½¿ç¨ `static` 修饰çï¼é£ä¹è¿ä¸ªæåå鿝å±äºç±»çï¼å¦ææ²¡æä½¿ç¨ `static` 修饰ï¼è¿ä¸ªæåå鿝å±äºå®ä¾çãè对象åå¨äºå å
åï¼å±é¨åéååå¨äºæ å
åã
- **çåæ¶é´** ï¼ä»åéå¨å
åä¸ççåæ¶é´ä¸çï¼æååéæ¯å¯¹è±¡çä¸é¨åï¼å®éç对象çå建èåå¨ï¼èå±é¨åééçæ¹æ³çè°ç¨èèªå¨çæï¼éçæ¹æ³çè°ç¨ç»æèæ¶äº¡ã
- **é»è®¤å¼** ï¼ä»å鿝妿é»è®¤å¼æ¥çï¼æååéå¦ææ²¡æè¢«èµåå§å¼ï¼åä¼èªå¨ä»¥ç±»åçé»è®¤å¼èèµå¼ï¼ä¸ç§æ
åµä¾å¤:被 `final` 修饰çæååéä¹å¿
é¡»æ¾å¼å°èµå¼ï¼ï¼èå±é¨åéåä¸ä¼èªå¨èµå¼ã
### éæåéæä»ä¹ä½ç¨ï¼
éæåéå¯ä»¥è¢«ç±»çææå®ä¾å
±äº«ãæ 论ä¸ä¸ªç±»å建äºå¤å°ä¸ªå¯¹è±¡ï¼å®ä»¬é½å
±äº«åä¸ä»½éæåéã
é常æ
åµä¸ï¼éæåéä¼è¢« `final` å
³é®å修饰æä¸ºå¸¸éã
### å符å常éåå符串常éçåºå«?
1. **å½¢å¼** : åç¬¦å¸¸éæ¯åå¼å·å¼èµ·çä¸ä¸ªå符ï¼åç¬¦ä¸²å¸¸éæ¯åå¼å·å¼èµ·ç 0 个æè¥å¹²ä¸ªå符ã
2. **å«ä¹** : å符常éç¸å½äºä¸ä¸ªæ´åå¼( ASCII å¼),å¯ä»¥åå 表达å¼è¿ç®; å符串常é代表ä¸ä¸ªå°åå¼(该å符串å¨å
åä¸åæ¾ä½ç½®)ã
3. **å å
å大å°** ï¼ å符常éåªå 2 个åè; å符串常éå è¥å¹²ä¸ªåèã
(**注æï¼ `char` å¨ Java ä¸å 两个åè**)
### éææ¹æ³åå®ä¾æ¹æ³æä½ä¸åï¼
**1ãè°ç¨æ¹å¼**
å¨å¤é¨è°ç¨éææ¹æ³æ¶ï¼å¯ä»¥ä½¿ç¨ `ç±»å.æ¹æ³å` çæ¹å¼ï¼ä¹å¯ä»¥ä½¿ç¨ `对象.æ¹æ³å` çæ¹å¼ï¼èå®ä¾æ¹æ³åªæåé¢è¿ç§æ¹å¼ãä¹å°±æ¯è¯´ï¼**è°ç¨éææ¹æ³å¯ä»¥æ éå建对象** ã
ä¸è¿ï¼éè¦æ³¨æçæ¯ä¸è¬ä¸å»ºè®®ä½¿ç¨ `对象.æ¹æ³å` çæ¹å¼æ¥è°ç¨éææ¹æ³ãè¿ç§æ¹å¼é常容æé ææ··æ·ï¼éææ¹æ³ä¸å±äºç±»çæä¸ªå¯¹è±¡èæ¯å±äºè¿ä¸ªç±»ã
å æ¤ï¼ä¸è¬å»ºè®®ä½¿ç¨ `ç±»å.æ¹æ³å` çæ¹å¼æ¥è°ç¨éææ¹æ³ã
```java
public class Person {
public void method() {
//......
}
public static void staicMethod(){
//......
}
public static void main(String[] args) {
Person person = new Person();
// è°ç¨å®ä¾æ¹æ³
person.method();
// è°ç¨éææ¹æ³
Person.staicMethod()
}
}
```
**2ã访é®ç±»æåæ¯å¦åå¨éå¶**
éææ¹æ³å¨è®¿é®æ¬ç±»çæåæ¶ï¼åªå
许访é®éææåï¼å³éææååéåéææ¹æ³ï¼ï¼ä¸å
许访é®å®ä¾æåï¼å³å®ä¾æååéåå®ä¾æ¹æ³ï¼ï¼èå®ä¾æ¹æ³ä¸åå¨è¿ä¸ªéå¶ã
### éè½½åéåæä»ä¹åºå«ï¼
> é载就æ¯åæ ·çä¸ä¸ªæ¹æ³è½å¤æ ¹æ®è¾å
¥æ°æ®çä¸åï¼ååºä¸åçå¤ç
>
> éåå°±æ¯å½å类继æ¿èªç¶ç±»çç¸åæ¹æ³ï¼è¾å
¥æ°æ®ä¸æ ·ï¼ä½è¦ååºæå«äºç¶ç±»çååºæ¶ï¼ä½ å°±è¦è¦çç¶ç±»æ¹æ³
**éè½½**
åçå¨åä¸ä¸ªç±»ä¸ï¼æè
ç¶ç±»ååç±»ä¹é´ï¼ï¼æ¹æ³åå¿
é¡»ç¸åï¼åæ°ç±»åä¸åã个æ°ä¸åã顺åºä¸åï¼æ¹æ³è¿åå¼å访é®ä¿®é¥°ç¬¦å¯ä»¥ä¸åã
ãJava æ ¸å¿ææ¯ãè¿æ¬ä¹¦æ¯è¿æ ·ä»ç»éè½½çï¼
> 妿å¤ä¸ªæ¹æ³(æ¯å¦ `StringBuilder` çæé æ¹æ³)æç¸åçååãä¸åçåæ°ï¼ ä¾¿äº§çäºéè½½ã
>
> ```java
> StringBuilder sb = new StringBuilder();
> StringBuilder sb2 = new StringBuilder("HelloWorld");
> ```
>
> ç¼è¯å¨å¿
é¡»æéåºå
·ä½æ§è¡åªä¸ªæ¹æ³ï¼å®éè¿ç¨åä¸ªæ¹æ³ç»åºçåæ°ç±»åä¸ç¹å®æ¹æ³è°ç¨æä½¿ç¨çå¼ç±»åè¿è¡å¹é
æ¥æéåºç¸åºçæ¹æ³ã 妿ç¼è¯å¨æ¾ä¸å°å¹é
çåæ°ï¼ å°±ä¼äº§çç¼è¯æ¶éè¯¯ï¼ å ä¸ºæ ¹æ¬ä¸åå¨å¹é
ï¼ æè
没æä¸ä¸ªæ¯å
¶ä»çæ´å¥½(è¿ä¸ªè¿ç¨è¢«ç§°ä¸ºé载解æ(overloading resolution))ã
>
> Java å
许éè½½ä»»ä½æ¹æ³ï¼ èä¸åªæ¯æé 卿¹æ³ã
综ä¸ï¼é载就æ¯åä¸ä¸ªç±»ä¸å¤ä¸ªååæ¹æ³æ ¹æ®ä¸åçä¼ åæ¥æ§è¡ä¸åçé»è¾å¤çã
**éå**
éååçå¨è¿è¡æï¼æ¯å类对ç¶ç±»çå
许访é®çæ¹æ³çå®ç°è¿ç¨è¿è¡éæ°ç¼åã
1. æ¹æ³åãåæ°å表å¿
é¡»ç¸åï¼åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸çï¼æåºçå¼å¸¸èå´å°äºçäºç¶ç±»ï¼è®¿é®ä¿®é¥°ç¬¦èå´å¤§äºçäºç¶ç±»ã
2. 妿ç¶ç±»æ¹æ³è®¿é®ä¿®é¥°ç¬¦ä¸º `private/final/static` åå类就ä¸è½éåè¯¥æ¹æ³ï¼ä½æ¯è¢« `static` ä¿®é¥°çæ¹æ³è½å¤è¢«å次声æã
3. æé æ¹æ³æ æ³è¢«éå
综ä¸ï¼**éåå°±æ¯å类对ç¶ç±»æ¹æ³çéæ°æ¹é ï¼å¤é¨æ ·åä¸è½æ¹åï¼å
é¨é»è¾å¯ä»¥æ¹åã**
| åºå«ç¹ | éè½½æ¹æ³ | éåæ¹æ³ |
| :--------- | :------- | :----------------------------------------------------------- |
| åçèå´ | åä¸ä¸ªç±» | åç±» |
| åæ°å表 | å¿
é¡»ä¿®æ¹ | ä¸å®ä¸è½ä¿®æ¹ |
| è¿åç±»å | å¯ä¿®æ¹ | åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸ç |
| å¼å¸¸ | å¯ä¿®æ¹ | åç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»åºæ¯ç¶ç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»æ´å°æç¸çï¼ |
| 访é®ä¿®é¥°ç¬¦ | å¯ä¿®æ¹ | ä¸å®ä¸è½åæ´ä¸¥æ ¼çéå¶ï¼å¯ä»¥éä½éå¶ï¼ |
| åçé¶æ®µ | ç¼è¯æ | è¿è¡æ |
**æ¹æ³çéåè¦éµå¾ªâ两å两å°ä¸å¤§â**ï¼ä»¥ä¸å
容æå½èªãç¯ç Java 讲ä¹ãï¼[issue#892](https://github.com/Snailclimb/JavaGuide/issues/892) ï¼ï¼
- â两åâ峿¹æ³åç¸åãå½¢åå表ç¸åï¼
- â两å°âæçæ¯åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸çï¼åç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»åºæ¯ç¶ç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»æ´å°æç¸çï¼
- âä¸å¤§âæçæ¯åç±»æ¹æ³çè®¿é®æéåºæ¯ç¶ç±»æ¹æ³çè®¿é®æéæ´å¤§æç¸çã
âï¸ å
³äº **éåçè¿åå¼ç±»å** è¿ééè¦é¢å¤å¤è¯´æä¸ä¸ï¼ä¸é¢ç表述ä¸å¤ªæ¸
æ°åç¡®ï¼å¦ææ¹æ³çè¿åç±»åæ¯ void ååºæ¬æ°æ®ç±»åï¼åè¿åå¼éåæ¶ä¸å¯ä¿®æ¹ã使¯å¦ææ¹æ³çè¿å弿¯å¼ç¨ç±»åï¼éåæ¶æ¯å¯ä»¥è¿å该å¼ç¨ç±»åçåç±»çã
```java
public class Hero {
public String name() {
return "è¶
级è±é";
}
}
public class SuperMan extends Hero{
@Override
public String name() {
return "è¶
人";
}
public Hero hero() {
return new Hero();
}
}
public class SuperSuperMan extends SuperMan {
public String name() {
return "è¶
级è¶
级è±é";
}
@Override
public SuperMan hero() {
return new SuperMan();
}
}
```
### ä»ä¹æ¯å¯åé¿åæ°ï¼
ä» Java5 å¼å§ï¼Java æ¯æå®ä¹å¯åé¿åæ°ï¼æè°å¯åé¿åæ°å°±æ¯å
许å¨è°ç¨æ¹æ³æ¶ä¼ å
¥ä¸å®é¿åº¦çåæ°ãå°±æ¯å¦ä¸é¢çè¿ä¸ª `printVariable` æ¹æ³å°±å¯ä»¥æ¥å 0 个æè
å¤ä¸ªåæ°ã
```java
public static void method1(String... args) {
//......
}
```
å¦å¤ï¼å¯ååæ°åªè½ä½ä¸ºå½æ°çæåä¸ä¸ªåæ°ï¼ä½å
¶åé¢å¯ä»¥æä¹å¯ä»¥æ²¡æä»»ä½å
¶ä»åæ°ã
```java
public static void method2(String arg1, String... args) {
//......
}
```
**éå°æ¹æ³éè½½çæ
嵿ä¹åå¢ï¼ä¼ä¼å
å¹é
åºå®åæ°è¿æ¯å¯ååæ°çæ¹æ³å¢ï¼**
çæ¡æ¯ä¼ä¼å
å¹é
åºå®åæ°çæ¹æ³ï¼å 为åºå®åæ°çæ¹æ³å¹é
度æ´é«ã
æä»¬éè¿ä¸é¢è¿ä¸ªä¾åæ¥è¯æä¸ä¸ã
```java
/**
* 微信æ JavaGuide åå¤"é¢è¯çªå»"å³å¯å
è´¹é¢å个人ååç Java é¢è¯æå
*
* @author Guideå¥
* @date 2021/12/13 16:52
**/
public class VariableLengthArgument {
public static void printVariable(String... args) {
for (String s : args) {
System.out.println(s);
}
}
public static void printVariable(String arg1, String arg2) {
System.out.println(arg1 + arg2);
}
public static void main(String[] args) {
printVariable("a", "b");
printVariable("a", "b", "c", "d");
}
}
```
è¾åºï¼
```
ab
a
b
c
d
```
å¦å¤ï¼Java çå¯ååæ°ç¼è¯åå®é
ä¼è¢«è½¬æ¢æä¸ä¸ªæ°ç»ï¼æä»¬çç¼è¯åçæç `class`æä»¶å°±å¯ä»¥çåºæ¥äºã
```java
public class VariableLengthArgument {
public static void printVariable(String... args) {
String[] var1 = args;
int var2 = args.length;
for(int var3 = 0; var3 < var2; ++var3) {
String s = var1[var3];
System.out.println(s);
}
}
// ......
}
```
### Java ä¸çå ç§åºæ¬æ°æ®ç±»åäºè§£ä¹ï¼
Java 䏿 8 ç§åºæ¬æ°æ®ç±»åï¼åå«ä¸ºï¼
- 6 ç§æ°åç±»åï¼
- 4 ç§æ´æ°åï¼`byte`ã`short`ã`int`ã`long`
- 2 ç§æµ®ç¹åï¼`float`ã`double`
- 1 ç§å符类åï¼`char`
- 1 ç§å¸å°åï¼`boolean`ã
è¿ 8 ç§åºæ¬æ°æ®ç±»åçé»è®¤å¼ä»¥åæå 空é´ç大å°å¦ä¸ï¼
| åºæ¬ç±»å | 使° | åè | é»è®¤å¼ | åå¼èå´ |
| :-------- | :--- | :--- | :------ | ------------------------------------------ |
| `byte` | 8 | 1 | 0 | -128 ~ 127 |
| `short` | 16 | 2 | 0 | -32768 ~ 32767 |
| `int` | 32 | 4 | 0 | -2147483648 ~ 2147483647 |
| `long` | 64 | 8 | 0L | -9223372036854775808 ~ 9223372036854775807 |
| `char` | 16 | 2 | 'u0000' | 0 ~ 65535 |
| `float` | 32 | 4 | 0f | 1.4E-45 ~ 3.4028235E38 |
| `double` | 64 | 8 | 0d | 4.9E-324 ~ 1.7976931348623157E308 |
| `boolean` | 1 | | false | trueãfalse |
å¯¹äº `boolean`ï¼å®æ¹ææ¡£æªæç¡®å®ä¹ï¼å®ä¾èµäº JVM ååçå
·ä½å®ç°ãé»è¾ä¸çè§£æ¯å ç¨ 1 ä½ï¼ä½æ¯å®é
ä¸ä¼èèè®¡ç®æºé«æåå¨å ç´ ã
å¦å¤ï¼Java çæ¯ç§åºæ¬ç±»åæå åå¨ç©ºé´ç大å°ä¸ä¼åå
¶ä»å¤§å¤æ°è¯è¨é£æ ·éæºå¨ç¡¬ä»¶æ¶æçååèååãè¿ç§æå åå¨ç©ºé´å¤§å°çä¸åæ§æ¯ Java ç¨åºæ¯ç¨å
¶ä»å¤§å¤æ°è¯è¨ç¼åçç¨åºæ´å
·å¯ç§»æ¤æ§çåå ä¹ä¸ï¼ãJava ç¼ç¨ææ³ã2.2 èææå°ï¼ã
**注æï¼**
1. Java éä½¿ç¨ `long` ç±»åçæ°æ®ä¸å®è¦å¨æ°å¼åé¢å ä¸ **L**ï¼å¦åå°ä½ä¸ºæ´åè§£æã
2. `char a = 'h'`char :åå¼å·ï¼`String a = "hello"` :åå¼å·ã
è¿å
«ç§åºæ¬ç±»å齿坹åºçå
è£
ç±»åå«ä¸ºï¼`Byte`ã`Short`ã`Integer`ã`Long`ã`Float`ã`Double`ã`Character`ã`Boolean` ã
### åºæ¬ç±»ååå
è£
ç±»åçåºå«ï¼
- æååéå
è£
ç±»åä¸èµå¼å°±æ¯ `null` ï¼èåºæ¬ç±»åæé»è®¤å¼ä¸ä¸æ¯ `null`ã
- å
è£
ç±»åå¯ç¨äºæ³åï¼èåºæ¬ç±»åä¸å¯ä»¥ã
- åºæ¬æ°æ®ç±»åçå±é¨åéåæ¾å¨ Java èææºæ ä¸çå±é¨åé表ä¸ï¼åºæ¬æ°æ®ç±»åçæååéï¼æªè¢« `static` 修饰 ï¼åæ¾å¨ Java èææºçå ä¸ãå
è£
ç±»åå±äºå¯¹è±¡ç±»åï¼æä»¬ç¥éå 乿æå¯¹è±¡å®ä¾é½åå¨äºå ä¸ã
- ç¸æ¯äºå¯¹è±¡ç±»åï¼ åºæ¬æ°æ®ç±»åå ç¨ç空é´é常å°ã
**为ä»ä¹è¯´æ¯å 乿æå¯¹è±¡å®ä¾å¢ï¼** è¿æ¯å 为 HotSpot èææºå¼å
¥äº JIT ä¼åä¹åï¼ä¼å¯¹å¯¹è±¡è¿è¡éé¸åæï¼å¦æåç°æä¸ä¸ªå¯¹è±¡å¹¶æ²¡æéé¸å°æ¹æ³å¤é¨ï¼é£ä¹å°±å¯è½éè¿æ éæ¿æ¢æ¥å®ç°æ ä¸åé
ï¼èé¿å
å ä¸åé
å
å
â ï¸ æ³¨æ ï¼ **åºæ¬æ°æ®ç±»å忾卿 䏿¯ä¸ä¸ªå¸¸è§ç误åºï¼** åºæ¬æ°æ®ç±»åçæååéå¦ææ²¡æè¢« `static` 修饰çè¯ï¼ä¸å»ºè®®è¿ä¹ä½¿ç¨ï¼åºè¯¥è¦ä½¿ç¨åºæ¬æ°æ®ç±»å对åºçå
è£
ç±»åï¼ï¼å°±åæ¾å¨å ä¸ã
```java
class BasicTypeVar{
private int x;
}
```
### å
è£
ç±»åçç¼åæºå¶äºè§£ä¹ï¼
Java åºæ¬æ°æ®ç±»åçå
è£
ç±»åç大é¨åé½ç¨å°äºç¼åæºå¶æ¥æåæ§è½ã
`Byte`,`Short`,`Integer`,`Long` è¿ 4 ç§å
è£
ç±»é»è®¤åå»ºäºæ°å¼ **[-128ï¼127]** çç¸åºç±»åçç¼åæ°æ®ï¼`Character` åå»ºäºæ°å¼å¨ **[0,127]** èå´çç¼åæ°æ®ï¼`Boolean` ç´æ¥è¿å `True` or `False`ã
**Integer ç¼åæºç ï¼**
```java
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static {
// high value may be configured by property
int h = 127;
}
}
```
**`Character` ç¼åæºç :**
```java
public static Character valueOf(char c) {
if (c <= 127) { // must cache
return CharacterCache.cache[(int)c];
}
return new Character(c);
}
private static class CharacterCache {
private CharacterCache(){}
static final Character cache[] = new Character[127 + 1];
static {
for (int i = 0; i < cache.length; i++)
cache[i] = new Character((char)i);
}
}
```
**`Boolean` ç¼åæºç ï¼**
```java
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
```
妿è¶
åºå¯¹åºèå´ä»ç¶ä¼å»å建æ°ç对象ï¼ç¼åçèå´åºé´ç大å°åªæ¯å¨æ§è½åèµæºä¹é´çæè¡¡ã
ä¸¤ç§æµ®ç¹æ°ç±»åçå
è£
ç±» `Float`,`Double` 并没æå®ç°ç¼åæºå¶ã
```java
Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// è¾åº true
Float i11 = 333f;
Float i22 = 333f;
System.out.println(i11 == i22);// è¾åº false
Double i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// è¾åº false
```
ä¸é¢æä»¬æ¥çä¸ä¸é®é¢ãä¸é¢ç代ç çè¾åºç»ææ¯ `true` è¿æ¯ `false` å¢ï¼
```java
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);
```
`Integer i1=40` è¿ä¸è¡ä»£ç ä¼åçè£
ç®±ï¼ä¹å°±æ¯è¯´è¿è¡ä»£ç çä»·äº `Integer i1=Integer.valueOf(40)` ãå æ¤ï¼`i1` ç´æ¥ä½¿ç¨çæ¯ç¼åä¸ç对象ãè`Integer i2 = new Integer(40)` ä¼ç´æ¥å建æ°ç对象ã
å æ¤ï¼çæ¡æ¯ `false` ãä½ ç对äºåï¼
è®°ä½ï¼**æææ´åå
è£
类对象ä¹é´å¼çæ¯è¾ï¼å
¨é¨ä½¿ç¨ equals æ¹æ³æ¯è¾**ã

### èªå¨è£
ç®±ä¸æç®±äºè§£åï¼åçæ¯ä»ä¹ï¼
**ä»ä¹æ¯èªå¨æè£
ç®±ï¼**
- **è£
ç®±**ï¼å°åºæ¬ç±»åç¨å®ä»¬å¯¹åºçå¼ç¨ç±»åå
è£
èµ·æ¥ï¼
- **æç®±**ï¼å°å
è£
ç±»å转æ¢ä¸ºåºæ¬æ°æ®ç±»åï¼
举ä¾ï¼
```java
Integer i = 10; //è£
ç®±
int n = i; //æç®±
```
ä¸é¢è¿ä¸¤è¡ä»£ç 对åºçåèç 为ï¼
```java
L1
LINENUMBER 8 L1
ALOAD 0
BIPUSH 10
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
PUTFIELD AutoBoxTest.i : Ljava/lang/Integer;
L2
LINENUMBER 9 L2
ALOAD 0
ALOAD 0
GETFIELD AutoBoxTest.i : Ljava/lang/Integer;
INVOKEVIRTUAL java/lang/Integer.intValue ()I
PUTFIELD AutoBoxTest.n : I
RETURN
```
ä»åèç ä¸ï¼æä»¬åç°è£
ç®±å
¶å®å°±æ¯è°ç¨äº å
è£
ç±»ç`valueOf()`æ¹æ³ï¼æç®±å
¶å®å°±æ¯è°ç¨äº `xxxValue()`æ¹æ³ã
å æ¤ï¼
- `Integer i = 10` çä»·äº `Integer i = Integer.valueOf(10)`
- `int n = i` çä»·äº `int n = i.intValue()`;
注æï¼**妿é¢ç¹æè£
ç®±çè¯ï¼ä¹ä¼ä¸¥éå½±åç³»ç»çæ§è½ãæä»¬åºè¯¥å°½éé¿å
ä¸å¿
è¦çæè£
ç®±æä½ã**
```java
private static long sum() {
// åºè¯¥ä½¿ç¨ long è䏿¯ Long
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
```
### 为ä»ä¹æµ®ç¹æ°è¿ç®çæ¶åä¼æç²¾åº¦ä¸¢å¤±çé£é©ï¼
æµ®ç¹æ°è¿ç®ç²¾åº¦ä¸¢å¤±ä»£ç æ¼ç¤ºï¼
```java
float a = 2.0f - 1.9f;
float b = 1.8f - 1.7f;
System.out.println(a);// 0.100000024
System.out.println(b);// 0.099999905
System.out.println(a == b);// false
```
为ä»ä¹ä¼åºç°è¿ä¸ªé®é¢å¢ï¼
è¿ä¸ªåè®¡ç®æºä¿åæµ®ç¹æ°çæºå¶æå¾å¤§å
³ç³»ãæä»¬ç¥éè®¡ç®æºæ¯äºè¿å¶çï¼èä¸è®¡ç®æºå¨è¡¨ç¤ºä¸ä¸ªæ°åæ¶ï¼å®½åº¦æ¯æéçï¼æ é循ç¯çå°æ°åå¨å¨è®¡ç®æºæ¶ï¼åªè½è¢«æªæï¼æä»¥å°±ä¼å¯¼è´å°æ°ç²¾åº¦åçæå¤±çæ
åµãè¿ä¹å°±æ¯è§£éäºä¸ºä»ä¹æµ®ç¹æ°æ²¡æåæ³ç¨äºè¿å¶ç²¾ç¡®è¡¨ç¤ºã
å°±æ¯å¦è¯´åè¿å¶ä¸ç 0.2 å°±æ²¡åæ³ç²¾ç¡®è½¬æ¢æäºè¿å¶å°æ°ï¼
```java
// 0.2 转æ¢ä¸ºäºè¿å¶æ°çè¿ç¨ä¸ºï¼ä¸æä¹ä»¥ 2ï¼ç´å°ä¸åå¨å°æ°ä¸ºæ¢ï¼
// å¨è¿ä¸ªè®¡ç®è¿ç¨ä¸ï¼å¾å°çæ´æ°é¨åä»ä¸å°ä¸æåå°±æ¯äºè¿å¶çç»æã
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0ï¼åç循ç¯ï¼
...
```
å
³äºæµ®ç¹æ°çæ´å¤å
容ï¼å»ºè®®çä¸ä¸[è®¡ç®æºç³»ç»åºç¡ï¼åï¼æµ®ç¹æ°](http://kaito-kidd.com/2018/08/08/computer-system-float-point/)è¿ç¯æç« ã
### å¦ä½è§£å³æµ®ç¹æ°è¿ç®ç精度丢失é®é¢ï¼
`BigDecimal` å¯ä»¥å®ç°å¯¹æµ®ç¹æ°çè¿ç®ï¼ä¸ä¼é æç²¾åº¦ä¸¢å¤±ãé常æ
åµä¸ï¼å¤§é¨åéè¦æµ®ç¹æ°ç²¾ç¡®è¿ç®ç»æçä¸å¡åºæ¯ï¼æ¯å¦æ¶åå°é±çåºæ¯ï¼é½æ¯éè¿ `BigDecimal` æ¥åçã
```java
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);
BigDecimal y = b.subtract(c);
System.out.println(x); /* 0.1 */
System.out.println(y); /* 0.1 */
System.out.println(Objects.equals(x, y)); /* true */
```
å
³äº `BigDecimal` ç详ç»ä»ç»ï¼å¯ä»¥ççæåçè¿ç¯æç« ï¼[BigDecimal 详解](https://javaguide.cn/java/basis/bigdecimal.html)ã
### è¶
è¿ long æ´åçæ°æ®åºè¯¥å¦ä½è¡¨ç¤ºï¼
åºæ¬æ°å¼ç±»å齿ä¸ä¸ªè¡¨è¾¾èå´ï¼å¦æè¶
è¿è¿ä¸ªèå´å°±ä¼ææ°å¼æº¢åºçé£é©ã
å¨ Java ä¸ï¼64 ä½ long æ´åæ¯æå¤§çæ´æ°ç±»åã
```java
long l = Long.MAX_VALUE;
System.out.println(l + 1); // -9223372036854775808
System.out.println(l + 1 == Long.MIN_VALUE); // true
```
`BigInteger` å
é¨ä½¿ç¨ `int[]` æ°ç»æ¥åå¨ä»»æå¤§å°çæ´å½¢æ°æ®ã
ç¸å¯¹äºå¸¸è§æ´æ°ç±»åçè¿ç®æ¥è¯´ï¼`BigInteger` è¿ç®çæçä¼ç¸å¯¹è¾ä½ã
### 妿ä¸ä¸ªç±»æ²¡æå£°ææé æ¹æ³ï¼è¯¥ç¨åºè½æ£ç¡®æ§è¡å?
妿ä¸ä¸ªç±»æ²¡æå£°ææé æ¹æ³ï¼ä¹å¯ä»¥æ§è¡ï¼å 为ä¸ä¸ªç±»å³ä½¿æ²¡æå£°ææé æ¹æ³ä¹ä¼æé»è®¤çä¸å¸¦åæ°çæé æ¹æ³ã妿æä»¬èªå·±æ·»å äºç±»çæé æ¹æ³ï¼æ 论æ¯å¦æåï¼ï¼Java å°±ä¸ä¼åæ·»å é»è®¤çæ åæ°çæé æ¹æ³äºï¼æä»¬ä¸ç´å¨ä¸ç¥ä¸è§å°ä½¿ç¨æé æ¹æ³ï¼è¿ä¹æ¯ä¸ºä»ä¹æä»¬å¨åå»ºå¯¹è±¡çæ¶ååé¢è¦å ä¸ä¸ªæ¬å·ï¼å 为è¦è°ç¨æ åçæé æ¹æ³ï¼ã妿æä»¬éè½½äºæåçæé æ¹æ³ï¼è®°å¾é½è¦ææ åçæé æ¹æ³ä¹ååºæ¥ï¼æ 论æ¯å¦ç¨å°ï¼ï¼å 为è¿å¯ä»¥å¸®å©æä»¬å¨åå»ºå¯¹è±¡çæ¶åå°è¸©åã
### æé æ¹æ³æåªäºç¹ç¹ï¼æ¯å¦å¯è¢« override?
æé æ¹æ³ç¹ç¹å¦ä¸ï¼
- ååä¸ç±»åç¸åã
- 没æè¿åå¼ï¼ä½ä¸è½ç¨ void 声ææé 彿°ã
- çæç±»ç对象æ¶èªå¨æ§è¡ï¼æ éè°ç¨ã
æé æ¹æ³ä¸è½è¢« overrideï¼éåï¼,使¯å¯ä»¥ overloadï¼éè½½ï¼,æä»¥ä½ å¯ä»¥çå°ä¸ä¸ªç±»ä¸æå¤ä¸ªæé 彿°çæ
åµã
### é¢å对象ä¸å¤§ç¹å¾
#### å°è£
å°è£
æ¯ææä¸ä¸ªå¯¹è±¡çç¶æä¿¡æ¯ï¼ä¹å°±æ¯å±æ§ï¼éèå¨å¯¹è±¡å
é¨ï¼ä¸å
许å¤é¨å¯¹è±¡ç´æ¥è®¿é®å¯¹è±¡çå
é¨ä¿¡æ¯ã使¯å¯ä»¥æä¾ä¸äºå¯ä»¥è¢«å¤ç访é®çæ¹æ³æ¥æä½å±æ§ã就好åæä»¬çä¸å°æå¨å¢ä¸ç空è°çå
é¨çé¶ä»¶ä¿¡æ¯ï¼ä¹å°±æ¯å±æ§ï¼ï¼ä½æ¯å¯ä»¥éè¿é¥æ§å¨ï¼æ¹æ³ï¼æ¥æ§å¶ç©ºè°ã妿屿§ä¸æ³è¢«å¤ç访é®ï¼æä»¬å¤§å¯ä¸å¿
æä¾æ¹æ³ç»å¤ç访é®ã使¯å¦æä¸ä¸ªç±»æ²¡ææä¾ç»å¤ç访é®çæ¹æ³ï¼é£ä¹è¿ä¸ªç±»ä¹æ²¡æä»ä¹æä¹äºã就好åå¦ææ²¡æç©ºè°é¥æ§å¨ï¼é£ä¹æä»¬å°±æ æ³ææ§ç©ºåå¶å·ï¼ç©ºè°æ¬èº«å°±æ²¡ææä¹äºï¼å½ç¶ç°å¨è¿æå¾å¤å
¶ä»æ¹æ³ ï¼è¿éåªæ¯ä¸ºäºä¸¾ä¾åï¼ã
```java
public class Student {
private int id;//id屿§ç§æå
private String name;//name屿§ç§æå
//è·åidçæ¹æ³
public int getId() {
return id;
}
//设置idçæ¹æ³
public void setId(int id) {
this.id = id;
}
//è·ånameçæ¹æ³
public String getName() {
return name;
}
//设置nameçæ¹æ³
public void setName(String name) {
this.name = name;
}
}
```
#### ç»§æ¿
ä¸åç±»åç对象ï¼ç¸äºä¹é´ç»å¸¸æä¸å®æ°éçå
±åç¹ãä¾å¦ï¼å°æåå¦ãå°çº¢åå¦ãå°æåå¦ï¼é½å
±äº«å¦ççç¹æ§ï¼ç级ãå¦å·çï¼ãåæ¶ï¼æ¯ä¸ä¸ªå¯¹è±¡è¿å®ä¹äºé¢å¤çç¹æ§ä½¿å¾ä»ä»¬ä¸ä¼ä¸åãä¾å¦å°æçæ°å¦æ¯è¾å¥½ï¼å°çº¢çæ§æ ¼æ¹äººåç±ï¼å°æçåæ°æ¯è¾å¤§ãç»§æ¿æ¯ä½¿ç¨å·²åå¨çç±»çå®ä¹ä½ä¸ºåºç¡å»ºç«æ°ç±»çææ¯ï¼æ°ç±»çå®ä¹å¯ä»¥å¢å æ°çæ°æ®ææ°çåè½ï¼ä¹å¯ä»¥ç¨ç¶ç±»çåè½ï¼ä½ä¸è½éæ©æ§å°ç»§æ¿ç¶ç±»ãéè¿ä½¿ç¨ç»§æ¿ï¼å¯ä»¥å¿«éå°å建æ°çç±»ï¼å¯ä»¥æé«ä»£ç çéç¨ï¼ç¨åºçå¯ç»´æ¤æ§ï¼èç大éå建æ°ç±»çæ¶é´ ï¼æé«æä»¬çå¼åæçã
**å
³äºç»§æ¿å¦ä¸ 3 ç¹è¯·è®°ä½ï¼**
1. åç±»æ¥æç¶ç±»å¯¹è±¡ææç屿§åæ¹æ³ï¼å
æ¬ç§æå±æ§åç§ææ¹æ³ï¼ï¼ä½æ¯ç¶ç±»ä¸çç§æå±æ§åæ¹æ³åç±»æ¯æ æ³è®¿é®ï¼**åªæ¯æ¥æ**ã
2. åç±»å¯ä»¥æ¥æèªå·±å±æ§åæ¹æ³ï¼å³åç±»å¯ä»¥å¯¹ç¶ç±»è¿è¡æ©å±ã
3. åç±»å¯ä»¥ç¨èªå·±çæ¹å¼å®ç°ç¶ç±»çæ¹æ³ãï¼ä»¥åä»ç»ï¼ã
#### 夿
夿ï¼é¡¾åæä¹ï¼è¡¨ç¤ºä¸ä¸ªå¯¹è±¡å
·æå¤ç§çç¶æï¼å
·ä½è¡¨ç°ä¸ºç¶ç±»çå¼ç¨æååç±»çå®ä¾ã
**夿çç¹ç¹:**
- 对象类ååå¼ç¨ç±»åä¹é´å
·æç»§æ¿ï¼ç±»ï¼/å®ç°ï¼æ¥å£ï¼çå
³ç³»ï¼
- å¼ç¨ç±»ååéååºçæ¹æ³è°ç¨çå°åºæ¯åªä¸ªç±»ä¸çæ¹æ³ï¼å¿
é¡»å¨ç¨åºè¿è¡æé´æè½ç¡®å®ï¼
- 夿ä¸è½è°ç¨âåªå¨åç±»åå¨ä½å¨ç¶ç±»ä¸åå¨âçæ¹æ³ï¼
- 妿åç±»éåäºç¶ç±»çæ¹æ³ï¼çæ£æ§è¡çæ¯åç±»è¦ççæ¹æ³ï¼å¦æå类没æè¦çç¶ç±»çæ¹æ³ï¼æ§è¡çæ¯ç¶ç±»çæ¹æ³ã
### æ¥å£åæ½è±¡ç±»æä»ä¹å
±åç¹ååºå«ï¼
**å
±åç¹** ï¼
- é½ä¸è½è¢«å®ä¾åã
- é½å¯ä»¥å
嫿½è±¡æ¹æ³ã
- é½å¯ä»¥æé»è®¤å®ç°çæ¹æ³ï¼Java 8 å¯ä»¥ç¨ `default` å
³é®å卿¥å£ä¸å®ä¹é»è®¤æ¹æ³ï¼ã
**åºå«** ï¼
- æ¥å£ä¸»è¦ç¨äºå¯¹ç±»çè¡ä¸ºè¿è¡çº¦æï¼ä½ å®ç°äºæä¸ªæ¥å£å°±å
·æäºå¯¹åºçè¡ä¸ºãæ½è±¡ç±»ä¸»è¦ç¨äºä»£ç å¤ç¨ï¼å¼ºè°çæ¯æå±å
³ç³»ã
- ä¸ä¸ªç±»åªè½ç»§æ¿ä¸ä¸ªç±»ï¼ä½æ¯å¯ä»¥å®ç°å¤ä¸ªæ¥å£ã
- æ¥å£ä¸çæååéåªè½æ¯ `public static final` ç±»åçï¼ä¸è½è¢«ä¿®æ¹ä¸å¿
é¡»æåå§å¼ï¼èæ½è±¡ç±»çæååéé»è®¤ defaultï¼å¯å¨åç±»ä¸è¢«éæ°å®ä¹ï¼ä¹å¯è¢«éæ°èµå¼ã
### æ·±æ·è´åæµ
æ·è´åºå«äºè§£åï¼ä»ä¹æ¯å¼ç¨æ·è´ï¼
å
³äºæ·±æ·è´åæµ
æ·è´åºå«ï¼æè¿éå
ç»ç»è®ºï¼
- **æµ
æ·è´**ï¼æµ
æ·è´ä¼å¨å ä¸å建ä¸ä¸ªæ°ç对象ï¼åºå«äºå¼ç¨æ·è´çä¸ç¹ï¼ï¼ä¸è¿ï¼å¦æå对象å
é¨ç屿§æ¯å¼ç¨ç±»åçè¯ï¼æµ
æ·è´ä¼ç´æ¥å¤å¶å
é¨å¯¹è±¡çå¼ç¨å°åï¼ä¹å°±æ¯è¯´æ·è´å¯¹è±¡åå对象å
±ç¨åä¸ä¸ªå
é¨å¯¹è±¡ã
- **æ·±æ·è´** ï¼æ·±æ·è´ä¼å®å
¨å¤å¶æ´ä¸ªå¯¹è±¡ï¼å
æ¬è¿ä¸ªå¯¹è±¡æå
å«çå
é¨å¯¹è±¡ã
ä¸é¢çç»è®ºæ²¡æå®å
¨çè§£çè¯ä¹æ²¡å
³ç³»ï¼æä»¬æ¥çä¸ä¸ªå
·ä½çæ¡ä¾ï¼
**æµ
æ·è´**
æµ
æ·è´ç示ä¾ä»£ç å¦ä¸ï¼æä»¬è¿éå®ç°äº `Cloneable` æ¥å£ï¼å¹¶éåäº `clone()` æ¹æ³ã
`clone()` æ¹æ³çå®ç°å¾ç®åï¼ç´æ¥è°ç¨çæ¯ç¶ç±» `Object` ç `clone()` æ¹æ³ã
```java
public class Address implements Cloneable{
private String name;
// çç¥æé 彿°ãGetter&Setteræ¹æ³
@Override
public Address clone() {
try {
return (Address) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
public class Person implements Cloneable {
private Address address;
// çç¥æé 彿°ãGetter&Setteræ¹æ³
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
```
æµè¯ ï¼
```java
Person person1 = new Person(new Address("æ¦æ±"));
Person person1Copy = person1.clone();
// true
System.out.println(person1.getAddress() == person1Copy.getAddress());
```
ä»è¾åºç»æå°±å¯ä»¥çåºï¼ `person1` çå
é对象å `person1` 使ç¨çä»ç¶æ¯åä¸ä¸ª `Address` 对象ã
**æ·±æ·è´**
è¿éæä»¬ç®å对 `Person` ç±»ç `clone()` æ¹æ³è¿è¡ä¿®æ¹ï¼è¿å¸¦çè¦æ `Person` 对象å
é¨ç `Address` 对象ä¸èµ·å¤å¶ã
```java
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
person.setAddress(person.getAddress().clone());
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
```
æµè¯ ï¼
```java
Person person1 = new Person(new Address("æ¦æ±"));
Person person1Copy = person1.clone();
// false
System.out.println(person1.getAddress() == person1Copy.getAddress());
```
ä»è¾åºç»æå°±å¯ä»¥çåºï¼è½ç¶ `person1` çå
é对象å `person1` å
å«ç `Address` å¯¹è±¡å·²ç»æ¯ä¸åçäºã
**é£ä»ä¹æ¯å¼ç¨æ·è´å¢ï¼** ç®åæ¥è¯´ï¼å¼ç¨æ·è´å°±æ¯ä¸¤ä¸ªä¸åçå¼ç¨æååä¸ä¸ªå¯¹è±¡ã
æä¸é¨ç»äºä¸å¼ 徿¥æè¿°æµ
æ·è´ãæ·±æ·è´ãå¼ç¨æ·è´ï¼

### Object
#### Object ç±»çå¸¸è§æ¹æ³æåªäºï¼
Object ç±»æ¯ä¸ä¸ªç¹æ®çç±»ï¼æ¯ææç±»çç¶ç±»ãå®ä¸»è¦æä¾äºä»¥ä¸ 11 ä¸ªæ¹æ³ï¼
```java
/**
* native æ¹æ³ï¼ç¨äºè¿åå½åè¿è¡æ¶å¯¹è±¡ç Class 对象ï¼ä½¿ç¨äº final å
³é®åä¿®é¥°ï¼æ
ä¸å
许åç±»éåã
*/
public final native Class> getClass()
/**
* native æ¹æ³ï¼ç¨äºè¿å对象çåå¸ç ï¼ä¸»è¦ä½¿ç¨å¨åå¸è¡¨ä¸ï¼æ¯å¦ JDK ä¸çHashMapã
*/
public native int hashCode()
/**
* ç¨äºæ¯è¾ 2 个对象çå
åå°åæ¯å¦ç¸çï¼String ç±»å¯¹è¯¥æ¹æ³è¿è¡äºéå以ç¨äºæ¯è¾å符串ç弿¯å¦ç¸çã
*/
public boolean equals(Object obj)
/**
* naitive æ¹æ³ï¼ç¨äºå建并è¿åå½å对象çä¸ä»½æ·è´ã
*/
protected native Object clone() throws CloneNotSupportedException
/**
* è¿åç±»çååå®ä¾çåå¸ç ç 16 è¿å¶çå符串ã建议 Object ææçåç±»é½éåè¿ä¸ªæ¹æ³ã
*/
public String toString()
/**
* native æ¹æ³ï¼å¹¶ä¸ä¸è½éåãå¤éä¸ä¸ªå¨æ¤å¯¹è±¡çè§å¨ä¸çå¾
ç线ç¨(çè§å¨ç¸å½äºå°±æ¯éçæ¦å¿µ)ã妿æå¤ä¸ªçº¿ç¨å¨çå¾
åªä¼ä»»æå¤éä¸ä¸ªã
*/
public final native void notify()
/**
* native æ¹æ³ï¼å¹¶ä¸ä¸è½éåãè· notify 䏿 ·ï¼å¯ä¸çåºå«å°±æ¯ä¼å¤é卿¤å¯¹è±¡çè§å¨ä¸çå¾
çææçº¿ç¨ï¼è䏿¯ä¸ä¸ªçº¿ç¨ã
*/
public final native void notifyAll()
/**
* nativeæ¹æ³ï¼å¹¶ä¸ä¸è½éåãæå线ç¨çæ§è¡ã注æï¼sleep æ¹æ³æ²¡æéæ¾éï¼è wait æ¹æ³éæ¾äºé ï¼timeout æ¯çå¾
æ¶é´ã
*/
public final native void wait(long timeout) throws InterruptedException
/**
* å¤äº nanos åæ°ï¼è¿ä¸ªåæ°è¡¨ç¤ºé¢å¤æ¶é´ï¼ä»¥æ¯«å¾®ç§ä¸ºåä½ï¼èå´æ¯ 0-999999ï¼ã æä»¥è¶
æ¶çæ¶é´è¿éè¦å ä¸ nanos 毫ç§ãã
*/
public final void wait(long timeout, int nanos) throws InterruptedException
/**
* è·ä¹åç2个waitæ¹æ³ä¸æ ·ï¼åªä¸è¿è¯¥æ¹æ³ä¸ç´çå¾
ï¼æ²¡æè¶
æ¶æ¶é´è¿ä¸ªæ¦å¿µ
*/
public final void wait() throws InterruptedException
/**
* å®ä¾è¢«åå¾åæ¶å¨åæ¶çæ¶å触åçæä½
*/
protected void finalize() throws Throwable { }
```
#### == å equals() çåºå«
**`==`** 对äºåºæ¬ç±»ååå¼ç¨ç±»åçä½ç¨æææ¯ä¸åçï¼
- 对äºåºæ¬æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¼ã
- 对äºå¼ç¨æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¯¹è±¡çå
åå°åã
> å 为 Java åªæå¼ä¼ éï¼æä»¥ï¼å¯¹äº == æ¥è¯´ï¼ä¸ç®¡æ¯æ¯è¾åºæ¬æ°æ®ç±»åï¼è¿æ¯å¼ç¨æ°æ®ç±»åçåéï¼å
¶æ¬è´¨æ¯è¾ç齿¯å¼ï¼åªæ¯å¼ç¨ç±»ååéåç弿¯å¯¹è±¡çå°åã
**`equals()`** ä¸è½ç¨äºå¤æåºæ¬æ°æ®ç±»åçåéï¼åªè½ç¨æ¥å¤æä¸¤ä¸ªå¯¹è±¡æ¯å¦ç¸çã`equals()`æ¹æ³åå¨äº`Object`ç±»ä¸ï¼è`Object`ç±»æ¯ææç±»çç´æ¥æé´æ¥ç¶ç±»ï¼å æ¤ææçç±»é½æ`equals()`æ¹æ³ã
`Object` ç±» `equals()` æ¹æ³ï¼
```java
public boolean equals(Object obj) {
return (this == obj);
}
```
`equals()` æ¹æ³åå¨ä¸¤ç§ä½¿ç¨æ
åµï¼
- **类没æéå `equals()`æ¹æ³** ï¼éè¿`equals()`æ¯è¾è¯¥ç±»ç两个对象æ¶ï¼çä»·äºéè¿â==âæ¯è¾è¿ä¸¤ä¸ªå¯¹è±¡ï¼ä½¿ç¨çé»è®¤æ¯ `Object`ç±»`equals()`æ¹æ³ã
- **ç±»éåäº `equals()`æ¹æ³** ï¼ä¸è¬æä»¬é½éå `equals()`æ¹æ³æ¥æ¯è¾ä¸¤ä¸ªå¯¹è±¡ä¸ç屿§æ¯å¦ç¸çï¼è¥å®ä»¬ç屿§ç¸çï¼åè¿å true(å³ï¼è®¤ä¸ºè¿ä¸¤ä¸ªå¯¹è±¡ç¸ç)ã
举个ä¾åï¼è¿éåªæ¯ä¸ºäºä¸¾ä¾ãå®é
ä¸ï¼ä½ æç
§ä¸é¢è¿ç§åæ³çè¯ï¼å IDEA è¿ç§æ¯è¾æºè½ç IDE é½ä¼æç¤ºä½ å° `==` æ¢æ `equals()` ï¼ï¼
```java
String a = new String("ab"); // a 为ä¸ä¸ªå¼ç¨
String b = new String("ab"); // b为å¦ä¸ä¸ªå¼ç¨,对象çå
容䏿 ·
String aa = "ab"; // æ¾å¨å¸¸éæ± ä¸
String bb = "ab"; // ä»å¸¸éæ± ä¸æ¥æ¾
System.out.println(aa == bb);// true
System.out.println(a == b);// false
System.out.println(a.equals(b));// true
System.out.println(42 == 42.0);// true
```
`String` ä¸ç `equals` æ¹æ³æ¯è¢«éåè¿çï¼å 为 `Object` ç `equals` æ¹æ³æ¯æ¯è¾ç对象çå
åå°åï¼è `String` ç `equals` æ¹æ³æ¯è¾çæ¯å¯¹è±¡çå¼ã
å½å建 `String` ç±»åç对象æ¶ï¼èææºä¼å¨å¸¸éæ± ä¸æ¥æ¾ææ²¡æå·²ç»åå¨çå¼åè¦å建çå¼ç¸åç对象ï¼å¦ææå°±æå®èµç»å½åå¼ç¨ãå¦ææ²¡æå°±å¨å¸¸éæ± ä¸éæ°å建ä¸ä¸ª `String` 对象ã
`String`ç±»`equals()`æ¹æ³ï¼
```java
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
```
#### hashCode() æä»ä¹ç¨ï¼
`hashCode()` çä½ç¨æ¯è·ååå¸ç ï¼`int` æ´æ°ï¼ï¼ä¹ç§°ä¸ºæ£åç ãè¿ä¸ªåå¸ç çä½ç¨æ¯ç¡®å®è¯¥å¯¹è±¡å¨åå¸è¡¨ä¸çç´¢å¼ä½ç½®ã
`hashCode()`å®ä¹å¨ JDK ç `Object` ç±»ä¸ï¼è¿å°±æå³ç Java ä¸çä»»ä½ç±»é½å
嫿 `hashCode()` 彿°ãå¦å¤éè¦æ³¨æçæ¯ï¼ `Object` ç `hashCode()` æ¹æ³æ¯æ¬å°æ¹æ³ï¼ä¹å°±æ¯ç¨ C è¯è¨æ C++ å®ç°çï¼è¯¥æ¹æ³éå¸¸ç¨æ¥å°å¯¹è±¡çå
åå°å转æ¢ä¸ºæ´æ°ä¹åè¿åã
```java
public native int hashCode();
```
æ£å表åå¨çæ¯é®å¼å¯¹(key-value)ï¼å®çç¹ç¹æ¯ï¼**è½æ ¹æ®âé®âå¿«éçæ£ç´¢åºå¯¹åºçâå¼âãè¿å
¶ä¸å°±å©ç¨å°äºæ£åç ï¼ï¼å¯ä»¥å¿«éæ¾å°æéè¦ç对象ï¼**
#### 为ä»ä¹è¦æ hashCodeï¼
æä»¬ä»¥â`HashSet` å¦ä½æ£æ¥éå¤â为ä¾åæ¥è¯´æä¸ºä»ä¹è¦æ `hashCode`ï¼
ä¸é¢è¿æ®µå
容æèªæç Java å¯è书ãHead First Javaã:
> å½ä½ æå¯¹è±¡å å
¥ `HashSet` æ¶ï¼`HashSet` ä¼å
计ç®å¯¹è±¡ç `hashCode` 弿¥å¤æå¯¹è±¡å å
¥çä½ç½®ï¼åæ¶ä¹ä¼ä¸å
¶ä»å·²ç»å å
¥ç对象ç `hashCode` å¼ä½æ¯è¾ï¼å¦ææ²¡æç¸ç¬¦ç `hashCode`ï¼`HashSet` ä¼å设对象没æéå¤åºç°ã使¯å¦æåç°æç¸å `hashCode` å¼ç对象ï¼è¿æ¶ä¼è°ç¨ `equals()` æ¹æ³æ¥æ£æ¥ `hashCode` ç¸çç对象æ¯å¦ççç¸åã妿䏤è
ç¸åï¼`HashSet` å°±ä¸ä¼è®©å
¶å å
¥æä½æåã妿ä¸åçè¯ï¼å°±ä¼éæ°æ£åå°å
¶ä»ä½ç½®ãè¿æ ·æä»¬å°±å¤§å¤§åå°äº `equals` çæ¬¡æ°ï¼ç¸åºå°±å¤§å¤§æé«äºæ§è¡é度ã
å
¶å®ï¼ `hashCode()` å `equals()`齿¯ç¨äºæ¯è¾ä¸¤ä¸ªå¯¹è±¡æ¯å¦ç¸çã
**é£ä¸ºä»ä¹ JDK è¿è¦åæ¶æä¾è¿ä¸¤ä¸ªæ¹æ³å¢ï¼**
è¿æ¯å 为å¨ä¸äºå®¹å¨ï¼æ¯å¦ `HashMap`ã`HashSet`ï¼ä¸ï¼æäº `hashCode()` ä¹åï¼å¤æå
ç´ æ¯å¦å¨å¯¹åºå®¹å¨ä¸çæç伿´é«ï¼åèæ·»å å
ç´ è¿`HashSet`çè¿ç¨ï¼ï¼
æä»¬å¨åé¢ä¹æå°äºæ·»å å
ç´ è¿`HashSet`çè¿ç¨ï¼å¦æ `HashSet` å¨å¯¹æ¯çæ¶åï¼åæ ·ç `hashCode` æå¤ä¸ªå¯¹è±¡ï¼å®ä¼ç»§ç»ä½¿ç¨ `equals()` æ¥å¤ææ¯å¦ççç¸åãä¹å°±æ¯è¯´ `hashCode` å¸®å©æä»¬å¤§å¤§ç¼©å°äºæ¥æ¾ææ¬ã
**é£ä¸ºä»ä¹ä¸åªæä¾ `hashCode()` æ¹æ³å¢ï¼**
è¿æ¯å 为两个对象ç`hashCode` å¼ç¸çå¹¶ä¸ä»£è¡¨ä¸¤ä¸ªå¯¹è±¡å°±ç¸çã
**é£ä¸ºä»ä¹ä¸¤ä¸ªå¯¹è±¡æç¸åç `hashCode` å¼ï¼å®ä»¬ä¹ä¸ä¸å®æ¯ç¸ççï¼**
å 为 `hashCode()` æä½¿ç¨çåå¸ç®æ³ä¹è®¸å好ä¼è®©å¤ä¸ªå¯¹è±¡ä¼ åç¸åçåå¸å¼ãè¶ç³ç³çåå¸ç®æ³è¶å®¹æç¢°æï¼ä½è¿ä¹ä¸æ°æ®å¼ååå¸çç¹æ§æå
³ï¼æè°åå¸ç¢°æä¹å°±æ¯æçæ¯ä¸åç对象å¾å°ç¸åç `hashCode` )ã
æ»ç»ä¸æ¥å°±æ¯ ï¼
- å¦æä¸¤ä¸ªå¯¹è±¡ç`hashCode` å¼ç¸çï¼é£è¿ä¸¤ä¸ªå¯¹è±¡ä¸ä¸å®ç¸çï¼åå¸ç¢°æï¼ã
- å¦æä¸¤ä¸ªå¯¹è±¡ç`hashCode` å¼ç¸çå¹¶ä¸`equals()`æ¹æ³ä¹è¿å `true`ï¼æä»¬æè®¤ä¸ºè¿ä¸¤ä¸ªå¯¹è±¡ç¸çã
- å¦æä¸¤ä¸ªå¯¹è±¡ç`hashCode` å¼ä¸ç¸çï¼æä»¬å°±å¯ä»¥ç´æ¥è®¤ä¸ºè¿ä¸¤ä¸ªå¯¹è±¡ä¸ç¸çã
ç¸ä¿¡å¤§å®¶çäºæåé¢å¯¹ `hashCode()` å `equals()` çä»ç»ä¹åï¼ä¸é¢è¿ä¸ªé®é¢å·²ç»é¾ä¸åä½ ä»¬äºã
#### 为ä»ä¹éå equals() æ¶å¿
é¡»éå hashCode() æ¹æ³ï¼
å 为两个ç¸çç对象ç `hashCode` å¼å¿
é¡»æ¯ç¸çãä¹å°±æ¯è¯´å¦æ `equals` æ¹æ³å¤æä¸¤ä¸ªå¯¹è±¡æ¯ç¸ççï¼é£è¿ä¸¤ä¸ªå¯¹è±¡ç `hashCode` å¼ä¹è¦ç¸çã
妿éå `equals()` æ¶æ²¡æéå `hashCode()` æ¹æ³çè¯å°±å¯è½ä¼å¯¼è´ `equals` æ¹æ³å¤ææ¯ç¸çç两个对象ï¼`hashCode` å¼å´ä¸ç¸çã
**æè** ï¼éå `equals()` æ¶æ²¡æéå `hashCode()` æ¹æ³çè¯ï¼ä½¿ç¨ `HashMap` å¯è½ä¼åºç°ä»ä¹é®é¢ã
**æ»ç»** ï¼
- `equals` æ¹æ³å¤æä¸¤ä¸ªå¯¹è±¡æ¯ç¸ççï¼é£è¿ä¸¤ä¸ªå¯¹è±¡ç `hashCode` å¼ä¹è¦ç¸çã
- 两个对象æç¸åç `hashCode` å¼ï¼ä»ä»¬ä¹ä¸ä¸å®æ¯ç¸ççï¼åå¸ç¢°æï¼ã
æ´å¤å
³äº `hashCode()` å `equals()` çå
容å¯ä»¥æ¥çï¼[Java hashCode() å equals()çè¥å¹²é®é¢è§£ç](https://www.cnblogs.com/skywang12345/p/3324958.html)
### String
#### StringãStringBufferãStringBuilder çåºå«ï¼
**å¯åæ§**
`String` æ¯ä¸å¯åçï¼åé¢ä¼è¯¦ç»åæåå ï¼ã
`StringBuilder` ä¸ `StringBuffer` é½ç»§æ¿èª `AbstractStringBuilder` ç±»ï¼å¨ `AbstractStringBuilder` ä¸ä¹æ¯ä½¿ç¨å符æ°ç»ä¿åå符串ï¼ä¸è¿æ²¡æä½¿ç¨ `final` å `private` å
³é®åä¿®é¥°ï¼æå
³é®çæ¯è¿ä¸ª `AbstractStringBuilder` ç±»è¿æä¾äºå¾å¤ä¿®æ¹åç¬¦ä¸²çæ¹æ³æ¯å¦ `append` æ¹æ³ã
```java
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
//...
}
```
**线ç¨å®å
¨æ§**
`String` ä¸ç对象æ¯ä¸å¯åçï¼ä¹å°±å¯ä»¥ç解为常éï¼çº¿ç¨å®å
¨ã`AbstractStringBuilder` æ¯ `StringBuilder` ä¸ `StringBuffer` çå
Œ
±ç¶ç±»ï¼å®ä¹äºä¸äºå符串çåºæ¬æä½ï¼å¦ `expandCapacity`ã`append`ã`insert`ã`indexOf` çå
Œ
±æ¹æ³ã`StringBuffer` å¯¹æ¹æ³å äºåæ¥éæè
对è°ç¨çæ¹æ³å äºåæ¥éï¼æä»¥æ¯çº¿ç¨å®å
¨çã`StringBuilder` 并没æå¯¹æ¹æ³è¿è¡å 忥éï¼æä»¥æ¯é线ç¨å®å
¨çã
**æ§è½**
æ¯æ¬¡å¯¹ `String` ç±»åè¿è¡æ¹åçæ¶åï¼é½ä¼çæä¸ä¸ªæ°ç `String` 对象ï¼ç¶åå°æéæåæ°ç `String` 对象ã`StringBuffer` æ¯æ¬¡é½ä¼å¯¹ `StringBuffer` 对象æ¬èº«è¿è¡æä½ï¼è䏿¯çææ°ç对象并æ¹å对象å¼ç¨ãç¸åæ
åµä¸ä½¿ç¨ `StringBuilder` ç¸æ¯ä½¿ç¨ `StringBuffer` ä»
è½è·å¾ 10%~15% å·¦å³çæ§è½æåï¼ä½å´è¦åå¤çº¿ç¨ä¸å®å
¨çé£é©ã
**对äºä¸è
使ç¨çæ»ç»ï¼**
1. æä½å°éçæ°æ®: éç¨ `String`
2. åçº¿ç¨æä½å符串ç¼å²åºä¸æä½å¤§éæ°æ®: éç¨ `StringBuilder`
3. å¤çº¿ç¨æä½å符串ç¼å²åºä¸æä½å¤§éæ°æ®: éç¨ `StringBuffer`
#### String 为ä»ä¹æ¯ä¸å¯åç?
`String` ç±»ä¸ä½¿ç¨ `final` å
³é®å修饰å符æ°ç»æ¥ä¿åå符串ï¼~~æä»¥`String` 对象æ¯ä¸å¯åçã~~
```java
public final class String implements java.io.Serializable, Comparable, CharSequence {
private final char value[];
//...
}
```
> ð ä¿®æ£ ï¼ æä»¬ç¥é被 `final` å
³é®å修饰çç±»ä¸è½è¢«ç»§æ¿ï¼ä¿®é¥°çæ¹æ³ä¸è½è¢«éåï¼ä¿®é¥°çåéæ¯åºæ¬æ°æ®ç±»ååå¼ä¸è½æ¹åï¼ä¿®é¥°çå鿝å¼ç¨ç±»ååä¸è½åæåå
¶ä»å¯¹è±¡ãå æ¤ï¼`final` å
³é®åä¿®é¥°çæ°ç»ä¿ååç¬¦ä¸²å¹¶ä¸æ¯ `String` ä¸å¯åçæ ¹æ¬åå ï¼å 为è¿ä¸ªæ°ç»ä¿åçå符串æ¯å¯åçï¼`final` 修饰å¼ç¨ç±»ååéçæ
åµï¼ã
>
> `String` çæ£ä¸å¯åæä¸é¢å ç¹åå ï¼
>
> 1. ä¿ååç¬¦ä¸²çæ°ç»è¢« `final` 修饰ä¸ä¸ºç§æçï¼å¹¶ä¸`String` 类没ææä¾/æ´é²ä¿®æ¹è¿ä¸ªåç¬¦ä¸²çæ¹æ³ã
> 2. `String` 类被 `final` 修饰导è´å
¶ä¸è½è¢«ç»§æ¿ï¼è¿èé¿å
äºåç±»ç ´å `String` ä¸å¯åã
>
> ç¸å
³é
读ï¼[å¦ä½çè§£ String ç±»åå¼çä¸å¯åï¼ - ç¥ä¹æé®](https://www.zhihu.com/question/20618891/answer/114125846)
>
> è¡¥å
ï¼æ¥èª[issue 675](https://github.com/Snailclimb/JavaGuide/issues/675)ï¼ï¼å¨ Java 9 ä¹åï¼`String` ã`StringBuilder` ä¸ `StringBuffer` çå®ç°æ¹ç¨ `byte` æ°ç»åå¨å符串ã
>
> ```java
> public final class String implements java.io.Serializable,Comparable, CharSequence {
> // @Stable 注解表示åéæå¤è¢«ä¿®æ¹ä¸æ¬¡ï¼ç§°ä¸ºâ稳å®çâã
> @Stable
> private final byte[] value;
> }
>
> abstract class AbstractStringBuilder implements Appendable, CharSequence {
> byte[] value;
>
> }
> ```
>
> **Java 9 为ä½è¦å° `String` çåºå±å®ç°ç± `char[]` æ¹æäº `byte[]` ?**
>
> æ°çç String å
¶å®æ¯æä¸¤ä¸ªç¼ç æ¹æ¡ï¼ Latin-1 å UTF-16ã妿å符串ä¸å
å«çæ±å没æè¶
è¿ Latin-1 å¯è¡¨ç¤ºèå´å
çå符ï¼é£å°±ä¼ä½¿ç¨ Latin-1 ä½ä¸ºç¼ç æ¹æ¡ãLatin-1 ç¼ç æ¹æ¡ä¸ï¼`byte` å ä¸ä¸ªåè(8 ä½)ï¼`char` å ç¨ 2 个åèï¼16ï¼ï¼`byte` ç¸è¾ `char` èçä¸åçå
å空é´ã
>
> JDK 宿¹å°±è¯´äºç»å¤§é¨åå符串对象åªå
å« Latin-1 å¯è¡¨ç¤ºçå符ã
>
> 
>
> 妿å符串ä¸å
å«çæ±åè¶
è¿ Latin-1 å¯è¡¨ç¤ºèå´å
çå符ï¼`byte` å `char` æå ç¨çç©ºé´æ¯ä¸æ ·çã
>
> è¿æ¯å®æ¹çä»ç»ï¼https://openjdk.java.net/jeps/254 ã
#### åç¬¦ä¸²æ¼æ¥ç¨â+â è¿æ¯ StringBuilder?
Java è¯è¨æ¬èº«å¹¶ä¸æ¯æè¿ç®ç¬¦éè½½ï¼â+âåâ+=âæ¯ä¸é¨ä¸º String ç±»éè½½è¿çè¿ç®ç¬¦ï¼ä¹æ¯ Java ä¸ä»
æç两个éè½½è¿çè¿ç®ç¬¦ã
```java
String str1 = "he";
String str2 = "llo";
String str3 = "world";
String str4 = str1 + str2 + str3;
```
ä¸é¢ç代ç 对åºçåèç å¦ä¸ï¼

å¯ä»¥çåºï¼å符串对象éè¿â+âçåç¬¦ä¸²æ¼æ¥æ¹å¼ï¼å®é
䏿¯éè¿ `StringBuilder` è°ç¨ `append()` æ¹æ³å®ç°çï¼æ¼æ¥å®æä¹åè°ç¨ `toString()` å¾å°ä¸ä¸ª `String` 对象 ã
ä¸è¿ï¼å¨å¾ªç¯å
使ç¨â+âè¿è¡åç¬¦ä¸²çæ¼æ¥çè¯ï¼å卿¯è¾ææ¾ç缺é·ï¼**ç¼è¯å¨ä¸ä¼å建å个 `StringBuilder` 以å¤ç¨ï¼ä¼å¯¼è´å建è¿å¤ç `StringBuilder` 对象**ã
```java
String[] arr = {"he", "llo", "world"};
String s = "";
for (int i = 0; i < arr.length; i++) {
s += arr[i];
}
System.out.println(s);
```
`StringBuilder` 对象æ¯å¨å¾ªç¯å
é¨è¢«å建çï¼è¿æå³çæ¯å¾ªç¯ä¸æ¬¡å°±ä¼å建ä¸ä¸ª `StringBuilder` 对象ã

å¦æç´æ¥ä½¿ç¨ `StringBuilder` 对象è¿è¡åç¬¦ä¸²æ¼æ¥çè¯ï¼å°±ä¸ä¼åå¨è¿ä¸ªé®é¢äºã
```java
String[] arr = {"he", "llo", "world"};
StringBuilder s = new StringBuilder();
for (String value : arr) {
s.append(value);
}
System.out.println(s);
```

å¦æä½ ä½¿ç¨ IDEA çè¯ï¼IDEA èªå¸¦çä»£ç æ£æ¥æºå¶ä¹ä¼æç¤ºä½ ä¿®æ¹ä»£ç ã
#### String#equals() å Object#equals() æä½åºå«ï¼
`String` ä¸ç `equals` æ¹æ³æ¯è¢«éåè¿çï¼æ¯è¾çæ¯ String å符串ç弿¯å¦ç¸çã `Object` ç `equals` æ¹æ³æ¯æ¯è¾ç对象çå
åå°åã
#### åç¬¦ä¸²å¸¸éæ± çä½ç¨äºè§£åï¼
**åç¬¦ä¸²å¸¸éæ± ** æ¯ JVM ä¸ºäºæåæ§è½ååå°å
åæ¶èé对å符串ï¼String ç±»ï¼ä¸é¨å¼è¾çä¸ååºåï¼ä¸»è¦ç®çæ¯ä¸ºäºé¿å
å符串çéå¤å建ã
```java
// å¨å ä¸å建å符串对象âabâ
// å°å符串对象âabâçå¼ç¨ä¿åå¨åç¬¦ä¸²å¸¸éæ± ä¸
String aa = "ab";
// ç´æ¥è¿ååç¬¦ä¸²å¸¸éæ± ä¸å符串对象âabâçå¼ç¨
String bb = "ab";
System.out.println(aa==bb);// true
```
æ´å¤å
³äºåç¬¦ä¸²å¸¸éæ± çä»ç»å¯ä»¥çä¸ä¸ [Java å
ååºå详解](https://javaguide.cn/java/jvm/memory-area.html) è¿ç¯æç« ã
#### String s1 = new String("abc");è¿å¥è¯å建äºå 个å符串对象ï¼
ä¼å建 1 æ 2 个å符串对象ã
1ã妿åç¬¦ä¸²å¸¸éæ± ä¸ä¸åå¨å符串对象âabcâçå¼ç¨ï¼é£ä¹ä¼å¨å ä¸å建 2 个å符串对象âabcâã
示ä¾ä»£ç ï¼JDK 1.8ï¼ï¼
```java
String s1 = new String("abc");
```
对åºçåèç ï¼

`ldc` å½ä»¤ç¨äºå¤æåç¬¦ä¸²å¸¸éæ± 䏿¯å¦ä¿åäºå¯¹åºçå符串对象çå¼ç¨ï¼å¦æä¿åäºçè¯ç´æ¥è¿åï¼å¦ææ²¡æä¿åçè¯ï¼ä¼å¨å ä¸å建对åºçå符串对象并å°è¯¥å符串对象çå¼ç¨ä¿åå°åç¬¦ä¸²å¸¸éæ± ä¸ã
2ã妿åç¬¦ä¸²å¸¸éæ± ä¸å·²åå¨å符串对象âabcâçå¼ç¨ï¼ååªä¼å¨å ä¸å建 1 个å符串对象âabcâã
示ä¾ä»£ç ï¼JDK 1.8ï¼ï¼
```java
// åç¬¦ä¸²å¸¸éæ± ä¸å·²åå¨å符串对象âabcâçå¼ç¨
String s1 = "abc";
// ä¸é¢è¿æ®µä»£ç åªä¼å¨å ä¸å建 1 个å符串对象âabcâ
String s2 = new String("abc");
```
对åºçåèç ï¼

è¿éå°±ä¸å¯¹ä¸é¢çåèç è¿è¡è¯¦ç»æ³¨éäºï¼7 è¿ä¸ªä½ç½®ç `ldc` å½ä»¤ä¸ä¼å¨å ä¸å建æ°çå符串对象âabcâï¼è¿æ¯å 为 0 è¿ä¸ªä½ç½®å·²ç»æ§è¡äºä¸æ¬¡ `ldc` å½ä»¤ï¼å·²ç»å¨å ä¸å建è¿ä¸æ¬¡å符串对象âabcâäºã7 è¿ä¸ªä½ç½®æ§è¡ `ldc` å½ä»¤ä¼ç´æ¥è¿ååç¬¦ä¸²å¸¸éæ± ä¸å符串对象âabcâ对åºçå¼ç¨ã
#### intern æ¹æ³æä»ä¹ä½ç¨?
`String.intern()` æ¯ä¸ä¸ª nativeï¼æ¬å°ï¼æ¹æ³ï¼å
¶ä½ç¨æ¯å°æå®çå符串对象çå¼ç¨ä¿åå¨åç¬¦ä¸²å¸¸éæ± ä¸ï¼å¯ä»¥ç®ååä¸ºä¸¤ç§æ
åµï¼
- 妿åç¬¦ä¸²å¸¸éæ± ä¸ä¿åäºå¯¹åºçå符串对象çå¼ç¨ï¼å°±ç´æ¥è¿å该å¼ç¨ã
- 妿åç¬¦ä¸²å¸¸éæ± 䏿²¡æä¿åäºå¯¹åºçå符串对象çå¼ç¨ï¼é£å°±å¨å¸¸éæ± ä¸å建ä¸ä¸ªæå该å符串对象çå¼ç¨å¹¶è¿åã
示ä¾ä»£ç ï¼JDK 1.8ï¼ :
```java
// å¨å ä¸å建å符串对象âJavaâ
// å°å符串对象âJavaâçå¼ç¨ä¿åå¨åç¬¦ä¸²å¸¸éæ± ä¸
String s1 = "Java";
// ç´æ¥è¿ååç¬¦ä¸²å¸¸éæ± ä¸å符串对象âJavaâ对åºçå¼ç¨
String s2 = s1.intern();
// ä¼å¨å ä¸å¨åç¬å建ä¸ä¸ªå符串对象
String s3 = new String("Java");
// ç´æ¥è¿ååç¬¦ä¸²å¸¸éæ± ä¸å符串对象âJavaâ对åºçå¼ç¨
String s4 = s3.intern();
// s1 å s2 æåçæ¯å ä¸çåä¸ä¸ªå¯¹è±¡
System.out.println(s1 == s2); // true
// s3 å s4 æåçæ¯å ä¸ä¸åç对象
System.out.println(s3 == s4); // false
// s1 å s4 æåçæ¯å ä¸çåä¸ä¸ªå¯¹è±¡
System.out.println(s1 == s4); //true
```
#### String ç±»åçåéå常éåâ+âè¿ç®æ¶åçäºä»ä¹ï¼
å
æ¥çå符串ä¸å `final` å
³é®åæ¼æ¥çæ
åµï¼JDK1.8ï¼ï¼
```java
String str1 = "str";
String str2 = "ing";
String str3 = "str" + "ing";
String str4 = str1 + str2;
String str5 = "string";
System.out.println(str3 == str4);//false
System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false
```
> **注æ** ï¼æ¯è¾ String å符串ç弿¯å¦ç¸çï¼å¯ä»¥ä½¿ç¨ `equals()` æ¹æ³ã `String` ä¸ç `equals` æ¹æ³æ¯è¢«éåè¿çã `Object` ç `equals` æ¹æ³æ¯æ¯è¾ç对象çå
åå°åï¼è `String` ç `equals` æ¹æ³æ¯è¾çæ¯å符串ç弿¯å¦ç¸çãå¦æä½ ä½¿ç¨ `==` æ¯è¾ä¸¤ä¸ªå符串æ¯å¦ç¸ççè¯ï¼IDEA è¿æ¯æç¤ºä½ ä½¿ç¨ `equals()` æ¹æ³æ¿æ¢ã

**对äºç¼è¯æå¯ä»¥ç¡®å®å¼çå符串ï¼ä¹å°±æ¯å¸¸éå符串 ï¼jvm ä¼å°å
¶åå
¥åç¬¦ä¸²å¸¸éæ± ãå¹¶ä¸ï¼åç¬¦ä¸²å¸¸éæ¼æ¥å¾å°çå符串常éå¨ç¼è¯é¶æ®µå°±å·²ç»è¢«åæ¾åç¬¦ä¸²å¸¸éæ± ï¼è¿ä¸ªå¾çäºç¼è¯å¨çä¼åã**
å¨ç¼è¯è¿ç¨ä¸ï¼Javac ç¼è¯å¨ï¼ä¸æä¸ç»ç§°ä¸ºç¼è¯å¨ï¼ä¼è¿è¡ä¸ä¸ªå«å **常éæå (Constant Folding)** ç代ç ä¼åããæ·±å
¥çè§£ Java èææºã䏿¯ä¹æä»ç»å°ï¼

常éæå 伿叏é表达å¼ç弿±åºæ¥ä½ä¸ºå¸¸éåµå¨æç»çæç代ç ä¸ï¼è¿æ¯ Javac ç¼è¯å¨ä¼å¯¹æºä»£ç åçæå°éä¼åæªæ½ä¹ä¸(代ç ä¼åå ä¹é½å¨å³æ¶ç¼è¯å¨ä¸è¿è¡)ã
å¯¹äº `String str3 = "str" + "ing";` ç¼è¯å¨ä¼ç»ä½ ä¼åæ `String str3 = "string";` ã
并䏿¯ææç常éé½ä¼è¿è¡æå ï¼åªæç¼è¯å¨å¨ç¨åºç¼è¯æå°±å¯ä»¥ç¡®å®å¼ç常éæå¯ä»¥ï¼
- åºæ¬æ°æ®ç±»å( `byte`ã`boolean`ã`short`ã`char`ã`int`ã`float`ã`long`ã`double`)以åå符串常éã
- `final` 修饰çåºæ¬æ°æ®ç±»ååå符串åé
- å符串éè¿ â+âæ¼æ¥å¾å°çå符串ãåºæ¬æ°æ®ç±»åä¹é´ç®æ°è¿ç®ï¼å åä¹é¤ï¼ãåºæ¬æ°æ®ç±»åçä½è¿ç®ï¼<<ã\>>ã\>>> ï¼
**å¼ç¨çå¼å¨ç¨åºç¼è¯ææ¯æ æ³ç¡®å®çï¼ç¼è¯å¨æ æ³å¯¹å
¶è¿è¡ä¼åã**
对象å¼ç¨åâ+âçåç¬¦ä¸²æ¼æ¥æ¹å¼ï¼å®é
䏿¯éè¿ `StringBuilder` è°ç¨ `append()` æ¹æ³å®ç°çï¼æ¼æ¥å®æä¹åè°ç¨ `toString()` å¾å°ä¸ä¸ª `String` 对象 ã
```java
String str4 = new StringBuilder().append(str1).append(str2).toString();
```
æä»¬å¨å¹³æ¶å代ç çæ¶åï¼å°½éé¿å
å¤ä¸ªåç¬¦ä¸²å¯¹è±¡æ¼æ¥ï¼å ä¸ºè¿æ ·ä¼éæ°å建对象ã妿éè¦æ¹åå符串çè¯ï¼å¯ä»¥ä½¿ç¨ `StringBuilder` æè
`StringBuffer`ã
ä¸è¿ï¼åç¬¦ä¸²ä½¿ç¨ `final` å
³é®å声æä¹åï¼å¯ä»¥è®©ç¼è¯å¨å½å叏鿥å¤çã
示ä¾ä»£ç ï¼
```java
final String str1 = "str";
final String str2 = "ing";
// ä¸é¢ä¸¤ä¸ªè¡¨è¾¾å¼å
¶å®æ¯çä»·ç
String c = "str" + "ing";// 叏鿱 ä¸ç对象
String d = str1 + str2; // 叏鿱 ä¸ç对象
System.out.println(c == d);// true
```
被 `final` å
³é®åä¿®æ¹ä¹åç `String` ä¼è¢«ç¼è¯å¨å½å叏鿥å¤çï¼ç¼è¯å¨å¨ç¨åºç¼è¯æå°±å¯ä»¥ç¡®å®å®çå¼ï¼å
¶ææå°±ç¸å½äºè®¿é®å¸¸éã
妿 ï¼ç¼è¯å¨å¨è¿è¡æ¶æè½ç¥éå
¶ç¡®åå¼çè¯ï¼å°±æ æ³å¯¹å
¶ä¼åã
示ä¾ä»£ç ï¼`str2` å¨è¿è¡æ¶æè½ç¡®å®å
¶å¼ï¼ï¼
```java
final String str1 = "str";
final String str2 = getStr();
String c = "str" + "ing";// 叏鿱 ä¸ç对象
String d = str1 + str2; // å¨å ä¸åå»ºçæ°ç对象
System.out.println(c == d);// false
public static String getStr() {
return "ing";
}
```
### Exception å Error æä»ä¹åºå«ï¼
å¨ Java ä¸ï¼ææçå¼å¸¸é½æä¸ä¸ªå
±åçç¥å
`java.lang` å
ä¸ç `Throwable` ç±»ã`Throwable` ç±»æä¸¤ä¸ªéè¦çåç±»:
- **`Exception`** :ç¨åºæ¬èº«å¯ä»¥å¤ççå¼å¸¸ï¼å¯ä»¥éè¿ `catch` æ¥è¿è¡æè·ã`Exception` åå¯ä»¥å为 Checked Exception (忣æ¥å¼å¸¸ï¼å¿
é¡»å¤ç) å Unchecked Exception (ä¸åæ£æ¥å¼å¸¸ï¼å¯ä»¥ä¸å¤ç)ã
- **`Error`** ï¼`Error` å±äºç¨åºæ æ³å¤ççé误 ï¼~~æä»¬æ²¡åæ³éè¿ `catch` æ¥è¿è¡æè·~~ä¸å»ºè®®éè¿`catch`æè· ãä¾å¦ Java èææºè¿è¡é误ï¼`Virtual MachineError`ï¼ãèææºå
åä¸å¤é误(`OutOfMemoryError`)ãç±»å®ä¹é误ï¼`NoClassDefFoundError`ï¼ç ãè¿äºå¼å¸¸åçæ¶ï¼Java èææºï¼JVMï¼ä¸è¬ä¼éæ©çº¿ç¨ç»æ¢ã
### Checked Exception å Unchecked Exception æä»ä¹åºå«ï¼
**Java å¼å¸¸ç±»å±æ¬¡ç»æå¾æ¦è§** ï¼

**Checked Exception** å³ åæ£æ¥å¼å¸¸ ï¼Java 代ç å¨ç¼è¯è¿ç¨ä¸ï¼å¦æåæ£æ¥å¼å¸¸æ²¡æè¢« `catch`æè
`throws` å
³é®åå¤ççè¯ï¼å°±æ²¡åæ³éè¿ç¼è¯ã
æ¯å¦ä¸é¢è¿æ®µ IO æä½ç代ç ï¼

é¤äº`RuntimeException`åå
¶å类以å¤ï¼å
¶ä»ç`Exception`ç±»åå
¶åç±»é½å±äºåæ£æ¥å¼å¸¸ ã常è§ç忣æ¥å¼å¸¸æï¼ IO ç¸å
³çå¼å¸¸ã`ClassNotFoundException` ã`SQLException`...ã
**Unchecked Exception** å³ **ä¸åæ£æ¥å¼å¸¸** ï¼Java 代ç å¨ç¼è¯è¿ç¨ä¸ ï¼æä»¬å³ä½¿ä¸å¤çä¸åæ£æ¥å¼å¸¸ä¹å¯ä»¥æ£å¸¸éè¿ç¼è¯ã
`RuntimeException` åå
¶åç±»é½ç»ç§°ä¸ºé忣æ¥å¼å¸¸ï¼å¸¸è§çæï¼å»ºè®®è®°ä¸æ¥ï¼æ¥å¸¸å¼åä¸ä¼ç»å¸¸ç¨å°ï¼ï¼
- `NullPointerException`(空æéé误)
- `IllegalArgumentException`(åæ°é误æ¯å¦æ¹æ³å
¥åç±»åé误)
- `NumberFormatException`ï¼å符串转æ¢ä¸ºæ°åæ ¼å¼é误ï¼`IllegalArgumentException`çåç±»ï¼
- `ArrayIndexOutOfBoundsException`ï¼æ°ç»è¶çé误ï¼
- `ClassCastException`ï¼ç±»å转æ¢é误ï¼
- `ArithmeticException`ï¼ç®æ¯é误ï¼
- `SecurityException` ï¼å®å
¨é误æ¯å¦æéä¸å¤ï¼
- `UnsupportedOperationException`(䏿¯æçæä½é误æ¯å¦éå¤å建åä¸ç¨æ·)
- ......

### Throwable ç±»å¸¸ç¨æ¹æ³æåªäºï¼
- `String getMessage()`: è¿åå¼å¸¸åçæ¶çç®è¦æè¿°
- `String toString()`: è¿åå¼å¸¸åçæ¶ç详ç»ä¿¡æ¯
- `String getLocalizedMessage()`: è¿åå¼å¸¸å¯¹è±¡çæ¬å°åä¿¡æ¯ãä½¿ç¨ `Throwable` çåç±»è¦çè¿ä¸ªæ¹æ³ï¼å¯ä»¥çææ¬å°åä¿¡æ¯ã妿å类没æè¦çè¯¥æ¹æ³ï¼åè¯¥æ¹æ³è¿åçä¿¡æ¯ä¸ `getMessage()`è¿åçç»æç¸å
- `void printStackTrace()`: 卿§å¶å°ä¸æå° `Throwable` 对象å°è£
çå¼å¸¸ä¿¡æ¯
### try-catch-finally å¦ä½ä½¿ç¨ï¼
- `try`å ï¼ ç¨äºæè·å¼å¸¸ãå
¶å坿¥é¶ä¸ªæå¤ä¸ª `catch` åï¼å¦ææ²¡æ `catch` åï¼åå¿
é¡»è·ä¸ä¸ª `finally` åã
- `catch`å ï¼ ç¨äºå¤ç try æè·å°çå¼å¸¸ã
- `finally` å ï¼ æ 论æ¯å¦æè·æå¤çå¼å¸¸ï¼`finally` åéçè¯å¥é½ä¼è¢«æ§è¡ãå½å¨ `try` åæ `catch` åä¸éå° `return` è¯å¥æ¶ï¼`finally` è¯å¥åå°å¨æ¹æ³è¿åä¹å被æ§è¡ã
代ç 示ä¾ï¼
```java
try {
System.out.println("Try to do something");
throw new RuntimeException("RuntimeException");
} catch (Exception e) {
System.out.println("Catch Exception -> " + e.getMessage());
} finally {
System.out.println("Finally");
}
```
è¾åºï¼
```
Try to do something
Catch Exception -> RuntimeException
Finally
```
**注æï¼ä¸è¦å¨ finally è¯å¥åä¸ä½¿ç¨ return!** å½ try è¯å¥å finally è¯å¥ä¸é½æ return è¯å¥æ¶ï¼try è¯å¥åä¸ç return è¯å¥ä¼è¢«å¿½ç¥ãè¿æ¯å 为 try è¯å¥ä¸ç return è¿åå¼ä¼å
被æåå¨ä¸ä¸ªæ¬å°åéä¸ï¼å½æ§è¡å° finally è¯å¥ä¸ç return ä¹åï¼è¿ä¸ªæ¬å°åéçå¼å°±åä¸ºäº finally è¯å¥ä¸ç return è¿åå¼ã
[jvm 宿¹ææ¡£](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.5)䏿æç¡®æå°ï¼
> If the `try` clause executes a _return_, the compiled code does the following:
>
> 1. Saves the return value (if any) in a local variable.
> 2. Executes a _jsr_ to the code for the `finally` clause.
> 3. Upon return from the `finally` clause, returns the value saved in the local variable.
代ç 示ä¾ï¼
```java
public static void main(String[] args) {
System.out.println(f(2));
}
public static int f(int value) {
try {
return value * value;
} finally {
if (value == 2) {
return 0;
}
}
}
```
è¾åºï¼
```
0
```
### finally ä¸ç代ç ä¸å®ä¼æ§è¡åï¼
ä¸ä¸å®çï¼å¨æäºæ
åµä¸ï¼finally ä¸ç代ç ä¸ä¼è¢«æ§è¡ã
å°±æ¯å¦è¯´ finally ä¹åèææºè¢«ç»æ¢è¿è¡çè¯ï¼finally ä¸ç代ç å°±ä¸ä¼è¢«æ§è¡ã
```java
try {
System.out.println("Try to do something");
throw new RuntimeException("RuntimeException");
} catch (Exception e) {
System.out.println("Catch Exception -> " + e.getMessage());
// ç»æ¢å½åæ£å¨è¿è¡çJavaèææº
System.exit(1);
} finally {
System.out.println("Finally");
}
```
è¾åºï¼
```
Try to do something
Catch Exception -> RuntimeException
```
å¦å¤ï¼å¨ä»¥ä¸ 2 ç§ç¹æ®æ
åµä¸ï¼`finally` åç代ç ä¹ä¸ä¼è¢«æ§è¡ï¼
1. ç¨åºæå¨ççº¿ç¨æ»äº¡ã
2. å
³é CPUã
ç¸å
³ issueï¼ ã
ð§ð» è¿é¶ä¸ä¸ï¼ä»åèç è§åº¦åæ`try catch finally`è¿ä¸ªè¯æ³ç³èåçå®ç°åçã
### å¦ä½ä½¿ç¨ `try-with-resources` 代æ¿`try-catch-finally`ï¼
1. **éç¨èå´ï¼èµæºçå®ä¹ï¼ï¼** ä»»ä½å®ç° `java.lang.AutoCloseable`æè
`java.io.Closeable` ç对象
2. **å
³éèµæºå finally åçæ§è¡é¡ºåºï¼** å¨ `try-with-resources` è¯å¥ä¸ï¼ä»»ä½ catch æ finally åå¨å£°æçèµæºå
³éåè¿è¡
ãEffective Javaãä¸æç¡®æåºï¼
> é¢å¯¹å¿
é¡»è¦å
³éçèµæºï¼æä»¬æ»æ¯åºè¯¥ä¼å
ä½¿ç¨ `try-with-resources` è䏿¯`try-finally`ãéä¹äº§ççä»£ç æ´ç®çï¼æ´æ¸
æ°ï¼äº§ççå¼å¸¸å¯¹æä»¬ä¹æ´æç¨ã`try-with-resources`è¯å¥è®©æä»¬æ´å®¹æç¼åå¿
é¡»è¦å
³éçèµæºç代ç ï¼è¥éç¨`try-finally`åå ä¹åä¸å°è¿ç¹ã
Java ä¸ç±»ä¼¼äº`InputStream`ã`OutputStream` ã`Scanner` ã`PrintWriter`ççèµæºé½éè¦æä»¬è°ç¨`close()`æ¹æ³æ¥æå¨å
³éï¼ä¸è¬æ
åµä¸æä»¬é½æ¯éè¿`try-catch-finally`è¯å¥æ¥å®ç°è¿ä¸ªéæ±ï¼å¦ä¸ï¼
```java
//è¯»åææ¬æä»¶çå
容
Scanner scanner = null;
try {
scanner = new Scanner(new File("D://read.txt"));
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (scanner != null) {
scanner.close();
}
}
```
ä½¿ç¨ Java 7 ä¹åç `try-with-resources` è¯å¥æ¹é ä¸é¢ç代ç :
```java
try (Scanner scanner = new Scanner(new File("test.txt"))) {
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
```
å½ç¶å¤ä¸ªèµæºéè¦å
³éçæ¶åï¼ä½¿ç¨ `try-with-resources` å®ç°èµ·æ¥ä¹é常ç®åï¼å¦æä½ è¿æ¯ç¨`try-catch-finally`å¯è½ä¼å¸¦æ¥å¾å¤é®é¢ã
éè¿ä½¿ç¨åå·åéï¼å¯ä»¥å¨`try-with-resources`åä¸å£°æå¤ä¸ªèµæºã
```java
try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt")))) {
int b;
while ((b = bin.read()) != -1) {
bout.write(b);
}
}
catch (IOException e) {
e.printStackTrace();
}
```
### å¼å¸¸ä½¿ç¨æåªäºéè¦æ³¨æçå°æ¹ï¼
- ä¸è¦æå¼å¸¸å®ä¹ä¸ºéæåéï¼å ä¸ºè¿æ ·ä¼å¯¼è´å¼å¸¸æ ä¿¡æ¯éä¹±ãæ¯æ¬¡æå¨æåºå¼å¸¸ï¼æä»¬é½éè¦æå¨ new ä¸ä¸ªå¼å¸¸å¯¹è±¡æåºã
- æåºçå¼å¸¸ä¿¡æ¯ä¸å®è¦ææä¹ã
- 建议æåºæ´å å
·ä½çå¼å¸¸æ¯å¦å符串转æ¢ä¸ºæ°åæ ¼å¼éè¯¯çæ¶ååºè¯¥æåº`NumberFormatException`è䏿¯å
¶ç¶ç±»`IllegalArgumentException`ã
- ä½¿ç¨æ¥å¿æå°å¼å¸¸ä¹åå°±ä¸è¦åæåºå¼å¸¸äºï¼ä¸¤è
ä¸è¦åæ¶åå¨ä¸æ®µä»£ç é»è¾ä¸ï¼ã
- ......
### ä½è°åå°ï¼
å¦æè¯´å¤§å®¶ç ç©¶è¿æ¡æ¶çåºå±åçæè
å±ä»¬èªå·±åè¿æ¡æ¶çè¯ï¼ä¸å®å¯¹åå°è¿ä¸ªæ¦å¿µä¸éçãåå°ä¹æä»¥è¢«ç§°ä¸ºæ¡æ¶ççµéï¼ä¸»è¦æ¯å 为å®èµäºäºæä»¬å¨è¿è¡æ¶åæç±»ä»¥åæ§è¡ç±»ä¸æ¹æ³çè½åãéè¿åå°ä½ å¯ä»¥è·åä»»æä¸ä¸ªç±»çææå±æ§åæ¹æ³ï¼ä½ è¿å¯ä»¥è°ç¨è¿äºæ¹æ³å屿§ã
### åå°çä¼ç¼ºç¹ï¼
åå°å¯ä»¥è®©æä»¬çä»£ç æ´å çµæ´»ã为åç§æ¡æ¶æä¾å¼ç®±å³ç¨çåè½æä¾äºä¾¿å©ã
ä¸è¿ï¼åå°è®©æä»¬å¨è¿è¡æ¶æäºåææä½ç±»çè½åçåæ¶ï¼ä¹å¢å äºå®å
¨é®é¢ï¼æ¯å¦å¯ä»¥æ è§æ³ååæ°çå®å
¨æ£æ¥ï¼æ³ååæ°çå®å
¨æ£æ¥åçå¨ç¼è¯æ¶ï¼ãå¦å¤ï¼åå°çæ§è½ä¹è¦ç¨å·®ç¹ï¼ä¸è¿ï¼å¯¹äºæ¡æ¶æ¥è¯´å®é
æ¯å½±åä¸å¤§çã
ç¸å
³é
读ï¼[Java Reflection: Why is it so slow?](https://stackoverflow.com/questions/1392351/java-reflection-why-is-it-so-slow) ã
### åå°çåºç¨åºæ¯ï¼
åå±ä»¬å¹³æ¶å¤§é¨åæ¶å齿¯å¨åä¸å¡ä»£ç ï¼å¾å°ä¼æ¥è§¦å°ç´æ¥ä½¿ç¨åå°æºå¶çåºæ¯ã使¯ï¼è¿å¹¶ä¸ä»£è¡¨åå°æ²¡æç¨ãç¸åï¼æ£æ¯å 为åå°ï¼ä½ æè½è¿ä¹è½»æ¾å°ä½¿ç¨åç§æ¡æ¶ãå Spring/Spring BootãMyBatis ççæ¡æ¶ä¸é½å¤§é使ç¨äºåå°æºå¶ã
**è¿äºæ¡æ¶ä¸ä¹å¤§é使ç¨äºå¨æä»£çï¼è卿代ççå®ç°ä¹ä¾èµåå°ã**
æ¯å¦ä¸é¢æ¯éè¿ JDK å®ç°å¨æä»£çç示ä¾ä»£ç ï¼å
¶ä¸å°±ä½¿ç¨äºåå°ç±» `Method` æ¥è°ç¨æå®çæ¹æ³ã
```java
public class DebugInvocationHandler implements InvocationHandler {
/**
* 代çç±»ä¸ççå®å¯¹è±¡
*/
private final Object target;
public DebugInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
System.out.println("before method " + method.getName());
Object result = method.invoke(target, args);
System.out.println("after method " + method.getName());
return result;
}
}
```
å¦å¤ï¼å Java ä¸çä¸å¤§å©å¨ **注解** çå®ç°ä¹ç¨å°äºåå°ã
为ä»ä¹ä½ ä½¿ç¨ Spring çæ¶å ï¼ä¸ä¸ª`@Component`注解就声æäºä¸ä¸ªç±»ä¸º Spring Bean å¢ï¼ä¸ºä»ä¹ä½ éè¿ä¸ä¸ª `@Value`注解就读åå°é
ç½®æä»¶ä¸çå¼å¢ï¼ç©¶ç«æ¯æä¹èµ·ä½ç¨çå¢ï¼
è¿äºé½æ¯å ä¸ºä½ å¯ä»¥åºäºåå°åæç±»ï¼ç¶åè·åå°ç±»/屿§/æ¹æ³/æ¹æ³çåæ°ä¸ç注解ãä½ è·åå°æ³¨è§£ä¹åï¼å°±å¯ä»¥åè¿ä¸æ¥çå¤çã
### ä½è° SPI?
SPI å³ Service Provider Interface ï¼å颿æå°±æ¯ï¼âæå¡æä¾è
çæ¥å£âï¼æççè§£æ¯ï¼ä¸é¨æä¾ç»æå¡æä¾è
æè
æ©å±æ¡æ¶åè½çå¼åè
å»ä½¿ç¨çä¸ä¸ªæ¥å£ã
SPI 尿塿¥å£åå
·ä½çæå¡å®ç°åç¦»å¼æ¥ï¼å°æå¡è°ç¨æ¹åæå¡å®ç°è
è§£è¦ï¼è½å¤æåç¨åºçæ©å±æ§ãå¯ç»´æ¤æ§ãä¿®æ¹æè
æ¿æ¢æå¡å®ç°å¹¶ä¸éè¦ä¿®æ¹è°ç¨æ¹ã
å¾å¤æ¡æ¶é½ä½¿ç¨äº Java ç SPI æºå¶ï¼æ¯å¦ï¼Spring æ¡æ¶ãæ°æ®åºå 载驱å¨ãæ¥å¿æ¥å£ã以å Dubbo çæ©å±å®ç°ççã

### SPI å API æä»ä¹åºå«ï¼
**é£ SPI å API æå¥åºå«ï¼**
è¯´å° SPI å°±ä¸å¾ä¸è¯´ä¸ä¸ API äºï¼ä»å¹¿ä¹ä¸æ¥è¯´å®ä»¬é½å±äºæ¥å£ï¼èä¸å¾å®¹ææ··æ·ãä¸é¢å
ç¨ä¸å¼ å¾è¯´æä¸ä¸ï¼

ä¸è¬æ¨¡åä¹é´é½æ¯éè¿éè¿æ¥å£è¿è¡é讯ï¼é£æä»¬å¨æå¡è°ç¨æ¹åæå¡å®ç°æ¹ï¼ä¹ç§°æå¡æä¾è
ï¼ä¹é´å¼å
¥ä¸ä¸ªâæ¥å£âã
å½å®ç°æ¹æä¾äºæ¥å£åå®ç°ï¼æä»¬å¯ä»¥éè¿è°ç¨å®ç°æ¹çæ¥å£ä»èæ¥æå®ç°æ¹ç»æä»¬æä¾çè½åï¼è¿å°±æ¯ API ï¼è¿ç§æ¥å£åå®ç°é½æ¯æ¾å¨å®ç°æ¹çã
彿¥å£åå¨äºè°ç¨æ¹è¿è¾¹æ¶ï¼å°±æ¯ SPI ï¼ç±æ¥å£è°ç¨æ¹ç¡®å®æ¥å£è§åï¼ç¶åç±ä¸åçåå廿 ¹ç»è¿ä¸ªè§å对è¿ä¸ªæ¥å£è¿è¡å®ç°ï¼ä»èæä¾æå¡ã
举个éä¿ææçä¾åï¼å
¬å¸ H æ¯ä¸å®¶ç§æå
¬å¸ï¼æ°è®¾è®¡äºä¸æ¬¾è¯çï¼ç¶åç°å¨éè¦é产äºï¼èå¸é¢ä¸æå¥½å å®¶è¯çå¶é ä¸å
¬å¸ï¼è¿ä¸ªæ¶åï¼åªè¦ H å
¬å¸æå®å¥½äºè¿è¯ççäº§çæ åï¼å®ä¹å¥½äºæ¥å£æ åï¼ï¼é£ä¹è¿äºåä½çè¯çå
¬å¸ï¼æå¡æä¾è
ï¼å°±æç
§æ å交ä»èªå®¶ç¹è²çè¯çï¼æä¾ä¸åæ¹æ¡çå®ç°ï¼ä½æ¯ç»åºæ¥çç»ææ¯ä¸æ ·çï¼ã
### SPI çä¼ç¼ºç¹ï¼
éè¿ SPI æºå¶è½å¤å¤§å¤§å°æé«æ¥å£è®¾è®¡ççµæ´»æ§ï¼ä½æ¯ SPI æºå¶ä¹åå¨ä¸äºç¼ºç¹ï¼æ¯å¦ï¼
- éè¦éåå è½½ææçå®ç°ç±»ï¼ä¸è½åå°æéå è½½ï¼è¿æ ·æçè¿æ¯ç¸å¯¹è¾ä½çã
- å½å¤ä¸ª `ServiceLoader` åæ¶ `load` æ¶ï¼ä¼æå¹¶åé®é¢ã
### ä»ä¹æ¯åºåå?ä»ä¹æ¯ååºåå?
妿æä»¬éè¦æä¹
å Java 对象æ¯å¦å° Java 对象ä¿å卿件ä¸ï¼æè
å¨ç½ç»ä¼ è¾ Java 对象ï¼è¿äºåºæ¯é½éè¦ç¨å°åºååã
ç®åæ¥è¯´ï¼
- **åºåå**ï¼ å°æ°æ®ç»ææå¯¹è±¡è½¬æ¢æäºè¿å¶åèæµçè¿ç¨
- **ååºåå**ï¼å°å¨åºååè¿ç¨ä¸æçæçäºè¿å¶åèæµè½¬æ¢ææ°æ®ç»ææè
对象çè¿ç¨
å¯¹äº Java è¿ç§é¢å对象ç¼ç¨è¯è¨æ¥è¯´ï¼æä»¬åºååç齿¯å¯¹è±¡ï¼Objectï¼ä¹å°±æ¯å®ä¾ååçç±»(Class)ï¼ä½æ¯å¨ C++è¿ç§åé¢å对象çè¯è¨ä¸ï¼struct(ç»æä½)å®ä¹çæ¯æ°æ®ç»æç±»åï¼è class 对åºçæ¯å¯¹è±¡ç±»åã
ç»´åºç¾ç§æ¯å¦æ¯ä»ç»åºååçï¼
> **åºåå**ï¼serializationï¼å¨è®¡ç®æºç§å¦çæ°æ®å¤çä¸ï¼æ¯æå°æ°æ®ç»ææå¯¹è±¡ç¶æè½¬æ¢æå¯åç¨æ ¼å¼ï¼ä¾å¦åææä»¶ï¼åäºç¼å²ï¼æç»ç±ç½ç»ä¸åéï¼ï¼ä»¥çå¾
åç»å¨ç¸åæå¦ä¸å°è®¡ç®æºç¯å¢ä¸ï¼è½æ¢å¤åå
ç¶æçè¿ç¨ãä¾ç
§åºååæ ¼å¼éæ°è·ååèçç»ææ¶ï¼å¯ä»¥å©ç¨å®æ¥äº§çä¸åå§å¯¹è±¡ç¸åè¯ä¹ç坿¬ã对äºè®¸å¤å¯¹è±¡ï¼åæ¯ä½¿ç¨å¤§éå¼ç¨çå¤æå¯¹è±¡ï¼è¿ç§åºååé建çè¿ç¨å¹¶ä¸å®¹æãé¢å对象ä¸ç对象åºååï¼å¹¶ä¸æ¦æ¬ä¹ååå§å¯¹è±¡æå
³ç³»ç彿°ãè¿ç§è¿ç¨ä¹ç§°ä¸ºå¯¹è±¡ç¼ç»ï¼marshallingï¼ãä»ä¸ç³»ååèæåæ°æ®ç»æçååæä½ï¼æ¯ååºååï¼ä¹ç§°ä¸ºè§£ç¼ç»ãdeserializationãunmarshallingï¼ã
综ä¸ï¼**åºååç主è¦ç®çæ¯éè¿ç½ç»ä¼ è¾å¯¹è±¡æè
说æ¯å°å¯¹è±¡åå¨å°æä»¶ç³»ç»ãæ°æ®åºãå
åä¸ã**

https://www.corejavaguru.com/java/serialization/interview-questions-1
### 妿æäºåæ®µä¸æ³è¿è¡åºååæä¹åï¼
对äºä¸æ³è¿è¡åºååçåéï¼ä½¿ç¨ `transient` å
³é®å修饰ã
`transient` å
³é®åçä½ç¨æ¯ï¼é»æ¢å®ä¾ä¸é£äºç¨æ¤å
³é®å修饰ççåéåºååï¼å½å¯¹è±¡è¢«ååºååæ¶ï¼è¢« `transient` 修饰çåéå¼ä¸ä¼è¢«æä¹
å忢å¤ã
å
³äº `transient` è¿æå ç¹æ³¨æï¼
- `transient` åªè½ä¿®é¥°åéï¼ä¸è½ä¿®é¥°ç±»åæ¹æ³ã
- `transient` 修饰çåéï¼å¨ååºååååéå¼å°ä¼è¢«ç½®æç±»åçé»è®¤å¼ãä¾å¦ï¼å¦ææ¯ä¿®é¥° `int` ç±»åï¼é£ä¹ååºååç»æå°±æ¯ `0`ã
- `static` åéå 为ä¸å±äºä»»ä½å¯¹è±¡(Object)ï¼æä»¥æ è®ºææ²¡æ `transient` å
³é®å修饰ï¼åä¸ä¼è¢«åºååã
### Java IO æµäºè§£åï¼
IO å³ `Input/Output`ï¼è¾å
¥åè¾åºãæ°æ®è¾å
¥å°è®¡ç®æºå
åçè¿ç¨å³è¾å
¥ï¼åä¹è¾åºå°å¤é¨åå¨ï¼æ¯å¦æ°æ®åºï¼æä»¶ï¼è¿ç¨ä¸»æºï¼çè¿ç¨å³è¾åºãæ°æ®ä¼ è¾è¿ç¨ç±»ä¼¼äºæ°´æµï¼å æ¤ç§°ä¸º IO æµãIO æµå¨ Java ä¸å为è¾å
¥æµåè¾åºæµï¼èæ ¹æ®æ°æ®çå¤çæ¹å¼åå为åèæµåå符æµã
Java IO æµç 40 å¤ä¸ªç±»é½æ¯ä»å¦ä¸ 4 个æ½è±¡ç±»åºç±»ä¸æ´¾çåºæ¥çã
- `InputStream`/`Reader`: ææçè¾å
¥æµçåºç±»ï¼åè
æ¯åèè¾å
¥æµï¼åè
æ¯å符è¾å
¥æµã
- `OutputStream`/`Writer`: ææè¾åºæµçåºç±»ï¼åè
æ¯åèè¾åºæµï¼åè
æ¯å符è¾åºæµã
ç¸å
³é
读ï¼[Java IO åºç¡ç¥è¯æ»ç»](https://javaguide.cn/java/io/io-basis.html#io-%E6%B5%81%E7%AE%80%E4%BB%8B)ã
### I/O æµä¸ºä»ä¹è¦å为åèæµåå符æµå¢?
é®é¢æ¬è´¨æ³é®ï¼**ä¸ç®¡æ¯æä»¶è¯»åè¿æ¯ç½ç»å鿥æ¶ï¼ä¿¡æ¯çæå°åå¨åå
齿¯åèï¼é£ä¸ºä»ä¹ I/O æµæä½è¦å为åèæµæä½ååç¬¦æµæä½å¢ï¼**
ä¸ªäººè®¤ä¸ºä¸»è¦æä¸¤ç¹åå ï¼
- åç¬¦æµæ¯ç± Java èææºå°åè转æ¢å¾å°çï¼è¿ä¸ªè¿ç¨è¿ç®æ¯æ¯è¾èæ¶ï¼
- 妿æä»¬ä¸ç¥éç¼ç ç±»åçè¯ï¼ä½¿ç¨åèæµçè¿ç¨ä¸å¾å®¹æåºç°ä¹±ç é®é¢ã
### Java IO ä¸çè®¾è®¡æ¨¡å¼æåªäºï¼
[Java IO è®¾è®¡æ¨¡å¼æ»ç»](https://javaguide.cn/java/io/io-design-patterns.html)ã
### BIOãNIO å AIO çåºå«ï¼
[Java IO 模å详解](https://javaguide.cn/java/io/io-model.html)ã
------
## 2.2. Javaéå
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
>
> è¿é¨åå
容æèª [JavaGuide](https://javaguide.cn/) ä¸é¢å ç¯æç« ï¼
>
> - [Javaéå常è§é¢è¯é¢æ»ç»(ä¸)](https://javaguide.cn/java/collection/java-collection-questions-01.html)
> - [Javaéå常è§é¢è¯é¢æ»ç»(ä¸)](https://javaguide.cn/java/collection/java-collection-questions-02.html)
Java éåï¼ ä¹å«ä½å®¹å¨ï¼ä¸»è¦æ¯ç±ä¸¤å¤§æ¥å£æ´¾çèæ¥ï¼ä¸ä¸ªæ¯ `Collection`æ¥å£ï¼ä¸»è¦ç¨äºåæ¾åä¸å
ç´ ï¼å¦ä¸ä¸ªæ¯ `Map` æ¥å£ï¼ä¸»è¦ç¨äºåæ¾é®å¼å¯¹ã对äº`Collection` æ¥å£ï¼ä¸é¢åæä¸ä¸ªä¸»è¦ç忥å£ï¼`List`ã`Set` å `Queue`ã
Java éåæ¡æ¶å¦ä¸å¾æç¤ºï¼

注ï¼å¾ä¸åªå举äºä¸»è¦çç»§æ¿æ´¾çå
³ç³»ï¼å¹¶æ²¡æå举ææå
³ç³»ãæ¯æ¹çç¥äº`AbstractList`, `NavigableSet`çæ½è±¡ç±»ä»¥åå
¶ä»çä¸äºè¾
å©ç±»ï¼å¦æ³æ·±å
¥äºè§£ï¼å¯èªè¡æ¥çæºç ã
### 说说 List, Set, Queue, Map åè
çåºå«ï¼
- `List`(对ä»é¡ºåºç好帮æ): åå¨çå
ç´ æ¯æåºçãå¯éå¤çã
- `Set`(注éç¬ä¸æ äºçæ§è´¨): åå¨çå
ç´ æ¯æ åºçãä¸å¯éå¤çã
- `Queue`(å®ç°æéåè½çå«å·æº): æç¹å®çæéè§åæ¥ç¡®å®å
å顺åºï¼åå¨çå
ç´ æ¯æåºçãå¯éå¤çã
- `Map`(ç¨ key æ¥æç´¢çä¸å®¶): 使ç¨é®å¼å¯¹ï¼key-valueï¼åå¨ï¼ç±»ä¼¼äºæ°å¦ä¸ç彿° y=f(x)ï¼"x" 代表 keyï¼"y" 代表 valueï¼key æ¯æ åºçãä¸å¯éå¤çï¼value æ¯æ åºçãå¯éå¤çï¼æ¯ä¸ªé®æå¤æ å°å°ä¸ä¸ªå¼ã
### éåæ¡æ¶åºå±æ°æ®ç»ææ»ç»
å
æ¥çä¸ä¸ `Collection` æ¥å£ä¸é¢çéåã
#### List
- `ArrayList`ï¼ `Object[]` æ°ç»
- `Vector`ï¼`Object[]` æ°ç»
- `LinkedList`ï¼ ååé¾è¡¨(JDK1.6 ä¹å为循ç¯é¾è¡¨ï¼JDK1.7 åæ¶äºå¾ªç¯)
#### Set
- `HashSet`(æ åºï¼å¯ä¸): åºäº `HashMap` å®ç°çï¼åºå±éç¨ `HashMap` æ¥ä¿åå
ç´
- `LinkedHashSet`: `LinkedHashSet` æ¯ `HashSet` çåç±»ï¼å¹¶ä¸å
¶å
鍿¯éè¿ `LinkedHashMap` æ¥å®ç°çãæç¹ç±»ä¼¼äºæä»¬ä¹å说ç `LinkedHashMap` å
¶å
鍿¯åºäº `HashMap` å®ç°ä¸æ ·ï¼ä¸è¿è¿æ¯æä¸ç¹ç¹åºå«ç
- `TreeSet`(æåºï¼å¯ä¸): çº¢é»æ (èªå¹³è¡¡çæåºäºåæ )
#### Queue
- `PriorityQueue`: `Object[]` æ°ç»æ¥å®ç°äºåå
- `ArrayQueue`: `Object[]` æ°ç» + åæé
忥çç `Map` æ¥å£ä¸é¢çéåã
#### Map
- `HashMap`ï¼ JDK1.8 ä¹å `HashMap` ç±æ°ç»+é¾è¡¨ç»æçï¼æ°ç»æ¯ `HashMap` ç主ä½ï¼é¾è¡¨åæ¯ä¸»è¦ä¸ºäºè§£å³åå¸å²çªèåå¨çï¼âæé¾æ³âè§£å³å²çªï¼ãJDK1.8 以åå¨è§£å³åå¸å²çªæ¶æäºè¾å¤§çååï¼å½é¾è¡¨é¿åº¦å¤§äºéå¼ï¼é»è®¤ä¸º 8ï¼ï¼å°é¾è¡¨è½¬æ¢æçº¢é»æ åä¼å¤æï¼å¦æå½åæ°ç»çé¿åº¦å°äº 64ï¼é£ä¹ä¼éæ©å
è¿è¡æ°ç»æ©å®¹ï¼è䏿¯è½¬æ¢ä¸ºçº¢é»æ ï¼æ¶ï¼å°é¾è¡¨è½¬åä¸ºçº¢é»æ ï¼ä»¥åå°æç´¢æ¶é´
- `LinkedHashMap`ï¼ `LinkedHashMap` ç»§æ¿èª `HashMap`ï¼æä»¥å®çåºå±ä»ç¶æ¯åºäºæé¾å¼æ£åç»æå³ç±æ°ç»åé¾è¡¨æçº¢é»æ ç»æãå¦å¤ï¼`LinkedHashMap` å¨ä¸é¢ç»æçåºç¡ä¸ï¼å¢å äºä¸æ¡ååé¾è¡¨ï¼ä½¿å¾ä¸é¢çç»æå¯ä»¥ä¿æé®å¼å¯¹çæå
¥é¡ºåºãåæ¶éè¿å¯¹é¾è¡¨è¿è¡ç¸åºçæä½ï¼å®ç°äºè®¿é®é¡ºåºç¸å
³é»è¾ã详ç»å¯ä»¥æ¥çï¼[ãLinkedHashMap æºç 详ç»åæï¼JDK1.8ï¼ã](https://www.imooc.com/article/22931)
- `Hashtable`ï¼ æ°ç»+é¾è¡¨ç»æçï¼æ°ç»æ¯ `Hashtable` ç主ä½ï¼é¾è¡¨åæ¯ä¸»è¦ä¸ºäºè§£å³åå¸å²çªèåå¨ç
- `TreeMap`ï¼ çº¢é»æ ï¼èªå¹³è¡¡çæåºäºåæ ï¼
### å¦ä½éç¨éå?
ä¸»è¦æ ¹æ®éåçç¹ç¹æ¥éç¨ï¼æ¯å¦æä»¬éè¦æ ¹æ®é®å¼è·åå°å
ç´ å¼æ¶å°±éç¨ `Map` æ¥å£ä¸çéåï¼éè¦æåºæ¶éæ© `TreeMap`,ä¸éè¦æåºæ¶å°±éæ© `HashMap`,éè¦ä¿è¯çº¿ç¨å®å
¨å°±éç¨ `ConcurrentHashMap`ã
彿们åªéè¦åæ¾å
ç´ å¼æ¶ï¼å°±éæ©å®ç°`Collection` æ¥å£çéåï¼éè¦ä¿è¯å
ç´ å¯ä¸æ¶éæ©å®ç° `Set` æ¥å£çéåæ¯å¦ `TreeSet` æ `HashSet`ï¼ä¸éè¦å°±éæ©å®ç° `List` æ¥å£çæ¯å¦ `ArrayList` æ `LinkedList`ï¼ç¶ååæ ¹æ®å®ç°è¿äºæ¥å£çéåçç¹ç¹æ¥éç¨ã
### 为ä»ä¹è¦ä½¿ç¨éåï¼
彿们éè¦ä¿åä¸ç»ç±»åç¸åçæ°æ®çæ¶åï¼æä»¬åºè¯¥æ¯ç¨ä¸ä¸ªå®¹å¨æ¥ä¿åï¼è¿ä¸ªå®¹å¨å°±æ¯æ°ç»ï¼ä½æ¯ï¼ä½¿ç¨æ°ç»åå¨å¯¹è±¡å
·æä¸å®çå¼ç«¯ï¼
å 为æä»¬å¨å®é
å¼åä¸ï¼åå¨çæ°æ®çç±»åæ¯å¤ç§å¤æ ·çï¼äºæ¯ï¼å°±åºç°äºâéåâï¼éååæ ·ä¹æ¯ç¨æ¥åå¨å¤ä¸ªæ°æ®çã
æ°ç»çç¼ºç¹æ¯ä¸æ¦å£°æä¹åï¼é¿åº¦å°±ä¸å¯åäºï¼åæ¶ï¼å£°ææ°ç»æ¶çæ°æ®ç±»åä¹å³å®äºè¯¥æ°ç»åå¨çæ°æ®çç±»åï¼èä¸ï¼æ°ç»åå¨çæ°æ®æ¯æåºçãå¯éå¤çï¼ç¹ç¹åä¸ã
使¯éåæé«äºæ°æ®åå¨ççµæ´»æ§ï¼Java éåä¸ä»
å¯ä»¥ç¨æ¥åå¨ä¸åç±»åä¸åæ°éç对象ï¼è¿å¯ä»¥ä¿åå
·ææ å°å
³ç³»çæ°æ®ã
### ArrayList å Vector çåºå«?
- `ArrayList` æ¯ `List` ç主è¦å®ç°ç±»ï¼åºå±ä½¿ç¨ `Object[ ]`åå¨ï¼éç¨äºé¢ç¹çæ¥æ¾å·¥ä½ï¼çº¿ç¨ä¸å®å
¨ ï¼
- `Vector` æ¯ `List` çå¤èå®ç°ç±»ï¼åºå±ä½¿ç¨`Object[ ]` åå¨ï¼çº¿ç¨å®å
¨çã
### ArrayList ä¸ LinkedList åºå«?
- **æ¯å¦ä¿è¯çº¿ç¨å®å
¨ï¼** `ArrayList` å `LinkedList` 齿¯ä¸åæ¥çï¼ä¹å°±æ¯ä¸ä¿è¯çº¿ç¨å®å
¨ï¼
- **åºå±æ°æ®ç»æï¼** `ArrayList` åºå±ä½¿ç¨çæ¯ **`Object` æ°ç»**ï¼`LinkedList` åºå±ä½¿ç¨çæ¯ **ååé¾è¡¨** æ°æ®ç»æï¼JDK1.6 ä¹å为循ç¯é¾è¡¨ï¼JDK1.7 åæ¶äºå¾ªç¯ã注æååé¾è¡¨ååå循ç¯é¾è¡¨çåºå«ï¼ä¸é¢æä»ç»å°ï¼ï¼
- **æå
¥åå 餿¯å¦åå
ç´ ä½ç½®çå½±åï¼**
- `ArrayList` éç¨æ°ç»åå¨ï¼æä»¥æå
¥åå é¤å
ç´ çæ¶é´å¤æåº¦åå
ç´ ä½ç½®çå½±åã æ¯å¦ï¼æ§è¡`add(E e)`æ¹æ³çæ¶åï¼ `ArrayList` ä¼é»è®¤å¨å°æå®çå
ç´ è¿½å å°æ¤åè¡¨çæ«å°¾ï¼è¿ç§æ
嵿¶é´å¤æåº¦å°±æ¯ O(1)ã使¯å¦æè¦å¨æå®ä½ç½® i æå
¥åå é¤å
ç´ çè¯ï¼`add(int index, E element)`ï¼æ¶é´å¤æåº¦å°±ä¸º O(n-i)ãå 为å¨è¿è¡ä¸è¿°æä½çæ¶åéåä¸ç¬¬ i å第 i 个å
ç´ ä¹åç(n-i)个å
ç´ é½è¦æ§è¡ååä½/ååç§»ä¸ä½çæä½ã
- `LinkedList` éç¨é¾è¡¨åå¨ï¼æä»¥ï¼å¦ææ¯å¨å¤´å°¾æå
¥æè
å é¤å
ç´ ä¸åå
ç´ ä½ç½®çå½±åï¼`add(E e)`ã`addFirst(E e)`ã`addLast(E e)`ã`removeFirst()` ã `removeLast()`ï¼ï¼æ¶é´å¤æåº¦ä¸º O(1)ï¼å¦ææ¯è¦å¨æå®ä½ç½® `i` æå
¥åå é¤å
ç´ çè¯ï¼`add(int index, E element)`ï¼`remove(Object o)`ï¼ï¼ æ¶é´å¤æåº¦ä¸º O(n) ï¼å 为éè¦å
ç§»å¨å°æå®ä½ç½®åæå
¥ã
- **æ¯å¦æ¯æå¿«ééæºè®¿é®ï¼** `LinkedList` 䏿¯æé«æçéæºå
ç´ è®¿é®ï¼è `ArrayList` æ¯æãå¿«ééæºè®¿é®å°±æ¯éè¿å
ç´ çåºå·å¿«éè·åå
ç´ å¯¹è±¡(对åºäº`get(int index)`æ¹æ³)ã
- **å
å空é´å ç¨ï¼** `ArrayList` ç空 é´æµªè´¹ä¸»è¦ä½ç°å¨å¨ list å表çç»å°¾ä¼é¢çä¸å®ç容é空é´ï¼è LinkedList ç空é´è±è´¹åä½ç°å¨å®çæ¯ä¸ä¸ªå
ç´ é½éè¦æ¶èæ¯ ArrayList æ´å¤ç空é´ï¼å 为è¦åæ¾ç´æ¥åç»§åç´æ¥å驱以忰æ®ï¼ã
æä»¬å¨é¡¹ç®ä¸ä¸è¬æ¯ä¸ä¼ä½¿ç¨å° `LinkedList` çï¼éè¦ç¨å° `LinkedList` çåºæ¯å ä¹é½å¯ä»¥ä½¿ç¨ `ArrayList` æ¥ä»£æ¿ï¼å¹¶ä¸ï¼æ§è½é叏伿´å¥½ï¼å°±è¿ `LinkedList` çä½è
çº¦ä¹¦äº Â· 叿´å
ï¼Josh Blochï¼èªå·±é½è¯´ä»æ¥ä¸ä¼ä½¿ç¨ `LinkedList` ã

å¦å¤ï¼ä¸è¦ä¸æè¯å°è®¤ä¸º `LinkedList` ä½ä¸ºé¾è¡¨å°±æéåå
ç´ å¢å çåºæ¯ãæå¨ä¸é¢ä¹è¯´äºï¼`LinkedList` ä»
ä»
å¨å¤´å°¾æå
¥æè
å é¤å
ç´ çæ¶åæ¶é´å¤æåº¦è¿ä¼¼ O(1)ï¼å
¶ä»æ
åµå¢å å
ç´ çæ¶é´å¤æåº¦é½æ¯ O(n) ã
#### è¡¥å
å
容:ååé¾è¡¨ååå循ç¯é¾è¡¨
**ååé¾è¡¨ï¼** å
å«ä¸¤ä¸ªæéï¼ä¸ä¸ª prev æååä¸ä¸ªèç¹ï¼ä¸ä¸ª next æååä¸ä¸ªèç¹ã

**åå循ç¯é¾è¡¨ï¼** æåä¸ä¸ªèç¹ç next æå headï¼è head ç prev æåæåä¸ä¸ªèç¹ï¼ææä¸ä¸ªç¯ã

#### è¡¥å
å
容:RandomAccess æ¥å£
```java
public interface RandomAccess {
}
```
æ¥çæºç æä»¬åç°å®é
ä¸ `RandomAccess` æ¥å£ä¸ä»ä¹é½æ²¡æå®ä¹ãæä»¥ï¼å¨æçæ¥ `RandomAccess` æ¥å£ä¸è¿æ¯ä¸ä¸ªæ è¯ç½¢äºãæ è¯ä»ä¹ï¼ æ è¯å®ç°è¿ä¸ªæ¥å£çç±»å
·æéæºè®¿é®åè½ã
å¨ `binarySearchï¼)` æ¹æ³ä¸ï¼å®è¦å¤æä¼ å
¥ç list æ¯å¦ `RandomAccess` çå®ä¾ï¼å¦ææ¯ï¼è°ç¨`indexedBinarySearch()`æ¹æ³ï¼å¦æä¸æ¯ï¼é£ä¹è°ç¨`iteratorBinarySearch()`æ¹æ³
```java
public static
int binarySearch(List extends Comparable super T>> list, T key) {
if (list instanceof RandomAccess || list.size() arrayList = new ArrayList();
arrayList.add(-1);
arrayList.add(3);
arrayList.add(3);
arrayList.add(-5);
arrayList.add(7);
arrayList.add(4);
arrayList.add(-9);
arrayList.add(-7);
System.out.println("åå§æ°ç»:");
System.out.println(arrayList);
// void reverse(List list)ï¼å转
Collections.reverse(arrayList);
System.out.println("Collections.reverse(arrayList):");
System.out.println(arrayList);
// void sort(List list),æèªç¶æåºçååºæåº
Collections.sort(arrayList);
System.out.println("Collections.sort(arrayList):");
System.out.println(arrayList);
// å®å¶æåºçç¨æ³
Collections.sort(arrayList, new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
System.out.println("å®å¶æåºåï¼");
System.out.println(arrayList);
```
Output:
```
åå§æ°ç»:
[-1, 3, 3, -5, 7, 4, -9, -7]
Collections.reverse(arrayList):
[-7, -9, 4, 7, -5, 3, 3, -1]
Collections.sort(arrayList):
[-9, -7, -5, -1, 3, 3, 4, 7]
å®å¶æåºåï¼
[7, 4, 3, 3, -1, -5, -7, -9]
```
#### éå compareTo æ¹æ³å®ç°æå¹´é¾æ¥æåº
```java
// person对象没æå®ç°Comparableæ¥å£ï¼æä»¥å¿
é¡»å®ç°ï¼è¿æ ·æä¸ä¼åºéï¼æå¯ä»¥ä½¿treemapä¸çæ°æ®æé¡ºåºæå
// åé¢ä¸ä¸ªä¾åçString类已ç»é»è®¤å®ç°äºComparableæ¥å£ï¼è¯¦ç»å¯ä»¥æ¥çStringç±»çAPIææ¡£ï¼å¦å¤å
¶ä»
// åIntegerç±»çé½å·²ç»å®ç°äºComparableæ¥å£ï¼æä»¥ä¸éè¦å¦å¤å®ç°äº
public class Person implements Comparable {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/**
* TéåcompareToæ¹æ³å®ç°æå¹´é¾æ¥æåº
*/
@Override
public int compareTo(Person o) {
if (this.age > o.getAge()) {
return 1;
}
if (this.age < o.getAge()) {
return -1;
}
return 0;
}
}
```
```java
public static void main(String[] args) {
TreeMap pdata = new TreeMap();
pdata.put(new Person("å¼ ä¸", 30), "zhangsan");
pdata.put(new Person("æå", 20), "lisi");
pdata.put(new Person("çäº", 10), "wangwu");
pdata.put(new Person("å°çº¢", 5), "xiaohong");
// å¾å°keyçå¼çåæ¶å¾å°keyæå¯¹åºçå¼
Set keys = pdata.keySet();
for (Person key : keys) {
System.out.println(key.getAge() + "-" + key.getName());
}
}
```
Outputï¼
```
5-å°çº¢
10-çäº
20-æå
30-å¼ ä¸
```
### æ åºæ§åä¸å¯é夿§çå«ä¹æ¯ä»ä¹
- æ åºæ§ä¸çäºéæºæ§ ï¼æ åºæ§æ¯æåå¨çæ°æ®å¨åºå±æ°ç»ä¸å¹¶éæç
§æ°ç»ç´¢å¼çé¡ºåºæ·»å ï¼èæ¯æ ¹æ®æ°æ®çåå¸å¼å³å®çã
- ä¸å¯é夿§æ¯ææ·»å çå
ç´ æç
§ `equals()` å¤ææ¶ ï¼è¿å falseï¼éè¦åæ¶éå `equals()` æ¹æ³å `hashCode()` æ¹æ³ã
### æ¯è¾ HashSetãLinkedHashSet å TreeSet ä¸è
çå¼å
- `HashSet`ã`LinkedHashSet` å `TreeSet` 齿¯ `Set` æ¥å£çå®ç°ç±»ï¼é½è½ä¿è¯å
ç´ å¯ä¸ï¼å¹¶ä¸é½ä¸æ¯çº¿ç¨å®å
¨çã
- `HashSet`ã`LinkedHashSet` å `TreeSet` ç主è¦åºå«å¨äºåºå±æ°æ®ç»æä¸åã`HashSet` çåºå±æ°æ®ç»ææ¯åå¸è¡¨ï¼åºäº `HashMap` å®ç°ï¼ã`LinkedHashSet` çåºå±æ°æ®ç»ææ¯é¾è¡¨ååå¸è¡¨ï¼å
ç´ çæå
¥åååºé¡ºåºæ»¡è¶³ FIFOã`TreeSet` åºå±æ°æ®ç»ææ¯çº¢é»æ ï¼å
ç´ æ¯æåºçï¼æåºçæ¹å¼æèªç¶æåºåå®å¶æåºã
- åºå±æ°æ®ç»æä¸åå导è´è¿ä¸è
çåºç¨åºæ¯ä¸åã`HashSet` ç¨äºä¸éè¦ä¿è¯å
ç´ æå
¥åååºé¡ºåºçåºæ¯ï¼`LinkedHashSet` ç¨äºä¿è¯å
ç´ çæå
¥åååºé¡ºåºæ»¡è¶³ FIFO çåºæ¯ï¼`TreeSet` ç¨äºæ¯æå¯¹å
ç´ èªå®ä¹æåºè§åçåºæ¯ã
### Queue ä¸ Deque çåºå«
`Queue` æ¯å端éåï¼åªè½ä»ä¸ç«¯æå
¥å
ç´ ï¼å¦ä¸ç«¯å é¤å
ç´ ï¼å®ç°ä¸ä¸è¬éµå¾ª **å
è¿å
åºï¼FIFOï¼** è§åã
`Queue` æ©å±äº `Collection` çæ¥å£ï¼æ ¹æ® **å 为容éé®é¢èå¯¼è´æä½å¤±è´¥åå¤çæ¹å¼çä¸å** å¯ä»¥åä¸ºä¸¤ç±»æ¹æ³: ä¸ç§å¨æä½å¤±è´¥å伿åºå¼å¸¸ï¼å¦ä¸ç§åä¼è¿åç¹æ®å¼ã
| `Queue` æ¥å£ | æåºå¼å¸¸ | è¿åç¹æ®å¼ |
| ------------ | --------- | ---------- |
| æå
¥éå°¾ | add(E e) | offer(E e) |
| å é¤éé¦ | remove() | poll() |
| æ¥è¯¢éé¦å
ç´ | element() | peek() |
`Deque` æ¯å端éåï¼å¨éåç两端åå¯ä»¥æå
¥æå é¤å
ç´ ã
`Deque` æ©å±äº `Queue` çæ¥å£, å¢å äºå¨éé¦åéå°¾è¿è¡æå
¥åå é¤çæ¹æ³ï¼åæ ·æ ¹æ®å¤±è´¥åå¤çæ¹å¼çä¸åå为两类ï¼
| `Deque` æ¥å£ | æåºå¼å¸¸ | è¿åç¹æ®å¼ |
| ------------ | ------------- | --------------- |
| æå
¥éé¦ | addFirst(E e) | offerFirst(E e) |
| æå
¥éå°¾ | addLast(E e) | offerLast(E e) |
| å é¤éé¦ | removeFirst() | pollFirst() |
| å é¤éå°¾ | removeLast() | pollLast() |
| æ¥è¯¢éé¦å
ç´ | getFirst() | peekFirst() |
| æ¥è¯¢éå°¾å
ç´ | getLast() | peekLast() |
äºå®ä¸ï¼`Deque` è¿æä¾æ `push()` å `pop()` çå
¶ä»æ¹æ³ï¼å¯ç¨äºæ¨¡ææ ã
### ArrayDeque ä¸ LinkedList çåºå«
`ArrayDeque` å `LinkedList` é½å®ç°äº `Deque` æ¥å£ï¼ä¸¤è
é½å
·æéåçåè½ï¼ä½ä¸¤è
æä»ä¹åºå«å¢ï¼
- `ArrayDeque` æ¯åºäºå¯åé¿çæ°ç»ååæéæ¥å®ç°ï¼è `LinkedList` åéè¿é¾è¡¨æ¥å®ç°ã
- `ArrayDeque` 䏿¯æåå¨ `NULL` æ°æ®ï¼ä½ `LinkedList` æ¯æã
- `ArrayDeque` æ¯å¨ JDK1.6 æè¢«å¼å
¥çï¼è`LinkedList` æ©å¨ JDK1.2 æ¶å°±å·²ç»åå¨ã
- `ArrayDeque` æå
¥æ¶å¯è½å卿©å®¹è¿ç¨, ä¸è¿åæåçæå
¥æä½ä¾ç¶ä¸º O(1)ãè½ç¶ `LinkedList` ä¸éè¦æ©å®¹ï¼ä½æ¯æ¯æ¬¡æå
¥æ°æ®æ¶åéè¦ç³è¯·æ°çå 空é´ï¼åææ§è½ç¸æ¯æ´æ
¢ã
仿§è½çè§åº¦ä¸ï¼éç¨ `ArrayDeque` æ¥å®ç°éåè¦æ¯ `LinkedList` æ´å¥½ãæ¤å¤ï¼`ArrayDeque` ä¹å¯ä»¥ç¨äºå®ç°æ ã
### 说ä¸è¯´ PriorityQueue
`PriorityQueue` æ¯å¨ JDK1.5 ä¸è¢«å¼å
¥ç, å
¶ä¸ `Queue` çåºå«å¨äºå
ç´ åºéé¡ºåºæ¯ä¸ä¼å
级ç¸å
³çï¼å³æ»æ¯ä¼å
级æé«çå
ç´ å
åºéã
è¿éå举å
¶ç¸å
³çä¸äºè¦ç¹ï¼
- `PriorityQueue` å©ç¨äºäºåå çæ°æ®ç»ææ¥å®ç°çï¼åºå±ä½¿ç¨å¯åé¿çæ°ç»æ¥å卿°æ®
- `PriorityQueue` éè¿å å
ç´ ç䏿µ®å䏿²ï¼å®ç°äºå¨ O(logn) çæ¶é´å¤æåº¦å
æå
¥å
ç´ åå é¤å é¡¶å
ç´ ã
- `PriorityQueue` æ¯é线ç¨å®å
¨çï¼ä¸ä¸æ¯æåå¨ `NULL` å `non-comparable` ç对象ã
- `PriorityQueue` é»è®¤æ¯å°é¡¶å ï¼ä½å¯ä»¥æ¥æ¶ä¸ä¸ª `Comparator` ä½ä¸ºæé åæ°ï¼ä»èæ¥èªå®ä¹å
ç´ ä¼å
级çå
åã
`PriorityQueue` å¨é¢è¯ä¸å¯è½æ´å¤çä¼åºç°å¨ææç®æ³çæ¶åï¼å
¸åä¾é¢å
æ¬å æåºãæ±ç¬¬Kå¤§çæ°ã带æå¾çéåçï¼æä»¥éè¦ä¼çç»ä½¿ç¨æè¡ã
### HashMap å Hashtable çåºå«
- **çº¿ç¨æ¯å¦å®å
¨ï¼** `HashMap` æ¯é线ç¨å®å
¨çï¼`Hashtable` æ¯çº¿ç¨å®å
¨ç,å 为 `Hashtable` å
é¨çæ¹æ³åºæ¬é½ç»è¿`synchronized` 修饰ãï¼å¦æä½ è¦ä¿è¯çº¿ç¨å®å
¨çè¯å°±ä½¿ç¨ `ConcurrentHashMap` å§ï¼ï¼ï¼
- **æçï¼** å 为线ç¨å®å
¨çé®é¢ï¼`HashMap` è¦æ¯ `Hashtable` æçé«ä¸ç¹ãå¦å¤ï¼`Hashtable` åºæ¬è¢«æ·æ±°ï¼ä¸è¦å¨ä»£ç ä¸ä½¿ç¨å®ï¼
- **对 Null key å Null value çæ¯æï¼** `HashMap` å¯ä»¥åå¨ null ç key å valueï¼ä½ null ä½ä¸ºé®åªè½æä¸ä¸ªï¼null ä½ä¸ºå¼å¯ä»¥æå¤ä¸ªï¼Hashtable ä¸å
许æ null é®å null å¼ï¼å¦åä¼æåº `NullPointerException`ã
- **åå§å®¹é大å°åæ¯æ¬¡æ©å
容é大å°çä¸å ï¼** â å建æ¶å¦æä¸æå®å®¹éåå§å¼ï¼`Hashtable` é»è®¤çåå§å¤§å°ä¸º 11ï¼ä¹åæ¯æ¬¡æ©å
ï¼å®¹éåä¸ºåæ¥ç 2n+1ã`HashMap` é»è®¤çåå§å大å°ä¸º 16ãä¹åæ¯æ¬¡æ©å
ï¼å®¹éåä¸ºåæ¥ç 2 åãâ¡ å建æ¶å¦æç»å®äºå®¹éåå§å¼ï¼é£ä¹ `Hashtable` ä¼ç´æ¥ä½¿ç¨ä½ ç»å®ç大å°ï¼è `HashMap` ä¼å°å
¶æ©å
为 2 ç广¬¡æ¹å¤§å°ï¼`HashMap` ä¸ç`tableSizeFor()`æ¹æ³ä¿è¯ï¼ä¸é¢ç»åºäºæºä»£ç ï¼ãä¹å°±æ¯è¯´ `HashMap` æ»æ¯ä½¿ç¨ 2 çå¹ä½ä¸ºåå¸è¡¨ç大å°,åé¢ä¼ä»ç»å°ä¸ºä»ä¹æ¯ 2 ç广¬¡æ¹ã
- **åºå±æ°æ®ç»æï¼** JDK1.8 以åç `HashMap` å¨è§£å³åå¸å²çªæ¶æäºè¾å¤§çååï¼å½é¾è¡¨é¿åº¦å¤§äºéå¼ï¼é»è®¤ä¸º 8ï¼æ¶ï¼å°é¾è¡¨è½¬åä¸ºçº¢é»æ ï¼å°é¾è¡¨è½¬æ¢æçº¢é»æ åä¼å¤æï¼å¦æå½åæ°ç»çé¿åº¦å°äº 64ï¼é£ä¹ä¼éæ©å
è¿è¡æ°ç»æ©å®¹ï¼è䏿¯è½¬æ¢ä¸ºçº¢é»æ ï¼ï¼ä»¥åå°æç´¢æ¶é´ï¼åæä¸æä¼ç»åæºç 对è¿ä¸è¿ç¨è¿è¡åæï¼ã`Hashtable` 没æè¿æ ·çæºå¶ã
**`HashMap` ä¸å¸¦æåå§å®¹éçæé 彿°ï¼**
```java
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
```
ä¸é¢è¿ä¸ªæ¹æ³ä¿è¯äº `HashMap` æ»æ¯ä½¿ç¨ 2 çå¹ä½ä¸ºåå¸è¡¨ç大å°ã
```java
/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
```
### HashMap å HashSet åºå«
å¦æä½ çè¿ `HashSet` æºç çè¯å°±åºè¯¥ç¥éï¼`HashSet` åºå±å°±æ¯åºäº `HashMap` å®ç°çãï¼`HashSet` çæºç é常é常å°ï¼å 为é¤äº `clone()`ã`writeObject()`ã`readObject()`æ¯ `HashSet` èªå·±ä¸å¾ä¸å®ç°ä¹å¤ï¼å
¶ä»æ¹æ³é½æ¯ç´æ¥è°ç¨ `HashMap` ä¸çæ¹æ³ã
| `HashMap` | `HashSet` |
| :------------------------------------: | :----------------------------------------------------------: |
| å®ç°äº `Map` æ¥å£ | å®ç° `Set` æ¥å£ |
| åå¨é®å¼å¯¹ | ä»
åå¨å¯¹è±¡ |
| è°ç¨ `put()`å map 䏿·»å å
ç´ | è°ç¨ `add()`æ¹æ³å `Set` 䏿·»å å
ç´ |
| `HashMap` 使ç¨é®ï¼Keyï¼è®¡ç® `hashcode` | `HashSet` ä½¿ç¨æå对象æ¥è®¡ç® `hashcode` å¼ï¼å¯¹äºä¸¤ä¸ªå¯¹è±¡æ¥è¯´ `hashcode` å¯è½ç¸åï¼æä»¥`equals()`æ¹æ³ç¨æ¥å¤æå¯¹è±¡çç¸çæ§ |
### HashMap å TreeMap åºå«
`TreeMap` å`HashMap` é½ç»§æ¿èª`AbstractMap` ï¼ä½æ¯éè¦æ³¨æçæ¯`TreeMap`å®è¿å®ç°äº`NavigableMap`æ¥å£å`SortedMap` æ¥å£ã

å®ç° `NavigableMap` æ¥å£è®© `TreeMap` æäºå¯¹éåå
å
ç´ çæç´¢çè½åã
å®ç°`SortedMap`æ¥å£è®© `TreeMap` æäºå¯¹éåä¸çå
ç´ æ ¹æ®é®æåºçè½åãé»è®¤æ¯æ key çååºæåºï¼ä¸è¿æä»¬ä¹å¯ä»¥æå®æåºçæ¯è¾å¨ã示ä¾ä»£ç å¦ä¸ï¼
```java
/**
* @author shuang.kou
* @createTime 2020å¹´06æ15æ¥ 17:02:00
*/
public class Person {
private Integer age;
public Person(Integer age) {
this.age = age;
}
public Integer getAge() {
return age;
}
public static void main(String[] args) {
TreeMap treeMap = new TreeMap<>(new Comparator() {
@Override
public int compare(Person person1, Person person2) {
int num = person1.getAge() - person2.getAge();
return Integer.compare(num, 0);
}
});
treeMap.put(new Person(3), "person1");
treeMap.put(new Person(18), "person2");
treeMap.put(new Person(35), "person3");
treeMap.put(new Person(16), "person4");
treeMap.entrySet().stream().forEach(personStringEntry -> {
System.out.println(personStringEntry.getValue());
});
}
}
```
è¾åº:
```
person1
person4
person2
person3
```
å¯ä»¥çåºï¼`TreeMap` ä¸çå
ç´ å·²ç»æ¯æç
§ `Person` ç age åæ®µçååºæ¥æåäºã
ä¸é¢ï¼æä»¬æ¯éè¿ä¼ å
¥å¿åå
é¨ç±»çæ¹å¼å®ç°çï¼ä½ å¯ä»¥å°ä»£ç æ¿æ¢æ Lambda 表达å¼å®ç°çæ¹å¼ï¼
```java
TreeMap treeMap = new TreeMap<>((person1, person2) -> {
int num = person1.getAge() - person2.getAge();
return Integer.compare(num, 0);
});
```
**综ä¸ï¼ç¸æ¯äº`HashMap`æ¥è¯´ `TreeMap` 主è¦å¤äºå¯¹éåä¸çå
ç´ æ ¹æ®é®æåºçè½å以å对éåå
å
ç´ çæç´¢çè½åã**
### HashSet å¦ä½æ£æ¥éå¤?
以ä¸å
容æèªæç Java å¯è书ãHead first javaã第äºçï¼
> å½ä½ æå¯¹è±¡å å
¥`HashSet`æ¶ï¼`HashSet` ä¼å
计ç®å¯¹è±¡ç`hashcode`弿¥å¤æå¯¹è±¡å å
¥çä½ç½®ï¼åæ¶ä¹ä¼ä¸å
¶ä»å å
¥ç对象ç `hashcode` å¼ä½æ¯è¾ï¼å¦ææ²¡æç¸ç¬¦ç `hashcode`ï¼`HashSet` ä¼å设对象没æéå¤åºç°ã使¯å¦æåç°æç¸å `hashcode` å¼ç对象ï¼è¿æ¶ä¼è°ç¨`equals()`æ¹æ³æ¥æ£æ¥ `hashcode` ç¸çç对象æ¯å¦ççç¸åã妿䏤è
ç¸åï¼`HashSet` å°±ä¸ä¼è®©å å
¥æä½æåã
å¨ JDK1.8 ä¸ï¼`HashSet`ç`add()`æ¹æ³åªæ¯ç®åçè°ç¨äº`HashMap`ç`put()`æ¹æ³ï¼å¹¶ä¸å¤æäºä¸ä¸è¿åå¼ä»¥ç¡®ä¿æ¯å¦æéå¤å
ç´ ãç´æ¥çä¸ä¸`HashSet`ä¸çæºç ï¼
```java
// Returns: true if this set did not already contain the specified element
// è¿åå¼ï¼å½ set 䏿²¡æå
å« add çå
ç´ æ¶è¿åç
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
```
èå¨`HashMap`ç`putVal()`æ¹æ³ä¸ä¹è½çå°å¦ä¸è¯´æï¼
```java
// Returns : previous value, or null if none
// è¿åå¼ï¼å¦ææå
¥ä½ç½®æ²¡æå
ç´ è¿ånullï¼å¦åè¿åä¸ä¸ä¸ªå
ç´
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
...
}
```
ä¹å°±æ¯è¯´ï¼å¨ JDK1.8 ä¸ï¼å®é
䏿 论`HashSet`䏿¯å¦å·²ç»åå¨äºæå
ç´ ï¼`HashSet`é½ä¼ç´æ¥æå
¥ï¼åªæ¯ä¼å¨`add()`æ¹æ³çè¿åå¼å¤åè¯æä»¬æå
¥åæ¯å¦åå¨ç¸åå
ç´ ã
### HashMap çåºå±å®ç°
#### JDK1.8 ä¹å
JDK1.8 ä¹å `HashMap` åºå±æ¯ **æ°ç»åé¾è¡¨** ç»åå¨ä¸èµ·ä½¿ç¨ä¹å°±æ¯ **é¾è¡¨æ£å**ãHashMap éè¿ key ç `hashcode` ç»è¿æ°å¨å½æ°å¤çè¿åå¾å° hash å¼ï¼ç¶åéè¿ `(n - 1) & hash` 夿å½åå
ç´ åæ¾çä½ç½®ï¼è¿éç n æçæ¯æ°ç»çé¿åº¦ï¼ï¼å¦æå½åä½ç½®åå¨å
ç´ çè¯ï¼å°±å¤æè¯¥å
ç´ ä¸è¦åå
¥çå
ç´ ç hash å¼ä»¥å key æ¯å¦ç¸åï¼å¦æç¸åçè¯ï¼ç´æ¥è¦çï¼ä¸ç¸åå°±éè¿æé¾æ³è§£å³å²çªã
æè°æ°å¨å½æ°æçå°±æ¯ HashMap ç `hash` æ¹æ³ãä½¿ç¨ `hash` æ¹æ³ä¹å°±æ¯æ°å¨å½æ°æ¯ä¸ºäºé²æ¢ä¸äºå®ç°æ¯è¾å·®ç `hashCode()` æ¹æ³ æ¢å¥è¯è¯´ä½¿ç¨æ°å¨å½æ°ä¹åå¯ä»¥åå°ç¢°æã
**JDK 1.8 HashMap ç hash æ¹æ³æºç :**
JDK 1.8 ç hash æ¹æ³ ç¸æ¯äº JDK 1.7 hash æ¹æ³æ´å ç®åï¼ä½æ¯åçä¸åã
```java
static final int hash(Object key) {
int h;
// key.hashCode()ï¼è¿åæ£åå¼ä¹å°±æ¯hashcode
// ^ ï¼æä½å¼æ
// >>>:æ 符å·å³ç§»ï¼å¿½ç¥ç¬¦å·ä½ï¼ç©ºä½é½ä»¥0è¡¥é½
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
```
对æ¯ä¸ä¸ JDK1.7 ç HashMap ç hash æ¹æ³æºç .
```java
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
```
ç¸æ¯äº JDK1.8 ç hash æ¹æ³ ï¼JDK 1.7 ç hash æ¹æ³çæ§è½ä¼ç¨å·®ä¸ç¹ç¹ï¼å 为æ¯ç«æ°å¨äº 4 次ã
æè° **âæé¾æ³â** å°±æ¯ï¼å°é¾è¡¨åæ°ç»ç¸ç»åãä¹å°±æ¯è¯´å建ä¸ä¸ªé¾è¡¨æ°ç»ï¼æ°ç»ä¸æ¯ä¸æ ¼å°±æ¯ä¸ä¸ªé¾è¡¨ãè¥éå°åå¸å²çªï¼åå°å²çªçå¼å å°é¾è¡¨ä¸å³å¯ã

#### JDK1.8 ä¹å
ç¸æ¯äºä¹åççæ¬ï¼ JDK1.8 ä¹åå¨è§£å³åå¸å²çªæ¶æäºè¾å¤§çååï¼å½é¾è¡¨é¿åº¦å¤§äºéå¼ï¼é»è®¤ä¸º 8ï¼ï¼å°é¾è¡¨è½¬æ¢æçº¢é»æ åä¼å¤æï¼å¦æå½åæ°ç»çé¿åº¦å°äº 64ï¼é£ä¹ä¼éæ©å
è¿è¡æ°ç»æ©å®¹ï¼è䏿¯è½¬æ¢ä¸ºçº¢é»æ ï¼æ¶ï¼å°é¾è¡¨è½¬åä¸ºçº¢é»æ ï¼ä»¥åå°æç´¢æ¶é´ã

> TreeMapãTreeSet 以å JDK1.8 ä¹åç HashMap åºå±é½ç¨å°äºçº¢é»æ ãçº¢é»æ å°±æ¯ä¸ºäºè§£å³äºåæ¥æ¾æ ç缺é·ï¼å 为äºåæ¥æ¾æ å¨æäºæ
åµä¸ä¼éåæä¸ä¸ªçº¿æ§ç»æã
æä»¬æ¥ç»åæºç åæä¸ä¸ `HashMap` é¾è¡¨å°çº¢é»æ ç转æ¢ã
**1ã `putVal` æ¹æ³ä¸æ§è¡é¾è¡¨è½¬çº¢é»æ ç夿é»è¾ã**
é¾è¡¨çé¿åº¦å¤§äº 8 çæ¶åï¼å°±æ§è¡ `treeifyBin` ï¼è½¬æ¢çº¢é»æ ï¼çé»è¾ã
```java
// éåé¾è¡¨
for (int binCount = 0; ; ++binCount) {
// éåå°é¾è¡¨æåä¸ä¸ªèç¹
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
// 妿é¾è¡¨å
ç´ ä¸ªæ°å¤§äºçäºTREEIFY_THRESHOLDï¼8ï¼
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
// çº¢é»æ 转æ¢ï¼å¹¶ä¸ä¼ç´æ¥è½¬æ¢æçº¢é»æ ï¼
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
```
**2ã`treeifyBin` æ¹æ³ä¸å¤ææ¯å¦çç转æ¢ä¸ºçº¢é»æ ã**
```java
final void treeifyBin(Node[] tab, int hash) {
int n, index; Node e;
// 夿å½åæ°ç»çé¿åº¦æ¯å¦å°äº 64
if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)
// 妿å½åæ°ç»çé¿åº¦å°äº 64ï¼é£ä¹ä¼éæ©å
è¿è¡æ°ç»æ©å®¹
resize();
else if ((e = tab[index = (n - 1) & hash]) != null) {
// å¦åæå°å表转æ¢ä¸ºçº¢é»æ
TreeNode hd = null, tl = null;
do {
TreeNode p = replacementTreeNode(e, null);
if (tl == null)
hd = p;
else {
p.prev = tl;
tl.next = p;
}
tl = p;
} while ((e = e.next) != null);
if ((tab[index] = hd) != null)
hd.treeify(tab);
}
}
```
å°é¾è¡¨è½¬æ¢æçº¢é»æ åä¼å¤æï¼å¦æå½åæ°ç»çé¿åº¦å°äº 64ï¼é£ä¹ä¼éæ©å
è¿è¡æ°ç»æ©å®¹ï¼è䏿¯è½¬æ¢ä¸ºçº¢é»æ ã
### HashMap çé¿åº¦ä¸ºä»ä¹æ¯ 2 ç广¬¡æ¹
为äºè½è®© HashMap åå髿ï¼å°½éè¾å°ç¢°æï¼ä¹å°±æ¯è¦å°½éææ°æ®åé
ååãæä»¬ä¸é¢ä¹è®²å°äºè¿äºï¼Hash å¼çèå´å¼-2147483648 å° 2147483647ï¼ååå èµ·æ¥å¤§æ¦ 40 äº¿çæ å°ç©ºé´ï¼åªè¦åå¸å½æ°æ å°å¾æ¯è¾ååæ¾æ£ï¼ä¸è¬åºç¨æ¯å¾é¾åºç°ç¢°æçãä½é®é¢æ¯ä¸ä¸ª 40 亿é¿åº¦çæ°ç»ï¼å
忝æ¾ä¸ä¸çãæä»¥è¿ä¸ªæ£å弿¯ä¸è½ç´æ¥æ¿æ¥ç¨çãç¨ä¹åè¿è¦å
å对æ°ç»çé¿åº¦å模è¿ç®ï¼å¾å°ç使°æè½ç¨æ¥è¦åæ¾çä½ç½®ä¹å°±æ¯å¯¹åºçæ°ç»ä¸æ ãè¿ä¸ªæ°ç»ä¸æ çè®¡ç®æ¹æ³æ¯â `(n - 1) & hash`âãï¼n 代表æ°ç»é¿åº¦ï¼ãè¿ä¹å°±è§£éäº HashMap çé¿åº¦ä¸ºä»ä¹æ¯ 2 ç广¬¡æ¹ã
**è¿ä¸ªç®æ³åºè¯¥å¦ä½è®¾è®¡å¢ï¼**
æä»¬é¦å
å¯è½ä¼æ³å°éç¨%åä½çæä½æ¥å®ç°ã使¯ï¼éç¹æ¥äºï¼**âåä½(%)æä½ä¸å¦æé¤æ°æ¯ 2 ç广¬¡åçä»·äºä¸å
¶é¤æ°åä¸çä¸(&)æä½ï¼ä¹å°±æ¯è¯´ hash%length==hash&(length-1)çåææ¯ length æ¯ 2 ç n 次æ¹ï¼ï¼ãâ** å¹¶ä¸ **éç¨äºè¿å¶ä½æä½ &ï¼ç¸å¯¹äº%è½å¤æé«è¿ç®æçï¼è¿å°±è§£éäº HashMap çé¿åº¦ä¸ºä»ä¹æ¯ 2 ç广¬¡æ¹ã**
### HashMap å¤çº¿ç¨æä½å¯¼è´æ»å¾ªç¯é®é¢
主è¦åå å¨äºå¹¶åä¸ç Rehash ä¼é æå
ç´ ä¹é´ä¼å½¢æä¸ä¸ªå¾ªç¯é¾è¡¨ãä¸è¿ï¼jdk 1.8 åè§£å³äºè¿ä¸ªé®é¢ï¼ä½æ¯è¿æ¯ä¸å»ºè®®å¨å¤çº¿ç¨ä¸ä½¿ç¨ HashMap,å 为å¤çº¿ç¨ä¸ä½¿ç¨ HashMap è¿æ¯ä¼åå¨å
¶ä»é®é¢æ¯å¦æ°æ®ä¸¢å¤±ãå¹¶åç¯å¢ä¸æ¨èä½¿ç¨ ConcurrentHashMap ã
详æ
请æ¥çï¼
### HashMap æåªå ç§å¸¸è§çéåæ¹å¼?
[HashMap ç 7 ç§éåæ¹å¼ä¸æ§è½åæï¼](https://mp.weixin.qq.com/s/zQBN3UvJDhRTKP6SzcZFKw)
### ConcurrentHashMap å Hashtable çåºå«
`ConcurrentHashMap` å `Hashtable` çåºå«ä¸»è¦ä½ç°å¨å®ç°çº¿ç¨å®å
¨çæ¹å¼ä¸ä¸åã
- **åºå±æ°æ®ç»æï¼** JDK1.7 ç `ConcurrentHashMap` åºå±éç¨ **åæ®µçæ°ç»+é¾è¡¨** å®ç°ï¼JDK1.8 éç¨çæ°æ®ç»æè· `HashMap1.8` çç»æä¸æ ·ï¼æ°ç»+é¾è¡¨/红é»äºåæ ã`Hashtable` å JDK1.8 ä¹åç `HashMap` çåºå±æ°æ®ç»æç±»ä¼¼é½æ¯éç¨ **æ°ç»+é¾è¡¨** çå½¢å¼ï¼æ°ç»æ¯ HashMap ç主ä½ï¼é¾è¡¨åæ¯ä¸»è¦ä¸ºäºè§£å³åå¸å²çªèåå¨çï¼
- **å®ç°çº¿ç¨å®å
¨çæ¹å¼ï¼éè¦ï¼ï¼**
- å¨ JDK1.7 çæ¶åï¼`ConcurrentHashMap` 对æ´ä¸ªæ¡¶æ°ç»è¿è¡äºåå²å段(`Segment`ï¼å段é)ï¼æ¯ä¸æéåªé容å¨å
¶ä¸ä¸é¨åæ°æ®ï¼ä¸é¢æç¤ºæå¾ï¼ï¼å¤çº¿ç¨è®¿é®å®¹å¨éä¸åæ°æ®æ®µçæ°æ®ï¼å°±ä¸ä¼åå¨éç«äºï¼æé«å¹¶å访é®çã
- å°äº JDK1.8 çæ¶åï¼`ConcurrentHashMap` å·²ç»æå¼äº `Segment` çæ¦å¿µï¼èæ¯ç´æ¥ç¨ `Node` æ°ç»+é¾è¡¨+çº¢é»æ çæ°æ®ç»ææ¥å®ç°ï¼å¹¶åæ§å¶ä½¿ç¨ `synchronized` å CAS æ¥æä½ãï¼JDK1.6 以å `synchronized` éåäºå¾å¤ä¼åï¼ æ´ä¸ªçèµ·æ¥å°±åæ¯ä¼åè¿ä¸çº¿ç¨å®å
¨ç `HashMap`ï¼è½ç¶å¨ JDK1.8 ä¸è¿è½çå° `Segment` çæ°æ®ç»æï¼ä½æ¯å·²ç»ç®åäºå±æ§ï¼åªæ¯ä¸ºäºå
¼å®¹æ§çæ¬ï¼
- **`Hashtable`(å䏿é)** :ä½¿ç¨ `synchronized` æ¥ä¿è¯çº¿ç¨å®å
¨ï¼æçé常ä½ä¸ãå½ä¸ä¸ªçº¿ç¨è®¿é®åæ¥æ¹æ³æ¶ï¼å
¶ä»çº¿ç¨ä¹è®¿é®åæ¥æ¹æ³ï¼å¯è½ä¼è¿å
¥é»å¡æè½®è¯¢ç¶æï¼å¦ä½¿ç¨ put æ·»å å
ç´ ï¼å¦ä¸ä¸ªçº¿ç¨ä¸è½ä½¿ç¨ put æ·»å å
ç´ ï¼ä¹ä¸è½ä½¿ç¨ getï¼ç«äºä¼è¶æ¥è¶æ¿çæçè¶ä½ã
ä¸é¢ï¼æä»¬åæ¥çç两è
åºå±æ°æ®ç»æç对æ¯å¾ã
**Hashtable** :

https://www.cnblogs.com/chengxiao/p/6842045.html>
**JDK1.7 ç ConcurrentHashMap** ï¼

`ConcurrentHashMap` æ¯ç± `Segment` æ°ç»ç»æå `HashEntry` æ°ç»ç»æç»æã
`Segment` æ°ç»ä¸çæ¯ä¸ªå
ç´ å
å«ä¸ä¸ª `HashEntry` æ°ç»ï¼æ¯ä¸ª `HashEntry` æ°ç»å±äºé¾è¡¨ç»æã
**JDK1.8 ç ConcurrentHashMap** ï¼

JDK1.8 ç `ConcurrentHashMap` ä¸åæ¯ **Segment æ°ç» + HashEntry æ°ç» + é¾è¡¨**ï¼èæ¯ **Node æ°ç» + é¾è¡¨ / çº¢é»æ **ãä¸è¿ï¼Node åªè½ç¨äºé¾è¡¨çæ
åµï¼çº¢é»æ çæ
åµéè¦ä½¿ç¨ **`TreeNode`**ãå½å²çªé¾è¡¨è¾¾å°ä¸å®é¿åº¦æ¶ï¼é¾è¡¨ä¼è½¬æ¢æçº¢é»æ ã
`TreeNode`æ¯åå¨çº¢é»æ èç¹ï¼è¢«`TreeBin`å
è£
ã`TreeBin`éè¿`root`屿§ç»´æ¤çº¢é»æ çæ ¹ç»ç¹ï¼å ä¸ºçº¢é»æ å¨æè½¬çæ¶åï¼æ ¹ç»ç¹å¯è½ä¼è¢«å®åæ¥çåèç¹æ¿æ¢æï¼å¨è¿ä¸ªæ¶é´ç¹ï¼å¦ææå
¶ä»çº¿ç¨è¦åè¿æ£µçº¢é»æ å°±ä¼åç线ç¨ä¸å®å
¨é®é¢ï¼æä»¥å¨ `ConcurrentHashMap` ä¸`TreeBin`éè¿`waiter`屿§ç»´æ¤å½å使ç¨è¿æ£µçº¢é»æ ç线ç¨ï¼æ¥é²æ¢å
¶ä»çº¿ç¨çè¿å
¥ã
```java
static final class TreeBin extends Node {
TreeNode root;
volatile TreeNode first;
volatile Thread waiter;
volatile int lockState;
// values for lockState
static final int WRITER = 1; // set while holding write lock
static final int WAITER = 2; // set when waiting for write lock
static final int READER = 4; // increment value for setting read lock
...
}
```
### ConcurrentHashMap 线ç¨å®å
¨çå
·ä½å®ç°æ¹å¼/åºå±å
·ä½å®ç°
#### JDK1.8 ä¹å

é¦å
å°æ°æ®åä¸ºä¸æ®µä¸æ®µï¼è¿ä¸ªâ段âå°±æ¯ `Segment`ï¼çåå¨ï¼ç¶åç»æ¯ä¸æ®µæ°æ®é
䏿éï¼å½ä¸ä¸ªçº¿ç¨å ç¨é访é®å
¶ä¸ä¸ä¸ªæ®µæ°æ®æ¶ï¼å
¶ä»æ®µçæ°æ®ä¹è½è¢«å
¶ä»çº¿ç¨è®¿é®ã
**`ConcurrentHashMap` æ¯ç± `Segment` æ°ç»ç»æå `HashEntry` æ°ç»ç»æç»æ**ã
`Segment` ç»§æ¿äº `ReentrantLock`,æä»¥ `Segment` æ¯ä¸ç§å¯éå
¥éï¼æ®æ¼éçè§è²ã`HashEntry` ç¨äºåå¨é®å¼å¯¹æ°æ®ã
```java
static class Segment extends ReentrantLock implements Serializable {
}
```
ä¸ä¸ª `ConcurrentHashMap` éå
å«ä¸ä¸ª `Segment` æ°ç»ï¼`Segment` ç个æ°ä¸æ¦**åå§åå°±ä¸è½æ¹å**ã `Segment` æ°ç»ç大å°é»è®¤æ¯ 16ï¼ä¹å°±æ¯è¯´é»è®¤å¯ä»¥åæ¶æ¯æ 16 个线ç¨å¹¶ååã
`Segment` çç»æå `HashMap` ç±»ä¼¼ï¼æ¯ä¸ç§æ°ç»åé¾è¡¨ç»æï¼ä¸ä¸ª `Segment` å
å«ä¸ä¸ª `HashEntry` æ°ç»ï¼æ¯ä¸ª `HashEntry` æ¯ä¸ä¸ªé¾è¡¨ç»æçå
ç´ ï¼æ¯ä¸ª `Segment` 宿¤çä¸ä¸ª `HashEntry` æ°ç»éçå
ç´ ï¼å½å¯¹ `HashEntry` æ°ç»çæ°æ®è¿è¡ä¿®æ¹æ¶ï¼å¿
é¡»é¦å
è·å¾å¯¹åºç `Segment` çéãä¹å°±æ¯è¯´ï¼å¯¹åä¸ `Segment` çå¹¶ååå
¥ä¼è¢«é»å¡ï¼ä¸å `Segment` çåå
¥æ¯å¯ä»¥å¹¶åæ§è¡çã
#### JDK1.8 ä¹å

Java 8 å ä¹å®å
¨éåäº `ConcurrentHashMap`ï¼ä»£ç éä»åæ¥ Java 7 ä¸ç 1000 å¤è¡ï¼åæäºç°å¨ç 6000 å¤è¡ã
`ConcurrentHashMap` åæ¶äº `Segment` åæ®µéï¼éç¨ `Node + CAS + synchronized` æ¥ä¿è¯å¹¶åå®å
¨ãæ°æ®ç»æè· `HashMap` 1.8 çç»æç±»ä¼¼ï¼æ°ç»+é¾è¡¨/红é»äºåæ ãJava 8 å¨é¾è¡¨é¿åº¦è¶
è¿ä¸å®éå¼ï¼8ï¼æ¶å°é¾è¡¨ï¼å¯»åæ¶é´å¤æåº¦ä¸º O(N)ï¼è½¬æ¢ä¸ºçº¢é»æ ï¼å¯»åæ¶é´å¤æåº¦ä¸º O(log(N))ï¼ã
Java 8 ä¸ï¼éç²åº¦æ´ç»ï¼`synchronized` åªéå®å½åé¾è¡¨æçº¢é»äºåæ çé¦èç¹ï¼è¿æ ·åªè¦ hash ä¸å²çªï¼å°±ä¸ä¼äº§çå¹¶åï¼å°±ä¸ä¼å½±åå
¶ä» Node ç读åï¼æç大å¹
æåã
### JDK 1.7 å JDK 1.8 ç ConcurrentHashMap å®ç°æä»ä¹ä¸åï¼
- **线ç¨å®å
¨å®ç°æ¹å¼** ï¼JDK 1.7 éç¨ `Segment` åæ®µéæ¥ä¿è¯å®å
¨ï¼ `Segment` æ¯ç»§æ¿èª `ReentrantLock`ãJDK1.8 æ¾å¼äº `Segment` åæ®µéç设计ï¼éç¨ `Node + CAS + synchronized` ä¿è¯çº¿ç¨å®å
¨ï¼éç²åº¦æ´ç»ï¼`synchronized` åªéå®å½åé¾è¡¨æçº¢é»äºåæ çé¦èç¹ã
- **Hash 碰æè§£å³æ¹æ³** : JDK 1.7 éç¨æé¾æ³ï¼JDK1.8 éç¨æé¾æ³ç»åçº¢é»æ ï¼é¾è¡¨é¿åº¦è¶
è¿ä¸å®é弿¶ï¼å°é¾è¡¨è½¬æ¢ä¸ºçº¢é»æ ï¼ã
- **å¹¶å度** ï¼JDK 1.7 æå¤§å¹¶ååº¦æ¯ Segment ç个æ°ï¼é»è®¤æ¯ 16ãJDK 1.8 æå¤§å¹¶ååº¦æ¯ Node æ°ç»ç大å°ï¼å¹¶å度æ´å¤§ã
------
## 2.3. å¤çº¿ç¨
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
>
> è¿é¨åå
容æèª [JavaGuide](https://javaguide.cn/) ä¸é¢å ç¯æç« ï¼
>
> - [Java å¹¶å常è§é¢è¯é¢æ»ç»ï¼ä¸ï¼](https://javaguide.cn/java/concurrent/java-concurrent-questions-01.html)
> - [Java å¹¶å常è§é¢è¯é¢æ»ç»ï¼ä¸ï¼](https://javaguide.cn/java/concurrent/java-concurrent-questions-02.html)
> - [Java å¹¶å常è§é¢è¯é¢æ»ç»ï¼ä¸ï¼](https://javaguide.cn/java/concurrent/java-concurrent-questions-03.html)
### ä»ä¹æ¯çº¿ç¨åè¿ç¨?
#### ä½ä¸ºè¿ç¨?
è¿ç¨æ¯ç¨åºç䏿¬¡æ§è¡è¿ç¨ï¼æ¯ç³»ç»è¿è¡ç¨åºçåºæ¬åä½ï¼å æ¤è¿ç¨æ¯å¨æçãç³»ç»è¿è¡ä¸ä¸ªç¨åºå³æ¯ä¸ä¸ªè¿ç¨ä»å建ï¼è¿è¡å°æ¶äº¡çè¿ç¨ã
å¨ Java ä¸ï¼å½æä»¬å¯å¨ main 彿°æ¶å
¶å®å°±æ¯å¯å¨äºä¸ä¸ª JVM çè¿ç¨ï¼è main 彿°æå¨ç线ç¨å°±æ¯è¿ä¸ªè¿ç¨ä¸çä¸ä¸ªçº¿ç¨ï¼ä¹ç§°ä¸»çº¿ç¨ã
å¦ä¸å¾æç¤ºï¼å¨ Windows ä¸éè¿æ¥çä»»å¡ç®¡çå¨çæ¹å¼ï¼æä»¬å°±å¯ä»¥æ¸
æ¥çå° Windows å½åè¿è¡çè¿ç¨ï¼`.exe` æä»¶çè¿è¡ï¼ã

#### ä½ä¸ºçº¿ç¨?
线ç¨ä¸è¿ç¨ç¸ä¼¼ï¼ä½çº¿ç¨æ¯ä¸ä¸ªæ¯è¿ç¨æ´å°çæ§è¡åä½ãä¸ä¸ªè¿ç¨å¨å
¶æ§è¡çè¿ç¨ä¸å¯ä»¥äº§çå¤ä¸ªçº¿ç¨ãä¸è¿ç¨ä¸åçæ¯åç±»çå¤ä¸ªçº¿ç¨å
±äº«è¿ç¨ç**å **å**æ¹æ³åº**èµæºï¼ä½æ¯ä¸ªçº¿ç¨æèªå·±ç**ç¨åºè®¡æ°å¨**ã**èææºæ **å**æ¬å°æ¹æ³æ **ï¼æä»¥ç³»ç»å¨äº§çä¸ä¸ªçº¿ç¨ï¼ææ¯å¨å个线ç¨ä¹é´ä½åæ¢å·¥ä½æ¶ï¼è´æ
è¦æ¯è¿ç¨å°å¾å¤ï¼ä¹æ£å ä¸ºå¦æ¤ï¼çº¿ç¨ä¹è¢«ç§°ä¸ºè½»é级è¿ç¨ã
Java ç¨åºå¤©çå°±æ¯å¤çº¿ç¨ç¨åºï¼æä»¬å¯ä»¥éè¿ JMX æ¥ççä¸ä¸ªæ®éç Java ç¨åºæåªäºçº¿ç¨ï¼ä»£ç å¦ä¸ã
```java
public class MultiThread {
public static void main(String[] args) {
// è·å Java 线ç¨ç®¡ç MXBean
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
// ä¸éè¦è·å忥ç monitor å synchronizer ä¿¡æ¯ï¼ä»
è·å线ç¨å线ç¨å æ ä¿¡æ¯
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
// éå线ç¨ä¿¡æ¯ï¼ä»
æå°çº¿ç¨ ID å线ç¨åç§°ä¿¡æ¯
for (ThreadInfo threadInfo : threadInfos) {
System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());
}
}
}
```
ä¸è¿°ç¨åºè¾åºå¦ä¸ï¼è¾åºå
容å¯è½ä¸åï¼ä¸ç¨å¤ªçº ç»ä¸é¢æ¯ä¸ªçº¿ç¨çä½ç¨ï¼åªç¨ç¥é main çº¿ç¨æ§è¡ main æ¹æ³å³å¯ï¼ï¼
```
[5] Attach Listener //æ·»å äºä»¶
[4] Signal Dispatcher // ååå¤çç» JVM ä¿¡å·ç线ç¨
[3] Finalizer //è°ç¨å¯¹è±¡ finalize æ¹æ³ç线ç¨
[2] Reference Handler //æ¸
é¤ reference 线ç¨
[1] main //main 线ç¨,ç¨åºå
¥å£
```
ä»ä¸é¢çè¾åºå
容å¯ä»¥çåºï¼**ä¸ä¸ª Java ç¨åºçè¿è¡æ¯ main 线ç¨åå¤ä¸ªå
¶ä»çº¿ç¨åæ¶è¿è¡**ã
### 请ç®è¦æè¿°çº¿ç¨ä¸è¿ç¨çå
³ç³»,åºå«åä¼ç¼ºç¹ï¼
ä» JVM è§åº¦è¯´è¿ç¨å线ç¨ä¹é´çå
³ç³»ã
#### å¾è§£è¿ç¨å线ç¨çå
³ç³»
ä¸å¾æ¯ Java å
ååºåï¼éè¿ä¸å¾æä»¬ä» JVM çè§åº¦æ¥è¯´ä¸ä¸çº¿ç¨åè¿ç¨ä¹é´çå
³ç³»ã

ä»ä¸å¾å¯ä»¥çåºï¼ä¸ä¸ªè¿ç¨ä¸å¯ä»¥æå¤ä¸ªçº¿ç¨ï¼å¤ä¸ªçº¿ç¨å
±äº«è¿ç¨ç**å **å**æ¹æ³åº (JDK1.8 ä¹åçå
空é´)**èµæºï¼ä½æ¯æ¯ä¸ªçº¿ç¨æèªå·±ç**ç¨åºè®¡æ°å¨**ã**èææºæ ** å **æ¬å°æ¹æ³æ **ã
**æ»ç»ï¼** **çº¿ç¨æ¯è¿ç¨ååæçæ´å°çè¿è¡åä½ã线ç¨åè¿ç¨æå¤§çä¸åå¨äºåºæ¬ä¸åè¿ç¨æ¯ç¬ç«çï¼èå线ç¨åä¸ä¸å®ï¼å 为åä¸è¿ç¨ä¸ççº¿ç¨ææå¯è½ä¼ç¸äºå½±åãçº¿ç¨æ§è¡å¼éå°ï¼ä½ä¸å©äºèµæºç管çåä¿æ¤ï¼èè¿ç¨æ£ç¸åã**
ä¸é¢æ¯è¯¥ç¥è¯ç¹çæ©å±å
容ï¼
ä¸é¢æ¥æèè¿æ ·ä¸ä¸ªé®é¢ï¼ä¸ºä»ä¹**ç¨åºè®¡æ°å¨**ã**èææºæ **å**æ¬å°æ¹æ³æ **æ¯çº¿ç¨ç§æçå¢ï¼ä¸ºä»ä¹å åæ¹æ³åºæ¯çº¿ç¨å
±äº«çå¢ï¼
#### ç¨åºè®¡æ°å¨ä¸ºä»ä¹æ¯ç§æç?
ç¨åºè®¡æ°å¨ä¸»è¦æä¸é¢ä¸¤ä¸ªä½ç¨ï¼
1. åèç è§£éå¨éè¿æ¹åç¨åºè®¡æ°å¨æ¥ä¾æ¬¡è¯»åæä»¤ï¼ä»èå®ç°ä»£ç çæµç¨æ§å¶ï¼å¦ï¼é¡ºåºæ§è¡ãéæ©ã循ç¯ãå¼å¸¸å¤çã
2. å¨å¤çº¿ç¨çæ
åµä¸ï¼ç¨åºè®¡æ°å¨ç¨äºè®°å½å½åçº¿ç¨æ§è¡çä½ç½®ï¼ä»èå½çº¿ç¨è¢«åæ¢åæ¥çæ¶åè½å¤ç¥é该线ç¨ä¸æ¬¡è¿è¡å°åªå¿äºã
éè¦æ³¨æçæ¯ï¼å¦ææ§è¡çæ¯ native æ¹æ³ï¼é£ä¹ç¨åºè®¡æ°å¨è®°å½çæ¯ undefined å°åï¼åªææ§è¡çæ¯ Java ä»£ç æ¶ç¨åºè®¡æ°å¨è®°å½çææ¯ä¸ä¸æ¡æä»¤çå°åã
æä»¥ï¼ç¨åºè®¡æ°å¨ç§æä¸»è¦æ¯ä¸ºäº**线ç¨åæ¢åè½æ¢å¤å°æ£ç¡®çæ§è¡ä½ç½®**ã
#### èææºæ 忬尿¹æ³æ 为ä»ä¹æ¯ç§æç?
- **èææºæ ï¼** æ¯ä¸ª Java æ¹æ³å¨æ§è¡çåæ¶ä¼å建ä¸ä¸ªæ 帧ç¨äºåå¨å±é¨åé表ãæä½æ°æ ã叏鿱 å¼ç¨çä¿¡æ¯ã仿¹æ³è°ç¨ç´è³æ§è¡å®æçè¿ç¨ï¼å°±å¯¹åºçä¸ä¸ªæ å¸§å¨ Java èææºæ ä¸å
¥æ ååºæ çè¿ç¨ã
- **æ¬å°æ¹æ³æ ï¼** åèææºæ æåæ¥çä½ç¨é常ç¸ä¼¼ï¼åºå«æ¯ï¼ **èææºæ ä¸ºèææºæ§è¡ Java æ¹æ³ ï¼ä¹å°±æ¯åèç ï¼æå¡ï¼èæ¬å°æ¹æ³æ åä¸ºèææºä½¿ç¨å°ç Native æ¹æ³æå¡ã** å¨ HotSpot èææºä¸å Java èææºæ åäºä¸ºä¸ã
æä»¥ï¼ä¸ºäº**ä¿è¯çº¿ç¨ä¸çå±é¨åéä¸è¢«å«ç线ç¨è®¿é®å°**ï¼èææºæ 忬尿¹æ³æ æ¯çº¿ç¨ç§æçã
#### ä¸å¥è¯ç®åäºè§£å åæ¹æ³åº
å åæ¹æ³åºæ¯ææçº¿ç¨å
±äº«çèµæºï¼å
¶ä¸å æ¯è¿ç¨ä¸æå¤§çä¸åå
åï¼ä¸»è¦ç¨äºåæ¾æ°å建ç对象 (å 乿æå¯¹è±¡é½å¨è¿éåé
å
å)ï¼æ¹æ³åºä¸»è¦ç¨äºåæ¾å·²è¢«å è½½ç类信æ¯ã常éãéæåéã峿¶ç¼è¯å¨ç¼è¯åç代ç çæ°æ®ã
### å¹¶åä¸å¹¶è¡çåºå«
- **å¹¶å**ï¼ä¸¤ä¸ªå两个以ä¸çä½ä¸å¨åä¸ **æ¶é´æ®µ** å
æ§è¡ã
- **å¹¶è¡**ï¼ä¸¤ä¸ªå两个以ä¸çä½ä¸å¨åä¸ **æ¶å»** æ§è¡ã
æå
³é®çç¹æ¯ï¼æ¯å¦æ¯ **åæ¶** æ§è¡ã
### 忥å弿¥çåºå«
- **忥** ï¼ ååºä¸ä¸ªè°ç¨ä¹åï¼å¨æ²¡æå¾å°ç»æä¹åï¼ è¯¥è°ç¨å°±ä¸å¯ä»¥è¿åï¼ä¸ç´çå¾
ã
- **弿¥** ï¼è°ç¨å¨ååºä¹åï¼ä¸ç¨çå¾
è¿åç»æï¼è¯¥è°ç¨ç´æ¥è¿åã
### 为ä»ä¹è¦ä½¿ç¨å¤çº¿ç¨å¢?
å
仿»ä½ä¸æ¥è¯´ï¼
- **ä»è®¡ç®æºåºå±æ¥è¯´ï¼** 线ç¨å¯ä»¥æ¯ä½æ¯è½»é级çè¿ç¨ï¼æ¯ç¨åºæ§è¡çæå°åä½,线ç¨é´ç忢åè°åº¦çææ¬è¿è¿å°äºè¿ç¨ãå¦å¤ï¼å¤æ ¸ CPU æ¶ä»£æå³çå¤ä¸ªçº¿ç¨å¯ä»¥åæ¶è¿è¡ï¼è¿åå°äºçº¿ç¨ä¸ä¸æåæ¢çå¼éã
- **ä»å½ä»£äºèç½åå±è¶å¿æ¥è¯´ï¼** ç°å¨çç³»ç»å¨ä¸å¨å°±è¦æ±ç¾ä¸çº§çè³åä¸çº§çå¹¶åéï¼èå¤çº¿ç¨å¹¶åç¼ç¨æ£æ¯å¼åé«å¹¶åç³»ç»çåºç¡ï¼å©ç¨å¥½å¤çº¿ç¨æºå¶å¯ä»¥å¤§å¤§æé«ç³»ç»æ´ä½çå¹¶åè½å以忧è½ã
åæ·±å
¥å°è®¡ç®æºåºå±æ¥æ¢è®¨ï¼
- **åæ ¸æ¶ä»£**ï¼ å¨åæ ¸æ¶ä»£å¤çº¿ç¨ä¸»è¦æ¯ä¸ºäºæé«åè¿ç¨å©ç¨ CPU å IO ç³»ç»çæçã å设åªè¿è¡äºä¸ä¸ª Java è¿ç¨çæ
åµï¼å½æä»¬è¯·æ± IO çæ¶åï¼å¦æ Java è¿ç¨ä¸åªæä¸ä¸ªçº¿ç¨ï¼æ¤çº¿ç¨è¢« IO é»å¡åæ´ä¸ªè¿ç¨è¢«é»å¡ãCPU å IO 设å¤åªæä¸ä¸ªå¨è¿è¡ï¼é£ä¹å¯ä»¥ç®åå°è¯´ç³»ç»æ´ä½æçåªæ 50%ãå½ä½¿ç¨å¤çº¿ç¨çæ¶åï¼ä¸ä¸ªçº¿ç¨è¢« IO é»å¡ï¼å
¶ä»çº¿ç¨è¿å¯ä»¥ç»§ç»ä½¿ç¨ CPUãä»èæé«äº Java è¿ç¨å©ç¨ç³»ç»èµæºçæ´ä½æçã
- **夿 ¸æ¶ä»£**: 夿 ¸æ¶ä»£å¤çº¿ç¨ä¸»è¦æ¯ä¸ºäºæé«è¿ç¨å©ç¨å¤æ ¸ CPU çè½åã举个ä¾åï¼å妿们è¦è®¡ç®ä¸ä¸ªå¤æçä»»å¡ï¼æä»¬åªç¨ä¸ä¸ªçº¿ç¨çè¯ï¼ä¸è®ºç³»ç»æå 个 CPU æ ¸å¿ï¼é½åªä¼æä¸ä¸ª CPU æ ¸å¿è¢«å©ç¨å°ãèå建å¤ä¸ªçº¿ç¨ï¼è¿äºçº¿ç¨å¯ä»¥è¢«æ å°å°åºå±å¤ä¸ª CPU 䏿§è¡ï¼å¨ä»»å¡ä¸çå¤ä¸ªçº¿ç¨æ²¡æèµæºç«äºçæ
åµä¸ï¼ä»»å¡æ§è¡çæç伿æ¾èæ§çæé«ï¼çº¦çäºï¼åæ ¸æ¶æ§è¡æ¶é´/CPU æ ¸å¿æ°ï¼ã
### 使ç¨å¤çº¿ç¨å¯è½å¸¦æ¥ä»ä¹é®é¢?
å¹¶åç¼ç¨çç®çå°±æ¯ä¸ºäºè½æé«ç¨åºçæ§è¡æçæé«ç¨åºè¿è¡é度ï¼ä½æ¯å¹¶åç¼ç¨å¹¶ä¸æ»æ¯è½æé«ç¨åºè¿è¡é度çï¼èä¸å¹¶åç¼ç¨å¯è½ä¼éå°å¾å¤é®é¢ï¼æ¯å¦ï¼å
åæ³æ¼ãæ»éã线ç¨ä¸å®å
¨ççã
### 说说线ç¨ççå½å¨æåç¶æ?
Java 线ç¨å¨è¿è¡ççå½å¨æä¸çæå®æ¶å»åªå¯è½å¤äºä¸é¢ 6 ç§ä¸åç¶æçå
¶ä¸ä¸ä¸ªç¶æï¼
- NEW: åå§ç¶æï¼çº¿ç¨è¢«åå»ºåºæ¥ä½æ²¡æè¢«è°ç¨ `start()` ã
- RUNNABLE: è¿è¡ç¶æï¼çº¿ç¨è¢«è°ç¨äº `start()`çå¾
è¿è¡çç¶æã
- BLOCKED ï¼é»å¡ç¶æï¼éè¦çå¾
ééæ¾ã
- WAITINGï¼çå¾
ç¶æï¼è¡¨ç¤ºè¯¥çº¿ç¨éè¦çå¾
å
¶ä»çº¿ç¨ååºä¸äºç¹å®å¨ä½ï¼éç¥æä¸æï¼ã
- TIME_WAITINGï¼è¶
æ¶çå¾
ç¶æï¼å¯ä»¥å¨æå®çæ¶é´åèªè¡è¿åè䏿¯å WAITING 飿 ·ä¸ç´çå¾
ã
- TERMINATEDï¼ç»æ¢ç¶æï¼è¡¨ç¤ºè¯¥çº¿ç¨å·²ç»è¿è¡å®æ¯ã
线ç¨å¨çå½å¨æä¸å¹¶ä¸æ¯åºå®å¤äºæä¸ä¸ªç¶æèæ¯éç代ç çæ§è¡å¨ä¸åç¶æä¹é´åæ¢ã
Java 线ç¨ç¶æåè¿å¾(徿ºï¼[æé |ãJava å¹¶åç¼ç¨çèºæ¯ãä¸å
³äºçº¿ç¨ç¶æçä¸å¤é误](https://mp.weixin.qq.com/s/UOrXql_LhOD8dhTq_EPI0w))ï¼

ç±ä¸å¾å¯ä»¥çåºï¼çº¿ç¨å建ä¹åå®å°å¤äº **NEWï¼æ°å»ºï¼** ç¶æï¼è°ç¨ `start()` æ¹æ³åå¼å§è¿è¡ï¼çº¿ç¨è¿æ¶åå¤äº **READYï¼å¯è¿è¡ï¼** ç¶æãå¯è¿è¡ç¶æç线ç¨è·å¾äº CPU æ¶é´çï¼timesliceï¼åå°±å¤äº **RUNNINGï¼è¿è¡ï¼** ç¶æã
> 卿ä½ç³»ç»å±é¢ï¼çº¿ç¨æ READY å RUNNING ç¶æï¼èå¨ JVM å±é¢ï¼åªè½çå° RUNNABLE ç¶æï¼å¾æºï¼[HowToDoInJava](https://howtodoinJava.com/ "HowToDoInJava")ï¼[Java Thread Life Cycle and Thread States](https://howtodoinJava.com/Java/multi-threading/Java-thread-life-cycle-and-thread-states/ "Java Thread Life Cycle and Thread States")ï¼ï¼æä»¥ Java ç³»ç»ä¸è¬å°è¿ä¸¤ä¸ªç¶æç»ç§°ä¸º **RUNNABLEï¼è¿è¡ä¸ï¼** ç¶æ ã
>
> **为ä»ä¹ JVM 没æåºåè¿ä¸¤ç§ç¶æå¢ï¼** ï¼æèªï¼[Java 线ç¨è¿è¡æä¹æç¬¬å
ç§ç¶æï¼ - Dawell çåç](https://www.zhihu.com/question/56494969/answer/154053599) ï¼ ç°å¨çæ¶åï¼time-sharingï¼å¤ä»»å¡ï¼multi-taskï¼æä½ç³»ç»æ¶æé叏齿¯ç¨æè°çâæ¶é´åçï¼time quantum or time sliceï¼âæ¹å¼è¿è¡æ¢å å¼ï¼preemptiveï¼è½®è½¬è°åº¦ï¼round-robin å¼ï¼ãè¿ä¸ªæ¶é´åçé常æ¯å¾å°çï¼ä¸ä¸ªçº¿ç¨ä¸æ¬¡æå¤åªè½å¨ CPU ä¸è¿è¡æ¯å¦ 10-20ms çæ¶é´ï¼æ¤æ¶å¤äº running ç¶æï¼ï¼ä¹å³å¤§æ¦åªæ 0.01 ç§è¿ä¸éçº§ï¼æ¶é´çç¨åå°±è¦è¢«åæ¢ä¸æ¥æ¾å
¥è°åº¦éåçæ«å°¾çå¾
忬¡è°åº¦ãï¼ä¹å³åå° ready ç¶æï¼ã线ç¨åæ¢ç妿¤ä¹å¿«ï¼åºåè¿ä¸¤ç§ç¶æå°±æ²¡ä»ä¹æä¹äºã

- å½çº¿ç¨æ§è¡ `wait()`æ¹æ³ä¹åï¼çº¿ç¨è¿å
¥ **WAITINGï¼çå¾
ï¼** ç¶æãè¿å
¥çå¾
ç¶æç线ç¨éè¦ä¾é å
¶ä»çº¿ç¨çéç¥æè½å¤è¿åå°è¿è¡ç¶æã
- **TIMED_WAITING(è¶
æ¶çå¾
)** ç¶æç¸å½äºå¨çå¾
ç¶æçåºç¡ä¸å¢å äºè¶
æ¶éå¶ï¼æ¯å¦éè¿ `sleepï¼long millisï¼`æ¹æ³æ `waitï¼long millisï¼`æ¹æ³å¯ä»¥å°çº¿ç¨ç½®äº TIMED_WAITING ç¶æãå½è¶
æ¶æ¶é´ç»æåï¼çº¿ç¨å°ä¼è¿åå° RUNNABLE ç¶æã
- å½çº¿ç¨è¿å
¥ `synchronized` æ¹æ³/åæè
è°ç¨ `wait` åï¼è¢« `notify`ï¼éæ°è¿å
¥ `synchronized` æ¹æ³/åï¼ä½æ¯é被å
¶å®çº¿ç¨å æï¼è¿ä¸ªæ¶å线ç¨å°±ä¼è¿å
¥ **BLOCKEDï¼é»å¡ï¼** ç¶æã
- 线ç¨å¨æ§è¡å®äº `run()`æ¹æ³ä¹åå°ä¼è¿å
¥å° **TERMINATEDï¼ç»æ¢ï¼** ç¶æã
ç¸å
³é
读ï¼[线ç¨çå ç§ç¶æä½ ççäºè§£ä¹ï¼](https://mp.weixin.qq.com/s/R5MrTsWvk9McFSQ7bS0W2w) ã
### ä»ä¹æ¯ä¸ä¸æåæ¢?
线ç¨å¨æ§è¡è¿ç¨ä¸ä¼æèªå·±çè¿è¡æ¡ä»¶åç¶æï¼ä¹ç§°ä¸ä¸æï¼ï¼æ¯å¦ä¸ææè¯´å°è¿çç¨åºè®¡æ°å¨ï¼æ ä¿¡æ¯çãå½åºç°å¦ä¸æ
åµçæ¶åï¼çº¿ç¨ä¼ä»å ç¨ CPU ç¶æä¸éåºã
- 主å¨è®©åº CPUï¼æ¯å¦è°ç¨äº `sleep()`, `wait()` çã
- æ¶é´çç¨å®ï¼å 为æä½ç³»ç»è¦é²æ¢ä¸ä¸ªçº¿ç¨æè
è¿ç¨é¿æ¶é´å ç¨ CPU 导è´å
¶ä»çº¿ç¨æè
è¿ç¨é¥¿æ»ã
- è°ç¨äºé»å¡ç±»åçç³»ç»ä¸æï¼æ¯å¦è¯·æ± IOï¼çº¿ç¨è¢«é»å¡ã
- è¢«ç»æ¢æç»æè¿è¡
è¿å
¶ä¸åä¸ç§é½ä¼åç线ç¨åæ¢ï¼çº¿ç¨åæ¢æå³çéè¦ä¿åå½å线ç¨çä¸ä¸æï¼çå¾
线ç¨ä¸æ¬¡å ç¨ CPU çæ¶åæ¢å¤ç°åºãå¹¶å è½½ä¸ä¸ä¸ªå°è¦å ç¨ CPU ç线ç¨ä¸ä¸æãè¿å°±æ¯æè°ç **ä¸ä¸æåæ¢**ã
ä¸ä¸æåæ¢æ¯ç°ä»£æä½ç³»ç»çåºæ¬åè½ï¼å å
¶æ¯æ¬¡éè¦ä¿åä¿¡æ¯æ¢å¤ä¿¡æ¯ï¼è¿å°ä¼å ç¨ CPUï¼å
åçç³»ç»èµæºè¿è¡å¤çï¼ä¹å°±æå³çæç伿ä¸å®æèï¼å¦æé¢ç¹åæ¢å°±ä¼é ææ´ä½æçä½ä¸ã
### ä»ä¹æ¯çº¿ç¨æ»é?å¦ä½é¿å
æ»é?
#### 认è¯çº¿ç¨æ»é
çº¿ç¨æ»éæè¿°çæ¯è¿æ ·ä¸ç§æ
åµï¼å¤ä¸ªçº¿ç¨åæ¶è¢«é»å¡ï¼å®ä»¬ä¸çä¸ä¸ªæè
å
¨é¨é½å¨çå¾
æä¸ªèµæºè¢«éæ¾ãç±äºçº¿ç¨è¢«æ éæå°é»å¡ï¼å æ¤ç¨åºä¸å¯è½æ£å¸¸ç»æ¢ã
å¦ä¸å¾æç¤ºï¼çº¿ç¨ A ææèµæº 2ï¼çº¿ç¨ B ææèµæº 1ï¼ä»ä»¬åæ¶é½æ³ç³è¯·å¯¹æ¹çèµæºï¼æä»¥è¿ä¸¤ä¸ªçº¿ç¨å°±ä¼äºç¸çå¾
èè¿å
¥æ»éç¶æã

ä¸é¢éè¿ä¸ä¸ªä¾åæ¥è¯´æçº¿ç¨æ»é,ä»£ç æ¨¡æäºä¸å¾çæ»éçæ
åµ (ä»£ç æ¥æºäºãå¹¶åç¼ç¨ä¹ç¾ã)ï¼
```java
public class DeadLockDemo {
private static Object resource1 = new Object();//èµæº 1
private static Object resource2 = new Object();//èµæº 2
public static void main(String[] args) {
new Thread(() -> {
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
}
}
}, "çº¿ç¨ 1").start();
new Thread(() -> {
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource1");
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
}
}
}, "çº¿ç¨ 2").start();
}
}
```
Output
```
Thread[çº¿ç¨ 1,5,main]get resource1
Thread[çº¿ç¨ 2,5,main]get resource2
Thread[çº¿ç¨ 1,5,main]waiting get resource2
Thread[çº¿ç¨ 2,5,main]waiting get resource1
```
çº¿ç¨ A éè¿ `synchronized (resource1)` è·å¾ `resource1` ççè§å¨éï¼ç¶åéè¿`Thread.sleep(1000);`è®©çº¿ç¨ A ä¼ç 1s ä¸ºçæ¯è®©çº¿ç¨ B å¾å°æ§è¡ç¶åè·åå° resource2 ççè§å¨éãçº¿ç¨ A åçº¿ç¨ B ä¼ç ç»æäºé½å¼å§ä¼å¾è¯·æ±è·å对æ¹çèµæºï¼ç¶åè¿ä¸¤ä¸ªçº¿ç¨å°±ä¼é·å
¥äºç¸çå¾
çç¶æï¼è¿ä¹å°±äº§çäºæ»éã
ä¸é¢çä¾å符åäº§çæ»éçå个å¿
è¦æ¡ä»¶ï¼
1. äºæ¥æ¡ä»¶ï¼è¯¥èµæºä»»æä¸ä¸ªæ¶å»åªç±ä¸ä¸ªçº¿ç¨å ç¨ã
2. 请æ±ä¸ä¿ææ¡ä»¶ï¼ä¸ä¸ªçº¿ç¨å 请æ±èµæºèé»å¡æ¶ï¼å¯¹å·²è·å¾çèµæºä¿æä¸æ¾ã
3. ä¸å¥å¤ºæ¡ä»¶:线ç¨å·²è·å¾çèµæºå¨æªä½¿ç¨å®ä¹åä¸è½è¢«å
¶ä»çº¿ç¨å¼ºè¡å¥å¤ºï¼åªæèªå·±ä½¿ç¨å®æ¯åæéæ¾èµæºã
4. 循ç¯çå¾
æ¡ä»¶:è¥å¹²çº¿ç¨ä¹é´å½¢æä¸ç§å¤´å°¾ç¸æ¥ç循ç¯çå¾
èµæºå
³ç³»ã
#### å¦ä½é¢é²åé¿å
çº¿ç¨æ»é?
**å¦ä½é¢é²æ»éï¼** ç ´åæ»éç产ççå¿
è¦æ¡ä»¶å³å¯ï¼
1. **ç ´å请æ±ä¸ä¿ææ¡ä»¶** ï¼ä¸æ¬¡æ§ç³è¯·ææçèµæºã
2. **ç ´åä¸å¥å¤ºæ¡ä»¶** ï¼å ç¨é¨åèµæºç线ç¨è¿ä¸æ¥ç³è¯·å
¶ä»èµæºæ¶ï¼å¦æç³è¯·ä¸å°ï¼å¯ä»¥ä¸»å¨éæ¾å®å æçèµæºã
3. **ç ´å循ç¯çå¾
æ¡ä»¶** ï¼é æåºç³è¯·èµæºæ¥é¢é²ãææä¸é¡ºåºç³è¯·èµæºï¼éæ¾èµæºåååºéæ¾ãç ´å循ç¯çå¾
æ¡ä»¶ã
**å¦ä½é¿å
æ»éï¼**
é¿å
æ»éå°±æ¯å¨èµæºåé
æ¶ï¼åå©äºç®æ³ï¼æ¯å¦é¶è¡å®¶ç®æ³ï¼å¯¹èµæºåé
è¿è¡è®¡ç®è¯ä¼°ï¼ä½¿å
¶è¿å
¥å®å
¨ç¶æã
> **å®å
¨ç¶æ** æçæ¯ç³»ç»è½å¤æç
§æç§çº¿ç¨æ¨è¿é¡ºåºï¼P1ãP2ãP3.....Pnï¼æ¥ä¸ºæ¯ä¸ªçº¿ç¨åé
æéèµæºï¼ç´å°æ»¡è¶³æ¯ä¸ªçº¿ç¨å¯¹èµæºçæå¤§éæ±ï¼ä½¿æ¯ä¸ªçº¿ç¨é½å¯é¡ºå©å®æãç§° `` åºå为å®å
¨åºåã
æä»¬å¯¹çº¿ç¨ 2 ç代ç ä¿®æ¹æä¸é¢è¿æ ·å°±ä¸ä¼äº§çæ»éäºã
```java
new Thread(() -> {
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
}
}
}, "çº¿ç¨ 2").start();
```
è¾åºï¼
```
Thread[çº¿ç¨ 1,5,main]get resource1
Thread[çº¿ç¨ 1,5,main]waiting get resource2
Thread[çº¿ç¨ 1,5,main]get resource2
Thread[çº¿ç¨ 2,5,main]get resource1
Thread[çº¿ç¨ 2,5,main]waiting get resource2
Thread[çº¿ç¨ 2,5,main]get resource2
Process finished with exit code 0
```
æä»¬åæä¸ä¸ä¸é¢ç代ç 为ä»ä¹é¿å
äºæ»éçåç?
çº¿ç¨ 1 é¦å
è·å¾å° resource1 ççè§å¨é,è¿æ¶åçº¿ç¨ 2 å°±è·åä¸å°äºãç¶åçº¿ç¨ 1 åå»è·å resource2 ççè§å¨éï¼å¯ä»¥è·åå°ãç¶åçº¿ç¨ 1 éæ¾äºå¯¹ resource1ãresource2 ççè§å¨éçå ç¨ï¼çº¿ç¨ 2 è·åå°å°±å¯ä»¥æ§è¡äºãè¿æ ·å°±ç ´åäºç ´å循ç¯çå¾
æ¡ä»¶ï¼å æ¤é¿å
äºæ»éã
### sleep() æ¹æ³å wait() æ¹æ³å¯¹æ¯
**å
±åç¹** ï¼ä¸¤è
é½å¯ä»¥æå线ç¨çæ§è¡ã
**åºå«** ï¼
- **`sleep()` æ¹æ³æ²¡æéæ¾éï¼è `wait()` æ¹æ³éæ¾äºé** ã
- `wait()` é常被ç¨äºçº¿ç¨é´äº¤äº/éä¿¡ï¼`sleep()`é常被ç¨äºæåæ§è¡ã
- `wait()` æ¹æ³è¢«è°ç¨åï¼çº¿ç¨ä¸ä¼èªå¨èéï¼éè¦å«ç线ç¨è°ç¨åä¸ä¸ªå¯¹è±¡ä¸ç `notify()`æè
`notifyAll()` æ¹æ³ã`sleep()`æ¹æ³æ§è¡å®æåï¼çº¿ç¨ä¼èªå¨èéï¼æè
ä¹å¯ä»¥ä½¿ç¨ `wait(long timeout)` è¶
æ¶å线ç¨ä¼èªå¨èéã
- `sleep()` æ¯ `Thread` ç±»çéææ¬å°æ¹æ³ï¼`wait()` 忝 `Object` ç±»çæ¬å°æ¹æ³ã为ä»ä¹è¿æ ·è®¾è®¡å¢ï¼
### 为ä»ä¹ wait() æ¹æ³ä¸å®ä¹å¨ Thread ä¸ï¼
`wait()` æ¯è®©è·å¾å¯¹è±¡éç线ç¨å®ç°çå¾
ï¼ä¼èªå¨éæ¾å½å线ç¨å æç对象éãæ¯ä¸ªå¯¹è±¡ï¼`Object`ï¼é½æ¥æå¯¹è±¡éï¼æ¢ç¶è¦éæ¾å½å线ç¨å æç对象é并让å
¶è¿å
¥ WAITING ç¶æï¼èªç¶æ¯è¦æä½å¯¹åºç对象ï¼`Object`ï¼èéå½åç线ç¨ï¼`Thread`ï¼ã
类似çé®é¢ï¼**为ä»ä¹ `sleep()` æ¹æ³å®ä¹å¨ `Thread` ä¸ï¼**
å 为 `sleep()` æ¯è®©å½åçº¿ç¨æåæ§è¡ï¼ä¸æ¶åå°å¯¹è±¡ç±»ï¼ä¹ä¸éè¦è·å¾å¯¹è±¡éã
### å¯ä»¥ç´æ¥è°ç¨ Thread ç±»ç run æ¹æ³åï¼
è¿æ¯å¦ä¸ä¸ªé常ç»å
¸ç Java å¤çº¿ç¨é¢è¯é®é¢ï¼èä¸å¨é¢è¯ä¸ä¼ç»å¸¸è¢«é®å°ãå¾ç®åï¼ä½æ¯å¾å¤äººé½ä¼çä¸ä¸æ¥ï¼
new ä¸ä¸ª `Thread`ï¼çº¿ç¨è¿å
¥äºæ°å»ºç¶æãè°ç¨ `start()`æ¹æ³ï¼ä¼å¯å¨ä¸ä¸ªçº¿ç¨å¹¶ä½¿çº¿ç¨è¿å
¥äºå°±ç»ªç¶æï¼å½åé
å°æ¶é´çåå°±å¯ä»¥å¼å§è¿è¡äºã `start()` 伿§è¡çº¿ç¨çç¸åºåå¤å·¥ä½ï¼ç¶åèªå¨æ§è¡ `run()` æ¹æ³çå
容ï¼è¿æ¯çæ£çå¤çº¿ç¨å·¥ä½ã 使¯ï¼ç´æ¥æ§è¡ `run()` æ¹æ³ï¼ä¼æ `run()` æ¹æ³å½æä¸ä¸ª main 线ç¨ä¸çæ®éæ¹æ³å»æ§è¡ï¼å¹¶ä¸ä¼å¨æä¸ªçº¿ç¨ä¸æ§è¡å®ï¼æä»¥è¿å¹¶ä¸æ¯å¤çº¿ç¨å·¥ä½ã
**æ»ç»ï¼ è°ç¨ `start()` æ¹æ³æ¹å¯å¯å¨çº¿ç¨å¹¶ä½¿çº¿ç¨è¿å
¥å°±ç»ªç¶æï¼ç´æ¥æ§è¡ `run()` æ¹æ³çè¯ä¸ä¼ä»¥å¤çº¿ç¨çæ¹å¼æ§è¡ã**
### JMM(Java Memory Model)
JMMï¼Java å
忍¡åï¼ç¸å
³çé®é¢æ¯è¾å¤ï¼ä¹æ¯è¾éè¦ï¼äºæ¯æåç¬æ½äºä¸ç¯æç« æ¥æ»ç» JMM ç¸å
³çç¥è¯ç¹åé®é¢ï¼ [JMMï¼Java å
忍¡åï¼è¯¦è§£](https://javaguide.cn/java/concurrent/jmm.html) ã
### volatile å
³é®å
#### å¦ä½ä¿è¯åéçå¯è§æ§ï¼
å¨ Java ä¸ï¼`volatile` å
³é®åå¯ä»¥ä¿è¯åéçå¯è§æ§ï¼å¦ææä»¬å°åé声æä¸º **`volatile`** ï¼è¿å°±æç¤º JVMï¼è¿ä¸ªå鿝å
±äº«ä¸ä¸ç¨³å®çï¼æ¯æ¬¡ä½¿ç¨å®é½å°ä¸»åä¸è¿è¡è¯»åã


`volatile` å
³é®åå
¶å®å¹¶éæ¯ Java è¯è¨ç¹æçï¼å¨ C è¯è¨é乿ï¼å®æåå§çæä¹å°±æ¯ç¦ç¨ CPU ç¼åã妿æä»¬å°ä¸ä¸ªåéä½¿ç¨ `volatile` 修饰ï¼è¿å°±æç¤º ç¼è¯å¨ï¼è¿ä¸ªå鿝å
±äº«ä¸ä¸ç¨³å®çï¼æ¯æ¬¡ä½¿ç¨å®é½å°ä¸»åä¸è¿è¡è¯»åã
`volatile` å
³é®åè½ä¿è¯æ°æ®çå¯è§æ§ï¼ä½ä¸è½ä¿è¯æ°æ®çååæ§ã`synchronized` å
³é®å两è
é½è½ä¿è¯ã
#### å¦ä½ç¦æ¢æä»¤éæåºï¼
**å¨ Java ä¸ï¼`volatile` å
³é®åé¤äºå¯ä»¥ä¿è¯åéçå¯è§æ§ï¼è¿æä¸ä¸ªéè¦çä½ç¨å°±æ¯é²æ¢ JVM çæä»¤éæåºã** 妿æä»¬å°åé声æä¸º **`volatile`** ï¼å¨å¯¹è¿ä¸ªåéè¿è¡è¯»åæä½çæ¶åï¼ä¼éè¿æå
¥ç¹å®ç **å
åå±é** çæ¹å¼æ¥ç¦æ¢æä»¤éæåºã
å¨ Java ä¸ï¼`Unsafe` ç±»æä¾äºä¸ä¸ªå¼ç®±å³ç¨çå
åå±éç¸å
³çæ¹æ³ï¼å±è½äºæä½ç³»ç»åºå±çå·®å¼ï¼
```java
public native void loadFence();
public native void storeFence();
public native void fullFence();
```
çè®ºä¸æ¥è¯´ï¼ä½ éè¿è¿ä¸ªä¸ä¸ªæ¹æ³ä¹å¯ä»¥å®ç°å`volatile`ç¦æ¢éæåºä¸æ ·çææï¼åªæ¯ä¼éº»ç¦ä¸äºã
ä¸é¢æä»¥ä¸ä¸ªå¸¸è§çé¢è¯é¢ä¸ºä¾è®²è§£ä¸ä¸ `volatile` å
³é®åç¦æ¢æä»¤éæåºçææã
é¢è¯ä¸é¢è¯å®ç»å¸¸ä¼è¯´ï¼âå便¨¡å¼äºè§£åï¼æ¥ç»ææåä¸ä¸ï¼ç»æè§£éä¸ä¸å鿣éªéæ¹å¼å®ç°å便¨¡å¼çåçåï¼â
**åéæ ¡éªéå®ç°å¯¹è±¡åä¾ï¼çº¿ç¨å®å
¨ï¼** ï¼
```java
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
//å
å¤æå¯¹è±¡æ¯å¦å·²ç»å®ä¾è¿ï¼æ²¡æå®ä¾åè¿æè¿å
¥å é代ç
if (uniqueInstance == null) {
//类对象å é
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
```
`uniqueInstance` éç¨ `volatile` å
³é®åä¿®é¥°ä¹æ¯å¾æå¿
è¦çï¼ `uniqueInstance = new Singleton();` è¿æ®µä»£ç å
¶å®æ¯åä¸ºä¸æ¥æ§è¡ï¼
1. 为 `uniqueInstance` åé
å
å空é´
2. åå§å `uniqueInstance`
3. å° `uniqueInstance` æååé
çå
åå°å
使¯ç±äº JVM å
·ææä»¤éæçç¹æ§ï¼æ§è¡é¡ºåºæå¯è½åæ 1->3->2ãæä»¤éæå¨å线ç¨ç¯å¢ä¸ä¸ä¼åºç°é®é¢ï¼ä½æ¯å¨å¤çº¿ç¨ç¯å¢ä¸ä¼å¯¼è´ä¸ä¸ªçº¿ç¨è·å¾è¿æ²¡æåå§åçå®ä¾ãä¾å¦ï¼çº¿ç¨ T1 æ§è¡äº 1 å 3ï¼æ¤æ¶ T2 è°ç¨ `getUniqueInstance`() ååç° `uniqueInstance` ä¸ä¸ºç©ºï¼å æ¤è¿å `uniqueInstance`ï¼ä½æ¤æ¶ `uniqueInstance` è¿æªè¢«åå§åã
#### volatile å¯ä»¥ä¿è¯ååæ§ä¹ï¼
**`volatile` å
³é®åè½ä¿è¯åéçå¯è§æ§ï¼ä½ä¸è½ä¿è¯å¯¹åéçæä½æ¯ååæ§çã**
æä»¬éè¿ä¸é¢ç代ç å³å¯è¯æï¼
```java
/**
* 微信æ JavaGuide åå¤"é¢è¯çªå»"å³å¯å
è´¹é¢å个人ååç Java é¢è¯æå
*
* @author Guideå¥
* @date 2022/08/03 13:40
**/
public class VolatoleAtomicityDemo {
public volatile static int inc = 0;
public void increase() {
inc++;
}
public static void main(String[] args) throws InterruptedException {
ExecutorService threadPool = Executors.newFixedThreadPool(5);
VolatoleAtomicityDemo volatoleAtomicityDemo = new VolatoleAtomicityDemo();
for (int i = 0; i < 5; i++) {
threadPool.execute(() -> {
for (int j = 0; j < 500; j++) {
volatoleAtomicityDemo.increase();
}
});
}
// çå¾
1.5ç§ï¼ä¿è¯ä¸é¢ç¨åºæ§è¡å®æ
Thread.sleep(1500);
System.out.println(inc);
threadPool.shutdown();
}
}
```
æ£å¸¸æ
åµä¸ï¼è¿è¡ä¸é¢ç代ç çåºè¾åº `2500`ãä½ä½ çæ£è¿è¡äºä¸é¢ç代ç ä¹åï¼ä½ ä¼åç°æ¯æ¬¡è¾åºç»æé½å°äº `2500`ã
为ä»ä¹ä¼åºç°è¿ç§æ
åµå¢ï¼ä¸æ¯è¯´å¥½äºï¼`volatile` å¯ä»¥ä¿è¯åéçå¯è§æ§åï¼
ä¹å°±æ¯è¯´ï¼å¦æ `volatile` è½ä¿è¯ `inc++` æä½çååæ§çè¯ãæ¯ä¸ªçº¿ç¨ä¸å¯¹ `inc` åéèªå¢å®ä¹åï¼å
¶ä»çº¿ç¨å¯ä»¥ç«å³çå°ä¿®æ¹åçå¼ã5 个线ç¨åå«è¿è¡äº 500 次æä½ï¼é£ä¹æç» inc çå¼åºè¯¥æ¯ 5\*500=2500ã
å¾å¤äººä¼è¯¯è®¤ä¸ºèªå¢æä½ `inc++` æ¯ååæ§çï¼å®é
ä¸ï¼`inc++` å
¶å®æ¯ä¸ä¸ªå¤åæä½ï¼å
æ¬ä¸æ¥ï¼
1. 读å inc çå¼ã
2. 对 inc å 1ã
3. å° inc çå¼ååå
åã
`volatile` æ¯æ æ³ä¿è¯è¿ä¸ä¸ªæä½æ¯å
·æååæ§çï¼æå¯è½å¯¼è´ä¸é¢è¿ç§æ
åµåºç°ï¼
1. çº¿ç¨ 1 对 `inc` è¿è¡è¯»åæä½ä¹åï¼è¿æªå¯¹å
¶è¿è¡ä¿®æ¹ãçº¿ç¨ 2 å读åäº `inc`çå¼å¹¶å¯¹å
¶è¿è¡ä¿®æ¹ï¼+1ï¼ï¼åå°`inc` çå¼ååå
åã
2. çº¿ç¨ 2 æä½å®æ¯åï¼çº¿ç¨ 1 对 `inc`çå¼è¿è¡ä¿®æ¹ï¼+1ï¼ï¼åå°`inc` çå¼ååå
åã
è¿ä¹å°±å¯¼è´ä¸¤ä¸ªçº¿ç¨åå«å¯¹ `inc` è¿è¡äºä¸æ¬¡èªå¢æä½åï¼`inc` å®é
ä¸åªå¢å äº 1ã
å
¶å®ï¼å¦ææ³è¦ä¿è¯ä¸é¢ç代ç è¿è¡æ£ç¡®ä¹é常ç®åï¼å©ç¨ `synchronized` ã`Lock`æè
`AtomicInteger`é½å¯ä»¥ã
ä½¿ç¨ `synchronized` æ¹è¿ï¼
```java
public synchronized void increase() {
inc++;
}
```
ä½¿ç¨ `AtomicInteger` æ¹è¿ï¼
```java
public AtomicInteger inc = new AtomicInteger();
public void increase() {
inc.getAndIncrement();
}
```
ä½¿ç¨ `ReentrantLock` æ¹è¿ï¼
```java
Lock lock = new ReentrantLock();
public void increase() {
lock.lock();
try {
inc++;
} finally {
lock.unlock();
}
}
```
### synchronized å
³é®å
#### 说ä¸è¯´èªå·±å¯¹äº synchronized å
³é®åçäºè§£
`synchronized` ç¿»è¯æä¸ææ¯åæ¥ççææï¼ä¸»è¦è§£å³çæ¯å¤ä¸ªçº¿ç¨ä¹é´è®¿é®èµæºç忥æ§ï¼å¯ä»¥ä¿è¯è¢«å®ä¿®é¥°çæ¹æ³æè
代ç åå¨ä»»ææ¶å»åªè½æä¸ä¸ªçº¿ç¨æ§è¡ã
å¨ Java æ©æçæ¬ä¸ï¼`synchronized` å±äº **éé级é**ï¼æçä½ä¸ã å 为çè§å¨éï¼monitorï¼æ¯ä¾èµäºåºå±çæä½ç³»ç»ç `Mutex Lock` æ¥å®ç°çï¼Java ççº¿ç¨æ¯æ å°å°æä½ç³»ç»çåç线ç¨ä¹ä¸çãå¦æè¦æèµ·æè
å¤éä¸ä¸ªçº¿ç¨ï¼é½éè¦æä½ç³»ç»å¸®å¿å®æï¼èæä½ç³»ç»å®ç°çº¿ç¨ä¹é´ç忢æ¶éè¦ä»ç¨æ·æè½¬æ¢å°å
æ ¸æï¼è¿ä¸ªç¶æä¹é´ç转æ¢éè¦ç¸å¯¹æ¯è¾é¿çæ¶é´ï¼æ¶é´ææ¬ç¸å¯¹è¾é«ã
ä¸è¿ï¼å¨ Java 6 ä¹åï¼Java 宿¹å¯¹ä» JVM å±é¢å¯¹ `synchronized` è¾å¤§ä¼åï¼æä»¥ç°å¨ç `synchronized` éæçä¹ä¼åå¾å¾ä¸éäºãJDK1.6 对éçå®ç°å¼å
¥äºå¤§éçä¼åï¼å¦èªæéãéåºæ§èªæéãéæ¶é¤ãéç²åãååéãè½»é级éçææ¯æ¥åå°éæä½çå¼éãæä»¥ï¼ä½ ä¼åç°ç®åçè¯ï¼ä¸è®ºæ¯åç§å¼æºæ¡æ¶è¿æ¯ JDK æºç é½å¤§é使ç¨äº `synchronized` å
³é®åã
#### å¦ä½ä½¿ç¨ synchronized å
³é®åï¼
synchronized å
³é®åæä¸»è¦çä¸ç§ä½¿ç¨æ¹å¼ï¼
1. 修饰å®ä¾æ¹æ³
2. ä¿®é¥°éææ¹æ³
3. 修饰代ç å
**1ã修饰å®ä¾æ¹æ³** ï¼éå½å对象å®ä¾ï¼
ç»å½å对象å®ä¾å éï¼è¿å
¥åæ¥ä»£ç åè¦è·å¾ **å½å对象å®ä¾çé** ã
```java
synchronized void method() {
//ä¸å¡ä»£ç
}
```
**2ãä¿®é¥°éææ¹æ³** ï¼éå½åç±»ï¼
ç»å½åç±»å éï¼ä¼ä½ç¨äºç±»çææå¯¹è±¡å®ä¾ ï¼è¿å
¥åæ¥ä»£ç åè¦è·å¾ **å½å class çé**ã
è¿æ¯å ä¸ºéææåä¸å±äºä»»ä½ä¸ä¸ªå®ä¾å¯¹è±¡ï¼å½æ´ä¸ªç±»ææï¼ä¸ä¾èµäºç±»çç¹å®å®ä¾ï¼è¢«ç±»çææå®ä¾å
±äº«ã
```java
synchronized static void method() {
//ä¸å¡ä»£ç
}
```
éæ `synchronized` æ¹æ³åééæ `synchronized` æ¹æ³ä¹é´çè°ç¨äºæ¥ä¹ï¼ä¸äºæ¥ï¼å¦æä¸ä¸ªçº¿ç¨ A è°ç¨ä¸ä¸ªå®ä¾å¯¹è±¡çééæ `synchronized` æ¹æ³ï¼èçº¿ç¨ B éè¦è°ç¨è¿ä¸ªå®ä¾å¯¹è±¡æå±ç±»çéæ `synchronized` æ¹æ³ï¼æ¯å
许çï¼ä¸ä¼åçäºæ¥ç°è±¡ï¼å 为访é®éæ `synchronized` æ¹æ³å ç¨ç鿝å½åç±»çéï¼è访é®ééæ `synchronized` æ¹æ³å ç¨ç鿝å½åå®ä¾å¯¹è±¡éã
**3ã修饰代ç å** ï¼éæå®å¯¹è±¡/ç±»ï¼
对æ¬å·éæå®ç对象/ç±»å éï¼
- `synchronized(object)` 表示è¿å
¥åæ¥ä»£ç åºåè¦è·å¾ **ç»å®å¯¹è±¡çé**ã
- `synchronized(ç±».class)` 表示è¿å
¥åæ¥ä»£ç åè¦è·å¾ **ç»å® Class çé**
```java
synchronized(this) {
//ä¸å¡ä»£ç
}
```
**æ»ç»ï¼**
- `synchronized` å
³é®åå å° `static` éææ¹æ³å `synchronized(class)` 代ç åä¸é½æ¯æ¯ç» Class ç±»ä¸éï¼
- `synchronized` å
³é®åå å°å®ä¾æ¹æ³ä¸æ¯ç»å¯¹è±¡å®ä¾ä¸éï¼
- å°½éä¸è¦ä½¿ç¨ `synchronized(String a)` å 为 JVM ä¸ï¼åç¬¦ä¸²å¸¸éæ± å
·æç¼ååè½ã
#### æé æ¹æ³å¯ä»¥ä½¿ç¨ synchronized å
³é®å修饰ä¹ï¼
å
说ç»è®ºï¼**æé æ¹æ³ä¸è½ä½¿ç¨ synchronized å
³é®å修饰ã**
æé æ¹æ³æ¬èº«å°±å±äºçº¿ç¨å®å
¨çï¼ä¸åå¨åæ¥çæé æ¹æ³ä¸è¯´ã
#### 讲ä¸ä¸ synchronized å
³é®åçåºå±åç
synchronized å
³é®ååºå±åçå±äº JVM å±é¢ã
###### synchronized 忥è¯å¥åçæ
åµ
```java
public class SynchronizedDemo {
public void method() {
synchronized (this) {
System.out.println("synchronized 代ç å");
}
}
}
```
éè¿ JDK èªå¸¦ç `javap` å½ä»¤æ¥ç `SynchronizedDemo` ç±»çç¸å
³åèç ä¿¡æ¯ï¼é¦å
忢å°ç±»ç对åºç®å½æ§è¡ `javac SynchronizedDemo.java` å½ä»¤çæç¼è¯åç .class æä»¶ï¼ç¶åæ§è¡`javap -c -s -v -l SynchronizedDemo.class`ã

ä»ä¸é¢æä»¬å¯ä»¥çåºï¼**`synchronized` 忥è¯å¥åçå®ç°ä½¿ç¨çæ¯ `monitorenter` å `monitorexit` æä»¤ï¼å
¶ä¸ `monitorenter` æä»¤æå忥代ç åçå¼å§ä½ç½®ï¼`monitorexit` æä»¤åææåæ¥ä»£ç åçç»æä½ç½®ã**
彿§è¡ `monitorenter` æä»¤æ¶ï¼çº¿ç¨è¯å¾è·åéä¹å°±æ¯è·å **对象çè§å¨ `monitor`** çæææã
> å¨ Java èææº(HotSpot)ä¸ï¼Monitor æ¯åºäº C++å®ç°çï¼ç±[ObjectMonitor](https://github.com/openjdk-mirror/jdk7u-hotspot/blob/50bdefc3afe944ca74c3093e7448d6b889cd20d1/src/share/vm/runtime/objectMonitor.cpp)å®ç°çãæ¯ä¸ªå¯¹è±¡ä¸é½å
ç½®äºä¸ä¸ª `ObjectMonitor`对象ã
>
> å¦å¤ï¼`wait/notify`çæ¹æ³ä¹ä¾èµäº`monitor`对象ï¼è¿å°±æ¯ä¸ºä»ä¹åªæå¨åæ¥çåæè
æ¹æ³ä¸æè½è°ç¨`wait/notify`çæ¹æ³ï¼å¦å伿åº`java.lang.IllegalMonitorStateException`çå¼å¸¸çåå ã
卿§è¡`monitorenter`æ¶ï¼ä¼å°è¯è·å对象çéï¼å¦æéç计æ°å¨ä¸º 0 å表示éå¯ä»¥è¢«è·åï¼è·ååå°é计æ°å¨è®¾ä¸º 1 ä¹å°±æ¯å 1ã

对象éççæ¥æè
çº¿ç¨æå¯ä»¥æ§è¡ `monitorexit` æä»¤æ¥éæ¾éã卿§è¡ `monitorexit` æä»¤åï¼å°é计æ°å¨è®¾ä¸º 0ï¼è¡¨æéè¢«éæ¾ï¼å
¶ä»çº¿ç¨å¯ä»¥å°è¯è·åéã

妿è·å对象é失败ï¼é£å½å线ç¨å°±è¦é»å¡çå¾
ï¼ç´å°é被å¦å¤ä¸ä¸ªçº¿ç¨éæ¾ä¸ºæ¢ã
###### synchronized ä¿®é¥°æ¹æ³ççæ
åµ
```java
public class SynchronizedDemo2 {
public synchronized void method() {
System.out.println("synchronized æ¹æ³");
}
}
```

`synchronized` ä¿®é¥°çæ¹æ³å¹¶æ²¡æ `monitorenter` æä»¤å `monitorexit` æä»¤ï¼åå¾ä»£ä¹çç¡®å®æ¯ `ACC_SYNCHRONIZED` æ è¯ï¼è¯¥æ è¯ææäºè¯¥æ¹æ³æ¯ä¸ä¸ªåæ¥æ¹æ³ãJVM éè¿è¯¥ `ACC_SYNCHRONIZED` è®¿é®æ å¿æ¥è¾¨å«ä¸ä¸ªæ¹æ³æ¯å¦å£°æä¸ºåæ¥æ¹æ³ï¼ä»èæ§è¡ç¸åºç忥è°ç¨ã
妿æ¯å®ä¾æ¹æ³ï¼JVM ä¼å°è¯è·åå®ä¾å¯¹è±¡çéã妿æ¯éææ¹æ³ï¼JVM ä¼å°è¯è·åå½å class çéã
###### æ»ç»
`synchronized` 忥è¯å¥åçå®ç°ä½¿ç¨çæ¯ `monitorenter` å `monitorexit` æä»¤ï¼å
¶ä¸ `monitorenter` æä»¤æå忥代ç åçå¼å§ä½ç½®ï¼`monitorexit` æä»¤åææåæ¥ä»£ç åçç»æä½ç½®ã
`synchronized` ä¿®é¥°çæ¹æ³å¹¶æ²¡æ `monitorenter` æä»¤å `monitorexit` æä»¤ï¼åå¾ä»£ä¹çç¡®å®æ¯ `ACC_SYNCHRONIZED` æ è¯ï¼è¯¥æ è¯ææäºè¯¥æ¹æ³æ¯ä¸ä¸ªåæ¥æ¹æ³ã
**ä¸è¿ä¸¤è
çæ¬è´¨é½æ¯å¯¹å¯¹è±¡çè§å¨ monitor çè·åã**
ç¸å
³æ¨èï¼[Java éä¸çº¿ç¨çé£äºäº - æèµææ¯å¢é](https://tech.youzan.com/javasuo-yu-xian-cheng-de-na-xie-shi/) ã
ð§ð» è¿é¶ä¸ä¸ï¼å¦æä½åçå°ä¼ä¼´å¯ä»¥æ½æ¶é´è¯¦ç»ç ç©¶ä¸ä¸å¯¹è±¡çè§å¨ `monitor`ã
#### JDK1.6 ä¹åç synchronized å
³é®ååºå±åäºåªäºä¼åï¼
JDK1.6 对éçå®ç°å¼å
¥äºå¤§éçä¼åï¼å¦ååéãè½»é级éãèªæéãéåºæ§èªæéãéæ¶é¤ãéç²åçææ¯æ¥åå°éæä½çå¼éã
é主è¦åå¨åç§ç¶æï¼ä¾æ¬¡æ¯ï¼æ éç¶æãååéç¶æãè½»é级éç¶æãéé级éç¶æï¼ä»ä»¬ä¼éçç«äºçæ¿çè鿏åçº§ãæ³¨æéå¯ä»¥å级ä¸å¯é级ï¼è¿ç§çç¥æ¯ä¸ºäºæé«è·å¾éåéæ¾éçæçã
å
³äºè¿å ç§ä¼åç详ç»ä¿¡æ¯å¯ä»¥æ¥çä¸é¢è¿ç¯æç« ï¼[Java6 å以ä¸çæ¬å¯¹ synchronized çä¼å](https://www.cnblogs.com/wuqinglong/p/9945618.html)
#### synchronized å volatile çåºå«ï¼
`synchronized` å
³é®åå `volatile` å
³é®åæ¯ä¸¤ä¸ªäºè¡¥çåå¨ï¼è䏿¯å¯¹ç«çåå¨ï¼
- `volatile` å
³é®åæ¯çº¿ç¨åæ¥çè½»é级å®ç°ï¼æä»¥ `volatile`æ§è½è¯å®æ¯`synchronized`å
³é®åè¦å¥½ ã使¯ `volatile` å
³é®ååªè½ç¨äºåéè `synchronized` å
³é®åå¯ä»¥ä¿®é¥°æ¹æ³ä»¥å代ç å ã
- `volatile` å
³é®åè½ä¿è¯æ°æ®çå¯è§æ§ï¼ä½ä¸è½ä¿è¯æ°æ®çååæ§ã`synchronized` å
³é®å两è
é½è½ä¿è¯ã
- `volatile`å
³é®å主è¦ç¨äºè§£å³åéå¨å¤ä¸ªçº¿ç¨ä¹é´çå¯è§æ§ï¼è `synchronized` å
³é®åè§£å³çæ¯å¤ä¸ªçº¿ç¨ä¹é´è®¿é®èµæºç忥æ§ã
#### synchronized å ReentrantLock çåºå«
###### 两è
齿¯å¯éå
¥é
**âå¯éå
¥éâ** æçæ¯èªå·±å¯ä»¥å次è·åèªå·±çå
é¨éãæ¯å¦ä¸ä¸ªçº¿ç¨è·å¾äºæä¸ªå¯¹è±¡çéï¼æ¤æ¶è¿ä¸ªå¯¹è±¡éè¿æ²¡æéæ¾ï¼å½å
¶å次æ³è¦è·åè¿ä¸ªå¯¹è±¡çéçæ¶åè¿æ¯å¯ä»¥è·åçï¼å¦ææ¯ä¸å¯éå
¥éçè¯ï¼å°±ä¼é ææ»éãåä¸ä¸ªçº¿ç¨æ¯æ¬¡è·åéï¼éç计æ°å¨é½èªå¢ 1ï¼æä»¥è¦çå°éç计æ°å¨ä¸é为 0 æ¶æè½éæ¾éã
###### synchronized ä¾èµäº JVM è ReentrantLock ä¾èµäº API
`synchronized` æ¯ä¾èµäº JVM å®ç°çï¼å颿们ä¹è®²å°äº èææºå¢éå¨ JDK1.6 为 `synchronized` å
³é®åè¿è¡äºå¾å¤ä¼åï¼ä½æ¯è¿äºä¼å齿¯å¨èææºå±é¢å®ç°çï¼å¹¶æ²¡æç´æ¥æ´é²ç»æä»¬ã`ReentrantLock` æ¯ JDK å±é¢å®ç°çï¼ä¹å°±æ¯ API å±é¢ï¼éè¦ lock() å unlock() æ¹æ³é
å try/finally è¯å¥åæ¥å®æï¼ï¼æä»¥æä»¬å¯ä»¥éè¿æ¥çå®çæºä»£ç ï¼æ¥ç宿¯å¦ä½å®ç°çã
###### ReentrantLock æ¯ synchronized å¢å äºä¸äºé«çº§åè½
ç¸æ¯`synchronized`ï¼`ReentrantLock`å¢å äºä¸äºé«çº§åè½ãä¸»è¦æ¥è¯´ä¸»è¦æä¸ç¹ï¼
- **çå¾
å¯ä¸æ** : `ReentrantLock`æä¾äºä¸ç§è½å¤ä¸æçå¾
éç线ç¨çæºå¶ï¼éè¿ `lock.lockInterruptibly()` æ¥å®ç°è¿ä¸ªæºå¶ãä¹å°±æ¯è¯´æ£å¨çå¾
ç线ç¨å¯ä»¥éæ©æ¾å¼çå¾
ï¼æ¹ä¸ºå¤çå
¶ä»äºæ
ã
- **å¯å®ç°å
¬å¹³é** : `ReentrantLock`å¯ä»¥æå®æ¯å
¬å¹³éè¿æ¯éå
¬å¹³éãè`synchronized`åªè½æ¯éå
¬å¹³éãæè°çå
¬å¹³éå°±æ¯å
çå¾
ç线ç¨å
è·å¾éã`ReentrantLock`é»è®¤æ
嵿¯éå
¬å¹³çï¼å¯ä»¥éè¿ `ReentrantLock`ç±»ç`ReentrantLock(boolean fair)`æé æ¹æ³æ¥å¶å®æ¯å¦æ¯å
¬å¹³çã
- **å¯å®ç°éæ©æ§éç¥ï¼éå¯ä»¥ç»å®å¤ä¸ªæ¡ä»¶ï¼**: `synchronized`å
³é®åä¸`wait()`å`notify()`/`notifyAll()`æ¹æ³ç¸ç»åå¯ä»¥å®ç°çå¾
/éç¥æºå¶ã`ReentrantLock`ç±»å½ç¶ä¹å¯ä»¥å®ç°ï¼ä½æ¯éè¦åå©äº`Condition`æ¥å£ä¸`newCondition()`æ¹æ³ã
> `Condition`æ¯ JDK1.5 ä¹åææçï¼å®å
·æå¾å¥½ççµæ´»æ§ï¼æ¯å¦å¯ä»¥å®ç°å¤è·¯éç¥åè½ä¹å°±æ¯å¨ä¸ä¸ª`Lock`对象ä¸å¯ä»¥å建å¤ä¸ª`Condition`å®ä¾ï¼å³å¯¹è±¡çè§å¨ï¼ï¼**线ç¨å¯¹è±¡å¯ä»¥æ³¨å卿å®ç`Condition`ä¸ï¼ä»èå¯ä»¥æéæ©æ§çè¿è¡çº¿ç¨éç¥ï¼å¨è°åº¦çº¿ç¨ä¸æ´å çµæ´»ã å¨ä½¿ç¨`notify()/notifyAll()`æ¹æ³è¿è¡éç¥æ¶ï¼è¢«éç¥ççº¿ç¨æ¯ç± JVM éæ©çï¼ç¨`ReentrantLock`ç±»ç»å`Condition`å®ä¾å¯ä»¥å®ç°âéæ©æ§éç¥â** ï¼è¿ä¸ªåè½é常éè¦ï¼è䏿¯ Condition æ¥å£é»è®¤æä¾çãè`synchronized`å
³é®åå°±ç¸å½äºæ´ä¸ª Lock 对象ä¸åªæä¸ä¸ª`Condition`å®ä¾ï¼ææç线ç¨é½æ³¨åå¨å®ä¸ä¸ªèº«ä¸ã妿æ§è¡`notifyAll()`æ¹æ³çè¯å°±ä¼éç¥ææå¤äºçå¾
ç¶æç线ç¨è¿æ ·ä¼é æå¾å¤§çæçé®é¢ï¼è`Condition`å®ä¾ç`signalAll()`æ¹æ³ åªä¼å¤é注åå¨è¯¥`Condition`å®ä¾ä¸çææçå¾
线ç¨ã
**å¦æä½ æ³ä½¿ç¨ä¸è¿°åè½ï¼é£ä¹éæ© ReentrantLock æ¯ä¸ä¸ªä¸éçéæ©ãæ§è½å·²ä¸æ¯éæ©æ å**
### ThreadLocal
#### ThreadLocal æä»ä¹ç¨ï¼
é常æ
åµä¸ï¼æä»¬å建çå鿝å¯ä»¥è¢«ä»»ä½ä¸ä¸ªçº¿ç¨è®¿é®å¹¶ä¿®æ¹çã**妿æ³å®ç°æ¯ä¸ä¸ªçº¿ç¨é½æèªå·±çä¸å±æ¬å°åé该å¦ä½è§£å³å¢ï¼**
JDK ä¸èªå¸¦ç`ThreadLocal`ç±»æ£æ¯ä¸ºäºè§£å³è¿æ ·çé®é¢ã **`ThreadLocal`类主è¦è§£å³çå°±æ¯è®©æ¯ä¸ªçº¿ç¨ç»å®èªå·±çå¼ï¼å¯ä»¥å°`ThreadLocal`ç±»å½¢è±¡çæ¯å»æåæ¾æ°æ®ççåï¼çåä¸å¯ä»¥å卿¯ä¸ªçº¿ç¨çç§ææ°æ®ã**
å¦æä½ å建äºä¸ä¸ª`ThreadLocal`åéï¼é£ä¹è®¿é®è¿ä¸ªåéçæ¯ä¸ªçº¿ç¨é½ä¼æè¿ä¸ªåéçæ¬å°å¯æ¬ï¼è¿ä¹æ¯`ThreadLocal`åéåçç±æ¥ãä»ä»¬å¯ä»¥ä½¿ç¨ `getï¼ï¼` å `setï¼ï¼` æ¹æ³æ¥è·åé»è®¤å¼æå°å
¶å¼æ´æ¹ä¸ºå½åçº¿ç¨æåç坿¬çå¼ï¼ä»èé¿å
äºçº¿ç¨å®å
¨é®é¢ã
å举个ç®åçä¾åï¼ä¸¤ä¸ªäººå»å®å±æ¶éå®ç©ï¼è¿ä¸¤ä¸ªå
±ç¨ä¸ä¸ªè¢åçè¯è¯å®ä¼äº§çäºæ§ï¼ä½æ¯ç»ä»ä»¬ä¸¤ä¸ªäººæ¯ä¸ªäººåé
ä¸ä¸ªè¢åçè¯å°±ä¸ä¼åºç°è¿æ ·çé®é¢ã妿æè¿ä¸¤ä¸ªäººæ¯ä½çº¿ç¨çè¯ï¼é£ä¹ ThreadLocal å°±æ¯ç¨æ¥é¿å
è¿ä¸¤ä¸ªçº¿ç¨ç«äºçã
#### å¦ä½ä½¿ç¨ ThreadLocalï¼
ç¸ä¿¡çäºä¸é¢çè§£éï¼å¤§å®¶å·²ç»ææ `ThreadLocal` ç±»æ¯ä¸ªä»ä¹ä¸è¥¿äºãä¸é¢ç®åæ¼ç¤ºä¸ä¸å¦ä½å¨é¡¹ç®ä¸å®é
ä½¿ç¨ `ThreadLocal` ã
```java
import java.text.SimpleDateFormat;
import java.util.Random;
public class ThreadLocalExample implements Runnable{
// SimpleDateFormat 䏿¯çº¿ç¨å®å
¨çï¼æä»¥æ¯ä¸ªçº¿ç¨é½è¦æèªå·±ç¬ç«ç坿¬
private static final ThreadLocal formatter = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMdd HHmm"));
public static void main(String[] args) throws InterruptedException {
ThreadLocalExample obj = new ThreadLocalExample();
for(int i=0 ; i<10; i++){
Thread t = new Thread(obj, ""+i);
Thread.sleep(new Random().nextInt(1000));
t.start();
}
}
@Override
public void run() {
System.out.println("Thread Name= "+Thread.currentThread().getName()+" default Formatter = "+formatter.get().toPattern());
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
//formatter pattern is changed here by thread, but it won't reflect to other threads
formatter.set(new SimpleDateFormat());
System.out.println("Thread Name= "+Thread.currentThread().getName()+" formatter = "+formatter.get().toPattern());
}
}
```
è¾åºç»æ :
```
Thread Name= 0 default Formatter = yyyyMMdd HHmm
Thread Name= 0 formatter = yy-M-d ah:mm
Thread Name= 1 default Formatter = yyyyMMdd HHmm
Thread Name= 2 default Formatter = yyyyMMdd HHmm
Thread Name= 1 formatter = yy-M-d ah:mm
Thread Name= 3 default Formatter = yyyyMMdd HHmm
Thread Name= 2 formatter = yy-M-d ah:mm
Thread Name= 4 default Formatter = yyyyMMdd HHmm
Thread Name= 3 formatter = yy-M-d ah:mm
Thread Name= 4 formatter = yy-M-d ah:mm
Thread Name= 5 default Formatter = yyyyMMdd HHmm
Thread Name= 5 formatter = yy-M-d ah:mm
Thread Name= 6 default Formatter = yyyyMMdd HHmm
Thread Name= 6 formatter = yy-M-d ah:mm
Thread Name= 7 default Formatter = yyyyMMdd HHmm
Thread Name= 7 formatter = yy-M-d ah:mm
Thread Name= 8 default Formatter = yyyyMMdd HHmm
Thread Name= 9 default Formatter = yyyyMMdd HHmm
Thread Name= 8 formatter = yy-M-d ah:mm
Thread Name= 9 formatter = yy-M-d ah:mm
```
ä»è¾åºä¸å¯ä»¥çåºï¼è½ç¶ `Thread-0` å·²ç»æ¹åäº `formatter` çå¼ï¼ä½ `Thread-1` é»è®¤æ ¼å¼åå¼ä¸åå§åå¼ç¸åï¼å
¶ä»çº¿ç¨ä¹ä¸æ ·ã
ä¸é¢æä¸æ®µä»£ç ç¨å°äºå建 `ThreadLocal` åéç飿®µä»£ç ç¨å°äº Java8 çç¥è¯ï¼å®çäºä¸é¢è¿æ®µä»£ç ï¼å¦æä½ åäºä¸é¢è¿æ®µä»£ç çè¯ï¼IDEA ä¼æç¤ºä½ è½¬æ¢ä¸º Java8 çæ ¼å¼(IDEA ççä¸éï¼)ãå 为 ThreadLocal ç±»å¨ Java 8 䏿©å±ï¼ä½¿ç¨ä¸ä¸ªæ°çæ¹æ³`withInitial()`ï¼å° Supplier åè½æ¥å£ä½ä¸ºåæ°ã
```java
private static final ThreadLocal formatter = new ThreadLocal(){
@Override
protected SimpleDateFormat initialValue(){
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
```
#### ThreadLocal åçäºè§£åï¼
ä» `Thread`ç±»æºä»£ç å
¥æã
```java
public class Thread implements Runnable {
//......
//䏿¤çº¿ç¨æå
³çThreadLocalå¼ãç±ThreadLocal类维æ¤
ThreadLocal.ThreadLocalMap threadLocals = null;
//䏿¤çº¿ç¨æå
³çInheritableThreadLocalå¼ãç±InheritableThreadLocal类维æ¤
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
//......
}
```
ä»ä¸é¢`Thread`ç±» æºä»£ç å¯ä»¥çåº`Thread` ç±»ä¸æä¸ä¸ª `threadLocals` å ä¸ä¸ª `inheritableThreadLocals` åéï¼å®ä»¬é½æ¯ `ThreadLocalMap` ç±»åçåé,æä»¬å¯ä»¥æ `ThreadLocalMap` ç解为`ThreadLocal` ç±»å®ç°çå®å¶åç `HashMap`ãé»è®¤æ
åµä¸è¿ä¸¤ä¸ªåé齿¯ nullï¼åªæå½å线ç¨è°ç¨ `ThreadLocal` ç±»ç `set`æ`get`æ¹æ³æ¶æå建å®ä»¬ï¼å®é
ä¸è°ç¨è¿ä¸¤ä¸ªæ¹æ³çæ¶åï¼æä»¬è°ç¨çæ¯`ThreadLocalMap`类对åºç `get()`ã`set()`æ¹æ³ã
`ThreadLocal`ç±»ç`set()`æ¹æ³
```java
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
```
éè¿ä¸é¢è¿äºå
å®¹ï¼æä»¬è¶³ä»¥éè¿çæµå¾åºç»è®ºï¼**æç»çå鿝æ¾å¨äºå½å线ç¨ç `ThreadLocalMap` ä¸ï¼å¹¶ä¸æ¯åå¨ `ThreadLocal` ä¸ï¼`ThreadLocal` å¯ä»¥çè§£ä¸ºåªæ¯`ThreadLocalMap`çå°è£
ï¼ä¼ éäºåéå¼ã** `ThrealLocal` ç±»ä¸å¯ä»¥éè¿`Thread.currentThread()`è·åå°å½å线ç¨å¯¹è±¡åï¼ç´æ¥éè¿`getMap(Thread t)`å¯ä»¥è®¿é®å°è¯¥çº¿ç¨ç`ThreadLocalMap`对象ã
**æ¯ä¸ª`Thread`ä¸é½å
·å¤ä¸ä¸ª`ThreadLocalMap`ï¼è`ThreadLocalMap`å¯ä»¥åå¨ä»¥`ThreadLocal`为 key ï¼Object 对象为 value çé®å¼å¯¹ã**
```java
ThreadLocalMap(ThreadLocal> firstKey, Object firstValue) {
//......
}
```
æ¯å¦æä»¬å¨åä¸ä¸ªçº¿ç¨ä¸å£°æäºä¸¤ä¸ª `ThreadLocal` 对象çè¯ï¼ `Thread`å
é¨é½æ¯ä½¿ç¨ä»
æçé£ä¸ª`ThreadLocalMap` åæ¾æ°æ®çï¼`ThreadLocalMap`ç key å°±æ¯ `ThreadLocal`对象ï¼value å°±æ¯ `ThreadLocal` 对象è°ç¨`set`æ¹æ³è®¾ç½®çå¼ã
`ThreadLocal` æ°æ®ç»æå¦ä¸å¾æç¤ºï¼

`ThreadLocalMap`æ¯`ThreadLocal`çéæå
é¨ç±»ã

#### ThreadLocal å
åæ³é²é®é¢æ¯æä¹å¯¼è´çï¼
`ThreadLocalMap` ä¸ä½¿ç¨ç key 为 `ThreadLocal` çå¼±å¼ç¨ï¼è value æ¯å¼ºå¼ç¨ãæä»¥ï¼å¦æ `ThreadLocal` 没æè¢«å¤é¨å¼ºå¼ç¨çæ
åµä¸ï¼å¨åå¾åæ¶çæ¶åï¼key ä¼è¢«æ¸
çæï¼è value ä¸ä¼è¢«æ¸
çæã
è¿æ ·ä¸æ¥ï¼`ThreadLocalMap` ä¸å°±ä¼åºç° key 为 null ç Entryãå妿们ä¸å任使ªæ½çè¯ï¼value æ°¸è¿æ æ³è¢« GC åæ¶ï¼è¿ä¸ªæ¶åå°±å¯è½ä¼äº§çå
åæ³é²ã`ThreadLocalMap` å®ç°ä¸å·²ç»èèäºè¿ç§æ
åµï¼å¨è°ç¨ `set()`ã`get()`ã`remove()` æ¹æ³çæ¶åï¼ä¼æ¸
çæ key 为 null çè®°å½ã使ç¨å® `ThreadLocal`æ¹æ³å æå¥½æå¨è°ç¨`remove()`æ¹æ³
```java
static class Entry extends WeakReference> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal> k, Object v) {
super(k);
value = v;
}
}
```
**å¼±å¼ç¨ä»ç»ï¼**
> 妿ä¸ä¸ªå¯¹è±¡åªå
·æå¼±å¼ç¨ï¼é£å°±ç±»ä¼¼äº**坿坿 ççæ´»ç¨å**ãå¼±å¼ç¨ä¸è½¯å¼ç¨çåºå«å¨äºï¼åªå
·æå¼±å¼ç¨çå¯¹è±¡æ¥ææ´çæççå½å¨æãå¨åå¾åæ¶å¨çº¿ç¨æ«æå® æç®¡è¾çå
ååºåçè¿ç¨ä¸ï¼ä¸æ¦åç°äºåªå
·æå¼±å¼ç¨ç对象ï¼ä¸ç®¡å½åå
å空é´è¶³å¤ä¸å¦ï¼é½ä¼åæ¶å®çå
åãä¸è¿ï¼ç±äºåå¾åæ¶å¨æ¯ä¸ä¸ªä¼å
级å¾ä½ç线ç¨ï¼ å æ¤ä¸ä¸å®ä¼å¾å¿«åç°é£äºåªå
·æå¼±å¼ç¨ç对象ã
>
> å¼±å¼ç¨å¯ä»¥åä¸ä¸ªå¼ç¨éåï¼ReferenceQueueï¼èå使ç¨ï¼å¦æå¼±å¼ç¨æå¼ç¨ç对象被åå¾åæ¶ï¼Java èææºå°±ä¼æè¿ä¸ªå¼±å¼ç¨å å
¥å°ä¸ä¹å
³èçå¼ç¨éåä¸ã
### çº¿ç¨æ±
çº¿ç¨æ± ç¸å
³çç¥è¯ç¹åé¢è¯é¢æ»ç»è¯·çè¿ç¯æç« ï¼[Java çº¿ç¨æ± 详解](https://javaguide.cn/java/concurrent/java-thread-pool-summary.html) ï¼ç±äºå
容æ¯è¾å¤å°±ä¸æ¾å¨ PDF éé¢äºï¼ã
### AQS
AQS ç¸å
³çç¥è¯ç¹åé¢è¯é¢æ»ç»è¯·çè¿ç¯æç« ï¼[AQS 详解](https://javaguide.cn/java/concurrent/aqs.html) ï¼ç±äºå
容æ¯è¾å¤å°±ä¸æ¾å¨ PDF éé¢äºï¼ã
------
## 2.4. JVM
å¦æä½ æ³å²å»å¤§åçè¯ï¼å¯ä»¥éè¿ææ ¹æ®ãæ·±å
¥çè§£ Java èææºï¼JVM é«çº§ç¹æ§ä¸æä½³å®è·µï¼ç¬¬ä¸çãæ»ç»çä¸é¢è¿å ç¯æç« æ¥åå¤é¢è¯ï¼
1. [Java å
ååºå详解](https://javaguide.cn/java/jvm/memory-area.html)
2. [JVM åå¾åæ¶è¯¦è§£](https://javaguide.cn/java/jvm/jvm-garbage-collection.html)
3. [ç±»æä»¶ç»æè¯¦è§£](https://javaguide.cn/java/jvm/class-file-structure.html)
4. [ç±»å è½½è¿ç¨è¯¦è§£](https://javaguide.cn/java/jvm/class-loading-process.html)
5. [ç±»å è½½å¨è¯¦è§£](https://javaguide.cn/java/jvm/classloader.html)
------
# 3. è®¡ç®æºåºç¡
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
## 3.1 è®¡ç®æºç½ç»
### OSI ä¸å±æ¨¡åæ¯ä»ä¹ï¼æ¯ä¸å±çä½ç¨æ¯ä»ä¹ï¼
**OSI ä¸å±æ¨¡å** æ¯å½é
æ ååç»ç»æåºä¸ä¸ªç½ç»å屿¨¡åï¼å
¶å¤§ä½ç»æä»¥åæ¯ä¸å±æä¾çåè½å¦ä¸å¾æç¤ºï¼

æ¯ä¸å±é½ä¸æ³¨åä¸ä»¶äºæ
ï¼å¹¶ä¸æ¯ä¸å±é½éè¦ä½¿ç¨ä¸ä¸å±æä¾çåè½æ¯å¦ä¼ è¾å±éè¦ä½¿ç¨ç½ç»å±æä¾çè·¯ç±å寻ååè½ï¼è¿æ ·ä¼ è¾å±æç¥éææ°æ®ä¼ è¾å°åªéå»ã
**OSI çä¸å±ä½ç³»ç»ææ¦å¿µæ¸
æ¥ï¼ç论ä¹å¾å®æ´ï¼ä½æ¯å®æ¯è¾å¤æèä¸ä¸å®ç¨ï¼è䏿äºåè½å¨å¤ä¸ªå±ä¸éå¤åºç°ã**
ä¸é¢è¿ç§å¾å¯è½æ¯è¾æ½è±¡ï¼åæ¥ä¸ä¸ªæ¯è¾çå¨çå¾çãä¸é¢è¿ä¸ªå¾çæ¯æå¨å½å¤çä¸ä¸ªç½ç«ä¸çå°çï¼é常èµï¼

**æ¢ç¶ OSI ä¸å±æ¨¡åè¿ä¹å害ï¼ä¸ºä»ä¹å¹²ä¸è¿ TCP/IP å 屿¨¡åå¢ï¼**
çç¡®ï¼OSI ä¸å±æ¨¡å彿¶ä¸ç´è¢«ä¸äºå¤§å
¬å¸çè³ä¸äºå½å®¶æ¿åºæ¯æãè¿æ ·çèæ¯ä¸ï¼ä¸ºä»ä¹ä¼å¤±è´¥å¢ï¼æè§å¾ä¸»è¦æä¸é¢å æ¹é¢åå ï¼
1. OSI çä¸å®¶ç¼ºä¹å®é
ç»éªï¼ä»ä»¬å¨å®æ OSI æ åæ¶ç¼ºä¹åä¸é©±å¨å
2. OSI çåè®®å®ç°èµ·æ¥è¿å夿ï¼èä¸è¿è¡æçå¾ä½
3. OSI å¶å®æ åçå¨æå¤ªé¿ï¼å èä½¿å¾æ OSI æ åç产çè®¾å¤æ æ³åæ¶è¿å
¥å¸åºï¼20 ä¸çºª 90 年代åæï¼è½ç¶æ´å¥ç OSI å½é
æ åé½å·²ç»å¶å®åºæ¥ï¼ä½åºäº TCP/IP çäºèç½å·²ç»æ¢å
å¨å
¨çç¸å½å¤§çèå´æåè¿è¡äºï¼
4. OSI ç屿¬¡ååä¸å¤ªåçï¼æäºåè½å¨å¤ä¸ªå±æ¬¡ä¸éå¤åºç°ã
OSI ä¸å±æ¨¡åè½ç¶å¤±è´¥äºï¼ä½æ¯å´æä¾äºå¾å¤ä¸éçç论åºç¡ãä¸ºäºæ´å¥½å°å»äºè§£ç½ç»åå±ï¼OSI ä¸å±æ¨¡åè¿æ¯é常æå¿
è¦å¦ä¹ çã
æååå享ä¸ä¸ªå
³äº OSI ä¸å±æ¨¡åé常ä¸éçæ»ç»å¾çï¼

### TCP/IP å屿¨¡åæ¯ä»ä¹ï¼æ¯ä¸å±çä½ç¨æ¯ä»ä¹ï¼
**TCP/IP å屿¨¡å** æ¯ç®å被广æ³éç¨çä¸ç§æ¨¡å,æä»¬å¯ä»¥å° TCP / IP 模åç使¯ OSI ä¸å±æ¨¡åçç²¾ç®çæ¬ï¼ç±ä»¥ä¸ 4 å±ç»æï¼
1. åºç¨å±
2. ä¼ è¾å±
3. ç½ç»å±
4. ç½ç»æ¥å£å±
éè¦æ³¨æçæ¯ï¼æä»¬å¹¶ä¸è½å° TCP/IP å屿¨¡å å OSI ä¸å±æ¨¡åå®å
¨ç²¾ç¡®å°å¹é
èµ·æ¥ï¼ä¸è¿å¯ä»¥ç®åå°ä¸¤è
对åºèµ·æ¥ï¼å¦ä¸å¾æç¤ºï¼

#### åºç¨å±ï¼Application layerï¼
**åºç¨å±ä½äºä¼ è¾å±ä¹ä¸ï¼ä¸»è¦æä¾ä¸¤ä¸ªç»ç«¯è®¾å¤ä¸çåºç¨ç¨åºä¹é´ä¿¡æ¯äº¤æ¢çæå¡ï¼å®å®ä¹äºä¿¡æ¯äº¤æ¢çæ ¼å¼ï¼æ¶æ¯ä¼äº¤ç»ä¸ä¸å±ä¼ è¾å±æ¥ä¼ è¾ã** æä»¬æåºç¨å±äº¤äºçæ°æ®åå
ç§°ä¸ºæ¥æã

åºç¨å±åè®®å®ä¹äºç½ç»éä¿¡è§åï¼å¯¹äºä¸åçç½ç»åºç¨éè¦ä¸åçåºç¨å±åè®®ãå¨äºèç½ä¸åºç¨å±åè®®å¾å¤ï¼å¦æ¯æ Web åºç¨ç HTTP åè®®ï¼æ¯æçµåé®ä»¶ç SMTP åè®®ççã

åºç¨å±å¸¸è§åè®®æ»ç»ï¼è¯·çè¿ç¯æç« ï¼[åºç¨å±å¸¸è§åè®®æ»ç»ï¼åºç¨å±ï¼](https://javaguide.cn/cs-basics/network/application-layer-protocol.html)ã
#### ä¼ è¾å±ï¼Transport layerï¼
**ä¼ è¾å±ç主è¦ä»»å¡å°±æ¯è´è´£å两å°ç»ç«¯è®¾å¤è¿ç¨ä¹é´çéä¿¡æä¾éç¨çæ°æ®ä¼ è¾æå¡ã** åºç¨è¿ç¨å©ç¨è¯¥æå¡ä¼ éåºç¨å±æ¥æãâéç¨çâæ¯æå¹¶ä¸é对æä¸ä¸ªç¹å®çç½ç»åºç¨ï¼èæ¯å¤ç§åºç¨å¯ä»¥ä½¿ç¨åä¸ä¸ªè¿è¾å±æå¡ã
**è¿è¾å±ä¸»è¦ä½¿ç¨ä»¥ä¸ä¸¤ç§åè®®ï¼**
1. **ä¼ è¾æ§å¶åè®® TCP**ï¼Transmisson Control Protocolï¼--æä¾ **é¢åè¿æ¥** çï¼**å¯é ç** æ°æ®ä¼ è¾æå¡ã
2. **ç¨æ·æ°æ®åè®® UDP**ï¼User Datagram Protocolï¼--æä¾ **æ è¿æ¥** çï¼å°½æå¤§åªåçæ°æ®ä¼ è¾æå¡ï¼ä¸ä¿è¯æ°æ®ä¼ è¾çå¯é æ§ï¼ã

#### ç½ç»å±ï¼Network layerï¼
**ç½ç»å±è´è´£ä¸ºåç»äº¤æ¢ç½ä¸çä¸åä¸»æºæä¾éä¿¡æå¡ã** å¨åéæ°æ®æ¶ï¼ç½ç»å±æè¿è¾å±äº§ççæ¥ææ®µæç¨æ·æ°æ®æ¥å°è£
æåç»åå
è¿è¡ä¼ éãå¨ TCP/IP ä½ç³»ç»æä¸ï¼ç±äºç½ç»å±ä½¿ç¨ IP åè®®ï¼å æ¤åç»ä¹å« IP æ°æ®æ¥ï¼ç®ç§°æ°æ®æ¥ã
â ï¸æ³¨æ ï¼**ä¸è¦æè¿è¾å±çâç¨æ·æ°æ®æ¥ UDPâåç½ç»å±çâIP æ°æ®æ¥â弿··**ã
**ç½ç»å±çè¿æä¸ä¸ªä»»å¡å°±æ¯éæ©åéçè·¯ç±ï¼ä½¿æºä¸»æºè¿è¾å±æä¼ 䏿¥çåç»ï¼è½éè¿ç½ç»å±ä¸çè·¯ç±å¨æ¾å°ç®ç主æºã**
è¿éå¼ºè°æåºï¼ç½ç»å±ä¸çâç½ç»âäºåå·²ç»ä¸æ¯æä»¬é常è°å°çå
·ä½ç½ç»ï¼èæ¯æè®¡ç®æºç½ç»ä½ç³»ç»ææ¨¡åä¸ç¬¬ä¸å±çåç§°ã
äºèç½æ¯ç±å¤§éç弿ï¼heterogeneousï¼ç½ç»éè¿è·¯ç±å¨ï¼routerï¼ç¸äºè¿æ¥èµ·æ¥çãäºèç½ä½¿ç¨çç½ç»å±åè®®æ¯æ è¿æ¥çç½é
åè®®ï¼Intert Prococolï¼å许å¤è·¯ç±éæ©åè®®ï¼å æ¤äºèç½çç½ç»å±ä¹å«å **ç½é
å±** æ **IP å±**ã

**ç½ç»å±å¸¸è§åè®®** ï¼
- **IP:ç½é
åè®®** ï¼ç½é
åè®® IP æ¯TCP/IPåè®®ä¸æéè¦çåè®®ä¹ä¸ï¼ä¹æ¯ç½ç»å±æéè¦çåè®®ä¹ä¸ï¼IPåè®®çä½ç¨å
æ¬å¯»åè§çº¦ãå®ä¹æ°æ®å
çæ ¼å¼ççï¼æ¯ç½ç»å±ä¿¡æ¯ä¼ è¾ç主ååè®®ãç®åIPå议主è¦å为两ç§ï¼ä¸ç§æ¯è¿å»çIPv4ï¼å¦ä¸ç§æ¯è¾æ°çIPv6ï¼ç®åè¿ä¸¤ç§åè®®é½å¨ä½¿ç¨ï¼ä½åè
å·²ç»è¢«æè®®æ¥å代åè
ã
- **ARP åè®®** ï¼ARPåè®®ï¼å
¨ç§°å°åè§£æåè®®ï¼Address Resolution Protocolï¼ï¼å®è§£å³çæ¯ç½ç»å±å°ååé¾è·¯å±å°åä¹é´ç转æ¢é®é¢ãå 为ä¸ä¸ªIPæ°æ®æ¥å¨ç©çä¸ä¼ è¾çè¿ç¨ä¸ï¼æ»æ¯éè¦ç¥éä¸ä¸è·³ï¼ç©çä¸çä¸ä¸ä¸ªç®çå°ï¼è¯¥å»å¾ä½å¤ï¼ä½IPå°åå±äºé»è¾å°åï¼èMACå°åææ¯ç©çå°åï¼ARPå议解å³äºIPå°å转MACå°åçä¸äºé®é¢ã
- **NAT:ç½ç»å°å转æ¢åè®®** ï¼NATåè®®ï¼Network Address Translationï¼çåºç¨åºæ¯å¦åå®çåç§°ââç½ç»å°å转æ¢ï¼åºç¨äºå
é¨ç½å°å¤é¨ç½çå°å转æ¢è¿ç¨ä¸ãå
·ä½å°è¯´ï¼å¨ä¸ä¸ªå°çåç½ï¼å±åç½ï¼LANï¼å
ï¼å主æºä½¿ç¨çæ¯åä¸ä¸ªLANä¸çIPå°åï¼ä½å¨è¯¥LAN以å¤ï¼å¨å¹¿åç½ï¼WANï¼ä¸ï¼éè¦ä¸ä¸ªç»ä¸çIPå°åæ¥æ è¯è¯¥LAN卿´ä¸ªInternetä¸çä½ç½®ã
- ......
#### ç½ç»æ¥å£å±ï¼Network interface layerï¼
æä»¬å¯ä»¥æç½ç»æ¥å£å±ç使¯æ°æ®é¾è·¯å±åç©çå±çåä½ã
1. æ°æ®é¾è·¯å±(data link layer)é常ç®ç§°ä¸ºé¾è·¯å±ï¼ 两å°ä¸»æºä¹é´çæ°æ®ä¼ è¾ï¼æ»æ¯å¨ä¸æ®µä¸æ®µçé¾è·¯ä¸ä¼ éçï¼ã**æ°æ®é¾è·¯å±çä½ç¨æ¯å°ç½ç»å±äº¤ä¸æ¥ç IP æ°æ®æ¥ç»è£
æå¸§ï¼å¨ä¸¤ä¸ªç¸é»èç¹é´çé¾è·¯ä¸ä¼ éå¸§ãæ¯ä¸å¸§å
æ¬æ°æ®åå¿
è¦çæ§å¶ä¿¡æ¯ï¼å¦åæ¥ä¿¡æ¯ï¼å°åä¿¡æ¯ï¼å·®éæ§å¶çï¼ã**
2. **ç©çå±çä½ç¨æ¯å®ç°ç¸é»è®¡ç®æºèç¹ä¹é´æ¯ç¹æµçéæä¼ éï¼å°½å¯è½å±è½æå
·ä½ä¼ è¾ä»è´¨åç©ç设å¤çå·®å¼**

#### æ»ç»
ç®åæ»ç»ä¸ä¸æ¯ä¸å±å
å«çåè®®åæ ¸å¿ææ¯:

**åºç¨å±åè®®** :
- HTTP åè®®ï¼è¶
ææ¬ä¼ è¾åè®®ï¼ç½é¡µæµè§å¸¸ç¨çåè®®ï¼
- DHCP åè®®ï¼å¨æä¸»æºé
ç½®ï¼
- DNS ç³»ç»åçï¼ååç³»ç»ï¼
- FTP åè®®ï¼æä»¶ä¼ è¾åè®®ï¼
- Telnetåè®®ï¼è¿ç¨ç»éåè®®ï¼
- çµåé®ä»¶åè®®çï¼SMTPãPOP3ãIMAPï¼
- ......
**ä¼ è¾å±åè®®** :
- TCP åè®®
- æ¥ææ®µç»æ
- å¯é æ°æ®ä¼ è¾
- æµéæ§å¶
- æ¥å¡æ§å¶
- UDP åè®®
- æ¥ææ®µç»æ
- RDTï¼å¯é æ°æ®ä¼ è¾åè®®ï¼
**ç½ç»å±åè®®** :
- IP åè®®ï¼TCP/IP åè®®çåºç¡ï¼å为 IPv4 å IPv6ï¼
- ARP åè®®ï¼å°åè§£æåè®®ï¼ç¨äºè§£æ IP å°åå MAC å°åä¹é´çæ å°ï¼
- ICMP åè®®ï¼æ§å¶æ¥æåè®®ï¼ç¨äºåéæ§å¶æ¶æ¯ï¼
- NAT åè®®ï¼ç½ç»å°å转æ¢åè®®ï¼
- RIP åè®®ãOSPF åè®®ãBGP åè®®ï¼è·¯ç±éæ©åè®®ï¼
- ......
**ç½ç»æ¥å£å±** :
- å·®éæ£æµææ¯
- å¤è·¯è®¿é®åè®®ï¼ä¿¡éå¤ç¨ææ¯ï¼
- CSMA/CD åè®®
- MAC åè®®
- ä»¥å¤ªç½ææ¯
- ......
### 为ä»ä¹ç½ç»è¦åå±ï¼
说å°åå±ï¼æä»¬å
仿们平æ¶ä½¿ç¨æ¡æ¶å¼åä¸ä¸ªåå°ç¨åºæ¥è¯´ï¼æä»¬å¾å¾ä¼æç
§æ¯ä¸å±åä¸åçäºæ
çååå°ç³»ç»å为ä¸å±ï¼å¤æçç³»ç»åå±ä¼æ´å¤ï¼:
1. Repositoryï¼æ°æ®åºæä½ï¼
2. Serviceï¼ä¸å¡æä½ï¼
3. Controllerï¼ååç«¯æ°æ®äº¤äºï¼
**夿çç³»ç»éè¦åå±ï¼å 为æ¯ä¸å±é½éè¦ä¸æ³¨äºä¸ç±»äºæ
ãç½ç»åå±çåå 乿¯ä¸æ ·ï¼æ¯ä¸å±åªä¸æ³¨äºåä¸ç±»äºæ
ã**
好äºï¼åæ¥è¯´åï¼â为ä»ä¹ç½ç»è¦åå±ï¼âãæè§å¾ä¸»è¦æ 3 æ¹é¢çåå ï¼
1. **åå±ä¹é´ç¸äºç¬ç«**ï¼åå±ä¹é´ç¸äºç¬ç«ï¼åå±ä¹é´ä¸éè¦å
³å¿å
¶ä»å±æ¯å¦ä½å®ç°çï¼åªéè¦ç¥éèªå·±å¦ä½è°ç¨ä¸å±æä¾å¥½çåè½å°±å¯ä»¥äºï¼å¯ä»¥ç®åç解为æ¥å£è°ç¨ï¼**ãè¿ä¸ªåæä»¬å¯¹å¼åæ¶ç³»ç»è¿è¡å屿¯ä¸ä¸ªéçã**
2. **æé«äºæ´ä½çµæ´»æ§** ï¼æ¯ä¸å±é½å¯ä»¥ä½¿ç¨æéåçææ¯æ¥å®ç°ï¼ä½ åªéè¦ä¿è¯ä½ æä¾çåè½ä»¥åæ´é²çæ¥å£çè§åæ²¡ææ¹åå°±è¡äºã**è¿ä¸ªåæä»¬å¹³æ¶å¼åç³»ç»çæ¶åè¦æ±çé«å
èãä½è¦åçåå乿¯å¯ä»¥å¯¹åºä¸çã**
3. **大é®é¢åå°** ï¼ åå±å¯ä»¥å°å¤æçç½ç»é´é¢åè§£ä¸ºè®¸å¤æ¯è¾å°çãç线æ¯è¾æ¸
æ°ç®åçå°é®é¢æ¥å¤çåè§£å³ãè¿æ ·ä½¿å¾å¤æçè®¡ç®æºç½ç»ç³»ç»å徿äºè®¾è®¡ï¼å®ç°åæ ååã **è¿ä¸ªåæä»¬å¹³æ¶å¼åçæ¶åï¼ä¸è¬ä¼å°ç³»ç»åè½åè§£ï¼ç¶åå°å¤æçé®é¢å解为容æçè§£çæ´å°çé®é¢æ¯ç¸å¯¹åºçï¼è¿äºè¾å°çé®é¢å
·ææ´å¥½çè¾¹çï¼ç®æ 忥å£ï¼å®ä¹ã**
ææ³å°äºè®¡ç®æºä¸çé常é常æåçä¸å¥è¯ï¼è¿éå享ä¸ä¸ï¼
> è®¡ç®æºç§å¦é¢åçä»»ä½é®é¢é½å¯ä»¥éè¿å¢å ä¸ä¸ªé´æ¥çä¸é´å±æ¥è§£å³ï¼è®¡ç®æºæ´ä¸ªä½ç³»ä»ä¸å°ä¸é½æ¯æç
§ä¸¥æ ¼ç屿¬¡ç»æè®¾è®¡çã
### TCP ä¸ UDP çåºå«ï¼éè¦ï¼
1. **æ¯å¦é¢åè¿æ¥** ï¼UDP å¨ä¼ éæ°æ®ä¹åä¸éè¦å
建ç«è¿æ¥ãè TCP æä¾é¢åè¿æ¥çæå¡ï¼å¨ä¼ éæ°æ®ä¹åå¿
é¡»å
建ç«è¿æ¥ï¼æ°æ®ä¼ éç»æåè¦éæ¾è¿æ¥ã
2. **æ¯å¦æ¯å¯é ä¼ è¾**ï¼è¿å°ä¸»æºå¨æ¶å° UDP æ¥æåï¼ä¸éè¦ç»åºä»»ä½ç¡®è®¤ï¼å¹¶ä¸ä¸ä¿è¯æ°æ®ä¸ä¸¢å¤±ï¼ä¸ä¿è¯æ¯å¦é¡ºåºå°è¾¾ãTCP æä¾å¯é çä¼ è¾æå¡ï¼TCP å¨ä¼ éæ°æ®ä¹åï¼ä¼æä¸æ¬¡æ¡ææ¥å»ºç«è¿æ¥ï¼èä¸å¨æ°æ®ä¼ éæ¶ï¼æç¡®è®¤ãçªå£ãéä¼ ãæ¥å¡æ§å¶æºå¶ãéè¿ TCP è¿æ¥ä¼ è¾çæ°æ®ï¼æ å·®éãä¸ä¸¢å¤±ãä¸éå¤ã并䏿åºå°è¾¾ã
3. **æ¯å¦æç¶æ** ï¼è¿ä¸ªåä¸é¢çâæ¯å¦å¯é ä¼ è¾âç¸å¯¹åºãTCP ä¼ è¾æ¯æç¶æçï¼è¿ä¸ªæç¶æè¯´çæ¯ TCP ä¼å»è®°å½èªå·±åéæ¶æ¯çç¶ææ¯å¦æ¶æ¯æ¯å¦åéäºãæ¯å¦è¢«æ¥æ¶äºççãä¸ºæ¤ ï¼TCP éè¦ç»´æå¤æçè¿æ¥ç¶æè¡¨ãè UDP æ¯æ ç¶ææå¡ï¼ç®åæ¥è¯´å°±æ¯ä¸ç®¡ååºå»ä¹åçäºæ
äºï¼**è¿å¾æ¸£ç·ï¼**ï¼ã
4. **ä¼ è¾æç** ï¼ç±äºä½¿ç¨ TCP è¿è¡ä¼ è¾çæ¶åå¤äºè¿æ¥ã确认ãéä¼ çæºå¶ï¼æä»¥ TCP çä¼ è¾æçè¦æ¯ UDP ä½å¾å¤ã
5. **ä¼ è¾å½¢å¼** ï¼ TCP æ¯é¢ååèæµçï¼UDP æ¯é¢åæ¥æçã
6. **é¦é¨å¼é** ï¼TCP é¦é¨å¼éï¼20 ï½ 60 åèï¼æ¯ UDP é¦é¨å¼éï¼8 åèï¼è¦å¤§ã
7. **æ¯å¦æä¾å¹¿ææå¤ææå¡** ï¼TCP åªæ¯æç¹å¯¹ç¹éä¿¡ï¼UDP æ¯æä¸å¯¹ä¸ãä¸å¯¹å¤ãå¤å¯¹ä¸ãå¤å¯¹å¤ï¼
8. ......
ææä¸é¢æ»ç»çå
容éè¿è¡¨æ ¼å½¢å¼å±ç¤ºåºæ¥äºï¼ç¡®å®ä¸ç¹ä¸ªèµåï¼
| | TCP | UDP |
| ---------------------- | -------------- | ---------- |
| æ¯å¦é¢åè¿æ¥ | æ¯ | å¦ |
| æ¯å¦å¯é | æ¯ | å¦ |
| æ¯å¦æç¶æ | æ¯ | å¦ |
| ä¼ è¾æç | è¾æ
¢ | è¾å¿« |
| ä¼ è¾å½¢å¼ | åèæµ | æ°æ®æ¥ææ®µ |
| é¦é¨å¼é | 20 ï½ 60 bytes | 8 bytes |
| æ¯å¦æä¾å¹¿ææå¤ææå¡ | å¦ | æ¯ |
### ä»ä¹æ¶åéæ© TCP,ä»ä¹æ¶åé UDP?
- **UDP ä¸è¬ç¨äºå³æ¶éä¿¡**ï¼æ¯å¦ï¼ è¯é³ã è§é¢ ãç´æççãè¿äºåºæ¯å¯¹ä¼ è¾æ°æ®çåç¡®æ§è¦æ±ä¸æ¯ç¹å«é«ï¼æ¯å¦ä½ çè§é¢å³ä½¿å°ä¸ªä¸ä¸¤å¸§ï¼å®é
ç»äººçæè§åºå«ä¹ä¸å¤§ã
- **TCP ç¨äºå¯¹ä¼ è¾åç¡®æ§è¦æ±ç¹å«é«çåºæ¯**ï¼æ¯å¦æä»¶ä¼ è¾ãåé忥æ¶é®ä»¶ãè¿ç¨ç»å½ççã
### ä½¿ç¨ TCP çåè®®æåªäº?ä½¿ç¨ UDP çåè®®æåªäº?
**è¿è¡äº TCP åè®®ä¹ä¸çåè®®** ï¼
1. **HTTP åè®®** ï¼è¶
ææ¬ä¼ è¾åè®®ï¼HTTPï¼HyperText Transfer Protocol)ä¸»è¦æ¯ä¸º Web æµè§å¨ä¸ Web æå¡å¨ä¹é´çéä¿¡è设计çãå½æä»¬ä½¿ç¨æµè§å¨æµè§ç½é¡µçæ¶åï¼æä»¬ç½é¡µå°±æ¯éè¿ HTTP 请æ±è¿è¡å è½½çã
2. **HTTPS åè®®** ï¼æ´å®å
¨çè¶
ææ¬ä¼ è¾åè®®(HTTPS,Hypertext Transfer Protocol Secure)ï¼èº«æ« SSL å¤è¡£ç HTTP åè®®
3. **FTP åè®®**ï¼æä»¶ä¼ è¾åè®® FTPï¼File Transfer Protocolï¼ï¼æä¾æä»¶ä¼ è¾æå¡ï¼**åºäº TCP** å®ç°å¯é çä¼ è¾ãä½¿ç¨ FTP ä¼ è¾æä»¶ç好夿¯å¯ä»¥å±è½æä½ç³»ç»åæä»¶å卿¹å¼ã
4. **SMTP åè®®**ï¼ç®åé®ä»¶ä¼ è¾åè®®ï¼SMTPï¼Simple Mail Transfer Protocolï¼ç缩åï¼**åºäº TCP åè®®**ï¼ç¨æ¥åéçµåé®ä»¶ã注æ â ï¸ï¼æ¥åé®ä»¶çåè®®ä¸æ¯ SMTP èæ¯ POP3 åè®®ã
5. **POP3/IMAP åè®®**ï¼ POP3 å IMAP 两è
齿¯è´è´£é®ä»¶æ¥æ¶çåè®®ã
6. **Telent åè®®**ï¼è¿ç¨ç»éåè®®ï¼éè¿ä¸ä¸ªç»ç«¯ç»éå°å
¶ä»æå¡å¨ã被ä¸ç§ç§°ä¸º SSH çé常å®å
¨çåè®®æå代ã
7. **SSH åè®®** : SSHï¼ Secure Shellï¼æ¯ç®åè¾å¯é ï¼ä¸ä¸ºè¿ç¨ç»å½ä¼è¯åå
¶ä»ç½ç»æå¡æä¾å®å
¨æ§çåè®®ãå©ç¨ SSH åè®®å¯ä»¥ææé²æ¢è¿ç¨ç®¡çè¿ç¨ä¸çä¿¡æ¯æ³é²é®é¢ãSSH 建ç«å¨å¯é çä¼ è¾åè®® TCP ä¹ä¸ã
8. ......
**è¿è¡äº UDP åè®®ä¹ä¸çåè®®** ï¼
1. **DHCP åè®®**ï¼å¨æä¸»æºé
ç½®åè®®ï¼å¨æé
ç½® IP å°å
2. **DNS** ï¼ **ååç³»ç»ï¼DNSï¼Domain Name Systemï¼å°äººç±»å¯è¯»çåå (ä¾å¦ï¼www.baidu.com) 转æ¢ä¸ºæºå¨å¯è¯»ç IP å°å (ä¾å¦ï¼220.181.38.148)ã** æä»¬å¯ä»¥å°å
¶ç解为ä¸ä¸ºäºèç½è®¾è®¡ççµè¯èãå®é
ä¸ DNS åæ¶æ¯æ UDP å TCP åè®®ã
### TCP 䏿¬¡æ¡æå忬¡æ¥æï¼é常éè¦ï¼
**ç¸å
³é¢è¯é¢** ï¼
- 为ä»ä¹è¦ä¸æ¬¡æ¡æ?
- 第 2 æ¬¡æ¡æä¼ åäºACKï¼ä¸ºä»ä¹è¿è¦ä¼ åSYNï¼
- 为ä»ä¹è¦åæ¬¡æ¥æï¼
- 为ä»ä¹ä¸è½ææå¡å¨åéç ACK å FIN åå¹¶èµ·æ¥ï¼åæä¸æ¬¡æ¥æï¼
- å¦æç¬¬äºæ¬¡æ¥ææ¶æå¡å¨ç ACK 没æé达客æ·ç«¯ï¼ä¼ææ ·ï¼
- 为ä»ä¹ç¬¬åæ¬¡æ¥æå®¢æ·ç«¯éè¦çå¾
2\*MSLï¼æ¥ææ®µæé¿å¯¿å½ï¼æ¶é´åæè¿å
¥ CLOSED ç¶æï¼
**åèçæ¡** ï¼[TCP 䏿¬¡æ¡æå忬¡æ¥æï¼ä¼ è¾å±ï¼](https://javaguide.cn/cs-basics/network/tcp-connection-and-disconnection.html) ã
### TCP å¦ä½ä¿è¯ä¼ è¾çå¯é æ§ï¼ï¼éè¦ï¼
[TCP ä¼ è¾å¯é æ§ä¿éï¼ä¼ è¾å±ï¼](https://javaguide.cn/cs-basics/network/tcp-reliability-guarantee.html)
### ä»è¾å
¥URL å°é¡µé¢å±ç¤ºå°åºåçäºä»ä¹ï¼ï¼é常éè¦ï¼
> 类似çé®é¢ï¼æå¼ä¸ä¸ªç½é¡µï¼æ´ä¸ªè¿ç¨ä¼ä½¿ç¨åªäºåè®®ï¼
å¾è§£ï¼å¾çæ¥æºï¼ãå¾è§£ HTTPãï¼ï¼
> ä¸å¾æä¸ä¸ªé误ï¼è¯·æ³¨æï¼æ¯ OSPF 䏿¯ OPSFã OSPFï¼Open Shortest Path Firstï¼ospfï¼å¼æ¾æçè·¯å¾ä¼å
åè®®, æ¯ç± Internet å·¥ç¨ä»»å¡ç»å¼åçè·¯ç±éæ©åè®®
æ»ä½æ¥è¯´å为以ä¸å 个è¿ç¨:
1. DNS è§£æ
2. TCP è¿æ¥
3. åé HTTP 请æ±
4. æå¡å¨å¤ç请æ±å¹¶è¿å HTTP æ¥æ
5. æµè§å¨è§£ææ¸²æé¡µé¢
6. è¿æ¥ç»æ
å
·ä½å¯ä»¥åèä¸é¢è¿ä¸¤ç¯æç« ï¼
- [ä»è¾å
¥URLå°é¡µé¢å è½½åçäºä»ä¹ï¼](https://segmentfault.com/a/1190000006879700)
- [æµè§å¨ä»è¾å
¥ç½åå°é¡µé¢å±ç¤ºçè¿ç¨](https://cloud.tencent.com/developer/article/1879758)
### HTTP ç¶æç æåªäºï¼
HTTP ç¶æç ç¨äºæè¿° HTTP 请æ±çç»æï¼æ¯å¦2xx 就代表请æ±è¢«æåå¤çã

å
³äº HTTP ç¶æç æ´è¯¦ç»çæ»ç»ï¼å¯ä»¥çæåçè¿ç¯æç« ï¼[HTTP 常è§ç¶æç æ»ç»ï¼åºç¨å±ï¼](https://javaguide.cn/cs-basics/network/http-status-codes.html)ã
### HTTP å HTTPS æä»ä¹åºå«ï¼ï¼éè¦ï¼
- **端å£å·** ï¼HTTP é»è®¤æ¯ 80ï¼HTTPS é»è®¤æ¯ 443ã
- **URL åç¼** ï¼HTTP ç URL åç¼æ¯ `http://`ï¼HTTPS ç URL åç¼æ¯ `https://`ã
- **å®å
¨æ§åèµæºæ¶è** ï¼ HTTP åè®®è¿è¡å¨ TCP ä¹ä¸ï¼ææä¼ è¾çå
容齿¯ææï¼å®¢æ·ç«¯åæå¡å¨ç«¯é½æ æ³éªè¯å¯¹æ¹ç身份ãHTTPS æ¯è¿è¡å¨ SSL/TLS ä¹ä¸ç HTTP åè®®ï¼SSL/TLS è¿è¡å¨ TCP ä¹ä¸ãææä¼ è¾çå
容é½ç»è¿å å¯ï¼å å¯éç¨å¯¹ç§°å å¯ï¼ä½å¯¹ç§°å å¯çå¯é¥ç¨æå¡å¨æ¹çè¯ä¹¦è¿è¡äºé对称å å¯ãæä»¥è¯´ï¼HTTP å®å
¨æ§æ²¡æ HTTPS é«ï¼ä½æ¯ HTTPS æ¯ HTTP èè´¹æ´å¤æå¡å¨èµæºã
å
³äº HTTP å HTTPS æ´è¯¦ç»çå¯¹æ¯æ»ç»ï¼å¯ä»¥çæåçè¿ç¯æç« ï¼[HTTP vs HTTPSï¼åºç¨å±ï¼](https://javaguide.cn/cs-basics/network/http&https.html) ã
### HTTP 1.0 å HTTP 1.1 æä»ä¹åºå«ï¼
- **è¿æ¥æ¹å¼** : HTTP 1.0 为çè¿æ¥ï¼HTTP 1.1 æ¯æé¿è¿æ¥ã
- **ç¶æååºç ** : HTTP/1.1䏿°å å
¥äºå¤§éçç¶æç ï¼å
æ¯é误ååºç¶æç å°±æ°å¢äº24ç§ãæ¯å¦è¯´ï¼`100 (Continue)`ââå¨è¯·æ±å¤§èµæºåçé¢ç请æ±ï¼`206 (Partial Content)`ââèå´è¯·æ±çæ è¯ç ï¼`409 (Conflict)`ââ请æ±ä¸å½åèµæºçè§å®å²çªï¼`410 (Gone)`ââèµæºå·²è¢«æ°¸ä¹
转移ï¼è䏿²¡æä»»ä½å·²ç¥ç转åå°åã
- **ç¼åå¤ç** : å¨ HTTP1.0 ä¸ä¸»è¦ä½¿ç¨ header éç If-Modified-Since,Expires æ¥å为ç¼åå¤æçæ åï¼HTTP1.1 åå¼å
¥äºæ´å¤çç¼åæ§å¶çç¥ä¾å¦ Entity tagï¼If-Unmodified-Since, If-Match, If-None-Match çæ´å¤å¯ä¾éæ©çç¼åå¤´æ¥æ§å¶ç¼åçç¥ã
- **带宽ä¼ååç½ç»è¿æ¥ç使ç¨** :HTTP1.0 ä¸ï¼åå¨ä¸äºæµªè´¹å¸¦å®½çç°è±¡ï¼ä¾å¦å®¢æ·ç«¯åªæ¯éè¦æä¸ªå¯¹è±¡çä¸é¨åï¼èæå¡å¨å´å°æ´ä¸ªå¯¹è±¡éè¿æ¥äºï¼å¹¶ä¸ä¸æ¯ææç¹ç»ä¼ åè½ï¼HTTP1.1 åå¨è¯·æ±å¤´å¼å
¥äº range 头åï¼å®å
许åªè¯·æ±èµæºçæä¸ªé¨åï¼å³è¿åç æ¯ 206ï¼Partial Contentï¼ï¼è¿æ ·å°±æ¹ä¾¿äºå¼åè
èªç±çéæ©ä»¥ä¾¿äºå
åå©ç¨å¸¦å®½åè¿æ¥ã
- **Host头å¤ç** : HTTP/1.1å¨è¯·æ±å¤´ä¸å å
¥äº`Host`åæ®µã
å
³äº HTTP 1.0 å HTTP 1.1 æ´è¯¦ç»çå¯¹æ¯æ»ç»ï¼å¯ä»¥çæåçè¿ç¯æç« ï¼[HTTP 1.0 vs HTTP 1.1ï¼åºç¨å±ï¼](https://javaguide.cn/cs-basics/network/http1.0&http1.1.html) ã
### HTTP æ¯ä¸ä¿åç¶æçåè®®, å¦ä½ä¿åç¨æ·ç¶æ?
HTTP æ¯ä¸ç§ä¸ä¿åç¶æï¼å³æ ç¶æï¼statelessï¼åè®®ãä¹å°±æ¯è¯´ HTTP åè®®èªèº«ä¸å¯¹è¯·æ±åååºä¹é´çéä¿¡ç¶æè¿è¡ä¿åãé£ä¹æä»¬ä¿åç¨æ·ç¶æå¢ï¼Session æºå¶çåå¨å°±æ¯ä¸ºäºè§£å³è¿ä¸ªé®é¢ï¼Session ç主è¦ä½ç¨å°±æ¯éè¿æå¡ç«¯è®°å½ç¨æ·çç¶æãå
¸åçåºæ¯æ¯è´ç©è½¦ï¼å½ä½ è¦æ·»å ååå°è´ç©è½¦çæ¶åï¼ç³»ç»ä¸ç¥éæ¯åªä¸ªç¨æ·æä½çï¼å 为 HTTP åè®®æ¯æ ç¶æçãæå¡ç«¯ç»ç¹å®çç¨æ·å建ç¹å®ç Session ä¹åå°±å¯ä»¥æ è¯è¿ä¸ªç¨æ·å¹¶ä¸è·è¸ªè¿ä¸ªç¨æ·äºï¼ä¸è¬æ
åµä¸ï¼æå¡å¨ä¼å¨ä¸å®æ¶é´å
ä¿åè¿ä¸ª Sessionï¼è¿äºæ¶é´éå¶ï¼å°±ä¼éæ¯è¿ä¸ª Sessionï¼ã
卿å¡ç«¯ä¿å Session çæ¹æ³å¾å¤ï¼æå¸¸ç¨çå°±æ¯å
ååæ°æ®åº(æ¯å¦æ¯ä½¿ç¨å
åæ°æ®åº redis ä¿å)ãæ¢ç¶ Session 忾卿å¡å¨ç«¯ï¼é£ä¹æä»¬å¦ä½å®ç° Session è·è¸ªå¢ï¼å¤§é¨åæ
åµä¸ï¼æä»¬é½æ¯éè¿å¨ Cookie ä¸éå ä¸ä¸ª Session ID æ¥æ¹å¼æ¥è·è¸ªã
**Cookie 被ç¦ç¨æä¹å?**
æå¸¸ç¨çå°±æ¯å©ç¨ URL éåæ Session ID ç´æ¥éå å¨ URL è·¯å¾çåé¢ã

### URI å URL çåºå«æ¯ä»ä¹?
* URI(Uniform Resource Identifier) æ¯ç»ä¸èµæºæ å¿ç¬¦ï¼å¯ä»¥å¯ä¸æ è¯ä¸ä¸ªèµæºã
* URL(Uniform Resource Locator) æ¯ç»ä¸èµæºå®ä½ç¬¦ï¼å¯ä»¥æä¾è¯¥èµæºçè·¯å¾ã宿¯ä¸ç§å
·ä½ç URIï¼å³ URL å¯ä»¥ç¨æ¥æ è¯ä¸ä¸ªèµæºï¼èä¸è¿ææäºå¦ä½ locate è¿ä¸ªèµæºã
URI çä½ç¨å身份è¯å·ä¸æ ·ï¼URL çä½ç¨æ´åå®¶åºä½å䏿 ·ãURL æ¯ä¸ç§å
·ä½ç URIï¼å®ä¸ä»
å¯ä¸æ è¯èµæºï¼èä¸è¿æä¾äºå®ä½è¯¥èµæºçä¿¡æ¯ã
## 3.2 æä½ç³»ç»
### æä½ç³»ç»åºç¡
é¢è¯å®é¡¶çè¬æ¾çåååæèµ°æ¥ï¼åªè§ä»ä¸ææ¿çåéç Thinkpad ï¼ä¸ææçä»é£æ·¡é»çé¿è£ã
#### ä»ä¹æ¯æä½ç³»ç»ï¼
ð¨âð»**é¢è¯å®** ï¼ å
æ¥ä¸ªç®åé®é¢å§ï¼**ä»ä¹æ¯æä½ç³»ç»ï¼**
ð **æ** ï¼æéè¿ä»¥ä¸åç¹åæ¨ä»ç»ä¸ä¸ä»ä¹æ¯æä½ç³»ç»å§ï¼
1. **æä½ç³»ç»ï¼Operating Systemï¼ç®ç§° OSï¼æ¯ç®¡çè®¡ç®æºç¡¬ä»¶ä¸è½¯ä»¶èµæºçç¨åºï¼æ¯è®¡ç®æºçåºç³ã**
2. **æä½ç³»ç»æ¬è´¨ä¸æ¯ä¸ä¸ªè¿è¡å¨è®¡ç®æºä¸ç软件ç¨åº ï¼ç¨äºç®¡çè®¡ç®æºç¡¬ä»¶åè½¯ä»¶èµæºã** 举ä¾ï¼è¿è¡å¨ä½ çµèä¸çææåºç¨ç¨åºé½éè¿æä½ç³»ç»æ¥è°ç¨ç³»ç»å
å以åç£ççç硬件ã
3. **æä½ç³»ç»åå¨å±è½äºç¡¬ä»¶å±ç夿æ§ã** æä½ç³»ç»å°±åæ¯ç¡¬ä»¶ä½¿ç¨çè´è´£äººï¼ç»ç¹çåç§ç¸å
³äºé¡¹ã
4. **æä½ç³»ç»çå
æ ¸ï¼Kernelï¼æ¯æä½ç³»ç»çæ ¸å¿é¨åï¼å®è´è´£ç³»ç»çå
å管çï¼ç¡¬ä»¶è®¾å¤ç管çï¼æä»¶ç³»ç»ç管ç以ååºç¨ç¨åºç管ç**ã å
æ ¸æ¯è¿æ¥åºç¨ç¨åºåç¡¬ä»¶çæ¡¥æ¢ï¼å³å®çç³»ç»çæ§è½åç¨³å®æ§ã

#### ç³»ç»è°ç¨
ð¨âð»**é¢è¯å®** ï¼**ä»ä¹æ¯ç³»ç»è°ç¨å¢ï¼** è½ä¸è½è¯¦ç»ä»ç»ä¸ä¸ã
ð **æ** ï¼ä»ç»ç³»ç»è°ç¨ä¹åï¼æä»¬å
æ¥äºè§£ä¸ä¸ç¨æ·æåç³»ç»æã
æ ¹æ®è¿ç¨è®¿é®èµæºçç¹ç¹ï¼æä»¬å¯ä»¥æè¿ç¨å¨ç³»ç»ä¸çè¿è¡å为两个级å«ï¼
1. ç¨æ·æ(user mode) : ç¨æ·æè¿è¡çè¿ç¨å¯ä»¥ç´æ¥è¯»åç¨æ·ç¨åºçæ°æ®ã
2. ç³»ç»æ(kernel mode):å¯ä»¥ç®åççè§£ç³»ç»æè¿è¡çè¿ç¨æç¨åºå ä¹å¯ä»¥è®¿é®è®¡ç®æºçä»»ä½èµæºï¼ä¸åéå¶ã
说äºç¨æ·æåç³»ç»æä¹åï¼é£ä¹ä»ä¹æ¯ç³»ç»è°ç¨å¢ï¼
æä»¬è¿è¡çç¨åºåºæ¬é½æ¯è¿è¡å¨ç¨æ·æï¼å¦ææä»¬è°ç¨æä½ç³»ç»æä¾çç³»ç»æçº§å«çååè½ååå¢ï¼é£å°±éè¦ç³»ç»è°ç¨äºï¼
ä¹å°±æ¯è¯´å¨æä»¬è¿è¡çç¨æ·ç¨åºä¸ï¼å¡æ¯ä¸ç³»ç»æçº§å«çèµæºæå
³çæä½ï¼å¦æä»¶ç®¡çãè¿ç¨æ§å¶ãå
å管çç)ï¼é½å¿
é¡»éè¿ç³»ç»è°ç¨æ¹å¼åæä½ç³»ç»æåºæå¡è¯·æ±ï¼å¹¶ç±æä½ç³»ç»ä»£ä¸ºå®æã
è¿äºç³»ç»è°ç¨æåè½å¤§è´å¯å为å¦ä¸å ç±»ï¼
- 设å¤ç®¡çãå®æè®¾å¤çè¯·æ±æéæ¾ï¼ä»¥å设å¤å¯å¨çåè½ã
- æä»¶ç®¡çã宿æä»¶ç读ãåãå建åå é¤çåè½ã
- è¿ç¨æ§å¶ã宿è¿ç¨çåå»ºãæ¤éãé»å¡åå¤éçåè½ã
- è¿ç¨éä¿¡ã宿è¿ç¨ä¹é´çæ¶æ¯ä¼ éæä¿¡å·ä¼ éçåè½ã
- å
å管çã宿å
åçåé
ã忶以åè·åä½ä¸å ç¨å
ååºå¤§å°åå°åçåè½ã
### è¿ç¨å线ç¨
#### è¿ç¨å线ç¨çåºå«
ð¨âð»**é¢è¯å®**: 好çï¼ææç½äºï¼é£ä½ å说ä¸ä¸ï¼ **è¿ç¨å线ç¨çåºå«**ã
ð **æï¼** 好çï¼ ä¸å¾æ¯ Java å
ååºåï¼æä»¬ä» JVM çè§åº¦æ¥è¯´ä¸ä¸çº¿ç¨åè¿ç¨ä¹é´çå
³ç³»å§ï¼

ä»ä¸å¾å¯ä»¥çåºï¼ä¸ä¸ªè¿ç¨ä¸å¯ä»¥æå¤ä¸ªçº¿ç¨ï¼å¤ä¸ªçº¿ç¨å
±äº«è¿ç¨ç**å **å**æ¹æ³åº (JDK1.8 ä¹åçå
空é´)**èµæºï¼ä½æ¯æ¯ä¸ªçº¿ç¨æèªå·±ç**ç¨åºè®¡æ°å¨**ã**èææºæ ** å **æ¬å°æ¹æ³æ **ã
**æ»ç»ï¼** çº¿ç¨æ¯è¿ç¨ååæçæ´å°çè¿è¡åä½,ä¸ä¸ªè¿ç¨å¨å
¶æ§è¡çè¿ç¨ä¸å¯ä»¥äº§çå¤ä¸ªçº¿ç¨ã线ç¨åè¿ç¨æå¤§çä¸åå¨äºåºæ¬ä¸åè¿ç¨æ¯ç¬ç«çï¼èå线ç¨åä¸ä¸å®ï¼å 为åä¸è¿ç¨ä¸ççº¿ç¨ææå¯è½ä¼ç¸äºå½±åãçº¿ç¨æ§è¡å¼éå°ï¼ä½ä¸å©äºèµæºç管çåä¿æ¤ï¼èè¿ç¨æ£ç¸åã
#### è¿ç¨æåªå ç§ç¶æ?
ð¨âð»**é¢è¯å®** ï¼ é£ä½ å说说**è¿ç¨æåªå ç§ç¶æ?**
ð **æ** ï¼æä»¬ä¸è¬æè¿ç¨å¤§è´å为 5 ç§ç¶æï¼è¿ä¸ç¹å[线ç¨](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/Multithread/JavaConcurrencyBasicsCommonInterviewQuestionsSummary.md#6-%E8%AF%B4%E8%AF%B4%E7%BA%BF%E7%A8%8B%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%92%8C%E7%8A%B6%E6%80%81)å¾åï¼
- **åå»ºç¶æ(new)** ï¼è¿ç¨æ£å¨è¢«å建ï¼å°æªå°å°±ç»ªç¶æã
- **å°±ç»ªç¶æ(ready)** ï¼è¿ç¨å·²å¤äºåå¤è¿è¡ç¶æï¼å³è¿ç¨è·å¾äºé¤äºå¤çå¨ä¹å¤çä¸åæéèµæºï¼ä¸æ¦å¾å°å¤çå¨èµæº(å¤çå¨åé
çæ¶é´ç)å³å¯è¿è¡ã
- **è¿è¡ç¶æ(running)** ï¼è¿ç¨æ£å¨å¤çå¨ä¸ä¸è¿è¡(åæ ¸ CPU ä¸ä»»ææ¶å»åªæä¸ä¸ªè¿ç¨å¤äºè¿è¡ç¶æ)ã
- **é»å¡ç¶æ(waiting)** ï¼å称为çå¾
ç¶æï¼è¿ç¨æ£å¨çå¾
æä¸äºä»¶èæåè¿è¡å¦çå¾
æèµæºä¸ºå¯ç¨æçå¾
IO æä½å®æãå³ä½¿å¤çå¨ç©ºé²ï¼è¯¥è¿ç¨ä¹ä¸è½è¿è¡ã
- **ç»æç¶æ(terminated)** ï¼è¿ç¨æ£å¨ä»ç³»ç»ä¸æ¶å¤±ãå¯è½æ¯è¿ç¨æ£å¸¸ç»ææå
¶ä»åå 䏿éåºè¿è¡ã
> 订æ£ï¼ä¸å¾ä¸ running ç¶æè¢« interrupt å ready ç¶æè½¬æ¢çç®å¤´æ¹ååäºã

#### è¿ç¨é´çéä¿¡æ¹å¼
ð¨âð»**é¢è¯å®** ï¼**è¿ç¨é´çé信常è§ççæåªå ç§æ¹å¼å¢?**
ð **æ** ï¼å¤§æ¦æ 7 ç§å¸¸è§çè¿ç¨é´çéä¿¡æ¹å¼ã
> ä¸é¢è¿é¨åæ»ç»åèäº:[ãè¿ç¨é´éä¿¡ IPC (InterProcess Communication)ã](https://www.jianshu.com/p/c1015f5ffa74) è¿ç¯æç« ï¼æ¨èé
è¯»ï¼æ»ç»çé常ä¸éã
1. **管é/å¿å管é(Pipes)** ï¼ç¨äºå
·æäº²ç¼å
³ç³»çç¶åè¿ç¨é´æè
å
å¼è¿ç¨ä¹é´çéä¿¡ã
1. **æå管é(Names Pipes)** : å¿å管éç±äºæ²¡æååï¼åªè½ç¨äºäº²ç¼å
³ç³»çè¿ç¨é´éä¿¡ã为äºå
æè¿ä¸ªç¼ºç¹ï¼æåºäºæå管éãæå管éä¸¥æ ¼éµå¾ª**å
è¿å
åº(first in first out)**ãæå管é以ç£çæä»¶çæ¹å¼åå¨ï¼å¯ä»¥å®ç°æ¬æºä»»æä¸¤ä¸ªè¿ç¨éä¿¡ã
1. **ä¿¡å·(Signal)** ï¼ä¿¡å·æ¯ä¸ç§æ¯è¾å¤æçéä¿¡æ¹å¼ï¼ç¨äºéç¥æ¥æ¶è¿ç¨æä¸ªäºä»¶å·²ç»åçï¼
1. **æ¶æ¯éå(Message Queuing)** ï¼æ¶æ¯éåæ¯æ¶æ¯çé¾è¡¨,å
·æç¹å®çæ ¼å¼,åæ¾å¨å
åä¸å¹¶ç±æ¶æ¯éåæ è¯ç¬¦æ è¯ã管éåæ¶æ¯éåçéä¿¡æ°æ®é½æ¯å
è¿å
åºçååãä¸ç®¡éï¼æ å管éï¼åªåå¨äºå
åä¸çæä»¶ï¼å½å管éï¼åå¨äºå®é
çç£çä»è´¨æè
æä»¶ç³»ç»ï¼ä¸åçæ¯æ¶æ¯éååæ¾å¨å
æ ¸ä¸ï¼åªæå¨å
æ ¸éå¯(å³ï¼æä½ç³»ç»éå¯)æè
æ¾å¼å°å é¤ä¸ä¸ªæ¶æ¯éåæ¶ï¼è¯¥æ¶æ¯éåæä¼è¢«çæ£çå é¤ãæ¶æ¯éåå¯ä»¥å®ç°æ¶æ¯çéæºæ¥è¯¢,æ¶æ¯ä¸ä¸å®è¦ä»¥å
è¿å
åºç次åºè¯»å,ä¹å¯ä»¥ææ¶æ¯çç±»å读å.æ¯ FIFO æ´æä¼å¿ã**æ¶æ¯éåå
æäºä¿¡å·æ¿è½½ä¿¡æ¯éå°ï¼ç®¡éåªè½æ¿è½½æ æ ¼å¼å èæµä»¥åç¼å²åºå¤§å°åéç缺ç¹ã**
1. **ä¿¡å·é(Semaphores)** ï¼ä¿¡å·éæ¯ä¸ä¸ªè®¡æ°å¨ï¼ç¨äºå¤è¿ç¨å¯¹å
±äº«æ°æ®ç访é®ï¼ä¿¡å·éçæå¾å¨äºè¿ç¨é´åæ¥ãè¿ç§éä¿¡æ¹å¼ä¸»è¦ç¨äºè§£å³ä¸åæ¥ç¸å
³çé®é¢å¹¶é¿å
ç«äºæ¡ä»¶ã
1. **å
±äº«å
å(Shared memory)** ï¼ä½¿å¾å¤ä¸ªè¿ç¨å¯ä»¥è®¿é®åä¸åå
å空é´ï¼ä¸åè¿ç¨å¯ä»¥åæ¶çå°å¯¹æ¹è¿ç¨ä¸å¯¹å
±äº«å
å䏿°æ®çæ´æ°ãè¿ç§æ¹å¼éè¦ä¾é æç§åæ¥æä½ï¼å¦äºæ¥éåä¿¡å·éçãå¯ä»¥è¯´è¿æ¯ææç¨çè¿ç¨é´éä¿¡æ¹å¼ã
1. **奿¥å(Sockets)** : æ¤æ¹æ³ä¸»è¦ç¨äºå¨å®¢æ·ç«¯åæå¡å¨ä¹é´éè¿ç½ç»è¿è¡éä¿¡ã奿¥åæ¯æ¯æ TCP/IP çç½ç»éä¿¡çåºæ¬æä½åå
ï¼å¯ä»¥ç忝ä¸å主æºä¹é´çè¿ç¨è¿è¡ååéä¿¡ç端ç¹ï¼ç®åç说就æ¯éä¿¡ç两æ¹çä¸ç§çº¦å®ï¼ç¨å¥æ¥åä¸çç¸å
³å½æ°æ¥å®æéä¿¡è¿ç¨ã
#### 线ç¨é´çåæ¥çæ¹å¼
ð¨âð»**é¢è¯å®** ï¼**é£çº¿ç¨é´çåæ¥çæ¹å¼æåªäºå¢?**
ð **æ** ï¼çº¿ç¨åæ¥æ¯ä¸¤ä¸ªæå¤ä¸ªå
±äº«å
³é®èµæºç线ç¨çå¹¶åæ§è¡ãåºè¯¥åæ¥çº¿ç¨ä»¥é¿å
å
³é®çèµæºä½¿ç¨å²çªãæä½ç³»ç»ä¸è¬æä¸é¢ä¸ç§çº¿ç¨åæ¥çæ¹å¼ï¼
1. **äºæ¥é(Mutex)**ï¼éç¨äºæ¥å¯¹è±¡æºå¶ï¼åªææ¥æäºæ¥å¯¹è±¡ççº¿ç¨ææè®¿é®å
Œ
±èµæºçæéãå ä¸ºäºæ¥å¯¹è±¡åªæä¸ä¸ªï¼æä»¥å¯ä»¥ä¿è¯å
Œ
±èµæºä¸ä¼è¢«å¤ä¸ªçº¿ç¨åæ¶è®¿é®ãæ¯å¦ Java ä¸ç synchronized å
³é®è¯ååç§ Lock 齿¯è¿ç§æºå¶ã
1. **ä¿¡å·é(Semaphore)** ï¼å®å
许å䏿¶å»å¤ä¸ªçº¿ç¨è®¿é®åä¸èµæºï¼ä½æ¯éè¦æ§å¶å䏿¶å»è®¿é®æ¤èµæºçæå¤§çº¿ç¨æ°éã
1. **äºä»¶(Event)** :Wait/Notifyï¼éè¿éç¥æä½çæ¹å¼æ¥ä¿æå¤çº¿ç¨åæ¥ï¼è¿å¯ä»¥æ¹ä¾¿çå®ç°å¤çº¿ç¨ä¼å
çº§çæ¯è¾æä½ã
#### è¿ç¨çè°åº¦ç®æ³
ð¨âð»**é¢è¯å®** ï¼**ä½ ç¥éæä½ç³»ç»ä¸è¿ç¨çè°åº¦ç®æ³æåªäºå?**
ð **æ** ï¼å¯å¯ï¼è¿ä¸ªæä»¬å¤§å¦çæ¶åå¦è¿ï¼æ¯ä¸ä¸ªå¾éè¦çç¥è¯ç¹ï¼
为äºç¡®å®é¦å
æ§è¡åªä¸ªè¿ç¨ä»¥åæåæ§è¡åªä¸ªè¿ç¨ä»¥å®ç°æå¤§ CPU å©ç¨çï¼è®¡ç®æºç§å¦å®¶å·²ç»å®ä¹äºä¸äºç®æ³ï¼å®ä»¬æ¯ï¼
- **å
å°å
æå¡(FCFS)è°åº¦ç®æ³** : ä»å°±ç»ªéåä¸éæ©ä¸ä¸ªæå
è¿å
¥è¯¥éåçè¿ç¨ä¸ºä¹åé
èµæºï¼ä½¿å®ç«å³æ§è¡å¹¶ä¸ç´æ§è¡å°å®ææåçæäºä»¶è被é»å¡æ¾å¼å ç¨ CPU æ¶åéæ°è°åº¦ã
- **çä½ä¸ä¼å
(SJF)çè°åº¦ç®æ³** : ä»å°±ç»ªéåä¸éåºä¸ä¸ªä¼°è®¡è¿è¡æ¶é´æççè¿ç¨ä¸ºä¹åé
èµæºï¼ä½¿å®ç«å³æ§è¡å¹¶ä¸ç´æ§è¡å°å®ææåçæäºä»¶è被é»å¡æ¾å¼å ç¨ CPU æ¶åéæ°è°åº¦ã
- **æ¶é´ç轮转è°åº¦ç®æ³** : æ¶é´ç轮转è°åº¦æ¯ä¸ç§æå¤èï¼æç®åï¼æå
¬å¹³ä¸ä½¿ç¨æå¹¿çç®æ³ï¼åç§° RR(Round robin)è°åº¦ãæ¯ä¸ªè¿ç¨è¢«åé
ä¸ä¸ªæ¶é´æ®µï¼ç§°ä½å®çæ¶é´çï¼å³è¯¥è¿ç¨å
许è¿è¡çæ¶é´ã
- **å¤çº§åé¦éåè°åº¦ç®æ³** ï¼åé¢ä»ç»çå ç§è¿ç¨è°åº¦çç®æ³é½æä¸å®çå±éæ§ãå¦**çè¿ç¨ä¼å
çè°åº¦ç®æ³ï¼ä»
ç
§é¡¾äºçè¿ç¨è忽ç¥äºé¿è¿ç¨** ãå¤çº§åé¦éåè°åº¦ç®æ³æ¢è½ä½¿é«ä¼å
级çä½ä¸å¾å°ååºåè½ä½¿çä½ä¸ï¼è¿ç¨ï¼è¿
é宿ãï¼å è宿¯ç®å**被å
¬è®¤çä¸ç§è¾å¥½çè¿ç¨è°åº¦ç®æ³**ï¼UNIX æä½ç³»ç»éåç便æ¯è¿ç§è°åº¦ç®æ³ã
- **ä¼å
级è°åº¦** ï¼ ä¸ºæ¯ä¸ªæµç¨åé
ä¼å
级ï¼é¦å
æ§è¡å
·ææé«ä¼å
级çè¿ç¨ï¼ä¾æ¤ç±»æ¨ãå
·æç¸åä¼å
级çè¿ç¨ä»¥ FCFS æ¹å¼æ§è¡ãå¯ä»¥æ ¹æ®å
åè¦æ±ï¼æ¶é´è¦æ±æä»»ä½å
¶ä»èµæºè¦æ±æ¥ç¡®å®ä¼å
级ã
#### ä»ä¹æ¯æ»é
ð¨âð»**é¢è¯å®** ï¼**ä½ ç¥éä»ä¹æ¯æ»éå?**
ð **æ** ï¼æ»éæè¿°çæ¯è¿æ ·ä¸ç§æ
åµï¼å¤ä¸ªè¿ç¨/线ç¨åæ¶è¢«é»å¡ï¼å®ä»¬ä¸çä¸ä¸ªæè
å
¨é¨é½å¨çå¾
æä¸ªèµæºè¢«éæ¾ãç±äºè¿ç¨/线ç¨è¢«æ éæå°é»å¡ï¼å æ¤ç¨åºä¸å¯è½æ£å¸¸ç»æ¢ã
#### æ»éçå个æ¡ä»¶
ð¨âð»**é¢è¯å®** ï¼**äº§çæ»éçå个å¿
è¦æ¡ä»¶æ¯ä»ä¹?**
ð **æ** ï¼å¦æç³»ç»ä¸ä»¥ä¸å个æ¡ä»¶åæ¶æç«ï¼é£ä¹å°±è½å¼èµ·æ»éï¼
- **äºæ¥**ï¼èµæºå¿
é¡»å¤äºéå
±äº«æ¨¡å¼ï¼å³ä¸æ¬¡åªæä¸ä¸ªè¿ç¨å¯ä»¥ä½¿ç¨ã妿å¦ä¸è¿ç¨ç³è¯·è¯¥èµæºï¼é£ä¹å¿
é¡»çå¾
ç´å°è¯¥èµæºè¢«éæ¾ä¸ºæ¢ã
- **å æå¹¶çå¾
**ï¼ä¸ä¸ªè¿ç¨è³å°åºè¯¥å æä¸ä¸ªèµæºï¼å¹¶çå¾
å¦ä¸èµæºï¼èè¯¥èµæºè¢«å
¶ä»è¿ç¨æå æã
- **鿢å **ï¼èµæºä¸è½è¢«æ¢å ãåªè½å¨ææèµæºçè¿ç¨å®æä»»å¡åï¼è¯¥èµæºæä¼è¢«éæ¾ã
- **循ç¯çå¾
**ï¼æä¸ç»çå¾
è¿ç¨ `{P0, P1,..., Pn}`ï¼ `P0` çå¾
çèµæºè¢« `P1` å æï¼`P1` çå¾
çèµæºè¢« `P2` å æï¼......ï¼`Pn-1` çå¾
çèµæºè¢« `Pn` å æï¼`Pn` çå¾
çèµæºè¢« `P0` å æã
注æï¼åªæå个æ¡ä»¶åæ¶æç«æ¶ï¼æ»éæä¼åºç°ã
#### è§£å³æ»éçæ¹æ³
è§£å³æ»éçæ¹æ³å¯ä»¥ä»å¤ä¸ªè§åº¦å»åæï¼ä¸è¬çæ
åµä¸ï¼æ**é¢é²ï¼é¿å
ï¼æ£æµåè§£é¤åç§**ã
- **é¢é²** æ¯éç¨æç§çç¥ï¼**éå¶å¹¶åè¿ç¨å¯¹èµæºç请æ±**ï¼ä»èä½¿å¾æ»éçå¿
è¦æ¡ä»¶å¨ç³»ç»æ§è¡ç任使¶é´ä¸é½ä¸æ»¡è¶³ã
- **é¿å
**åæ¯ç³»ç»å¨åé
èµæºæ¶ï¼æ ¹æ®èµæºçä½¿ç¨æ
åµ**æåååºé¢æµ**ï¼ä»è**é¿å
æ»éçåç**
- **æ£æµ**æ¯æç³»ç»è®¾æ**ä¸é¨çæºæ**ï¼å½æ»éåçæ¶ï¼è¯¥æºæè½å¤æ£æµæ»éçåçï¼å¹¶ç²¾ç¡®å°ç¡®å®ä¸æ»éæå
³çè¿ç¨åèµæºã
- **è§£é¤** æ¯ä¸æ£æµç¸é
å¥çä¸ç§æªæ½ï¼ç¨äº**å°è¿ç¨ä»æ»éç¶æä¸è§£è±åºæ¥**ã
##### æ»éçé¢é²
æ»éå大å¿
è¦æ¡ä»¶ä¸é¢é½å·²ç»ååºæ¥äºï¼å¾æ¾ç¶ï¼åªè¦ç ´åå个å¿
è¦æ¡ä»¶ä¸çä»»ä½ä¸ä¸ªå°±è½å¤é¢é²æ»éçåçã
ç ´å第ä¸ä¸ªæ¡ä»¶ **äºæ¥æ¡ä»¶**ï¼ä½¿å¾èµæºæ¯å¯ä»¥åæ¶è®¿é®çï¼è¿æ¯ç§ç®åçæ¹æ³ï¼ç£çå°±å¯ä»¥ç¨è¿ç§æ¹æ³ç®¡çï¼ä½æ¯æä»¬è¦ç¥éï¼æå¾å¤èµæº **å¾å¾æ¯ä¸è½åæ¶è®¿é®ç** ï¼æä»¥è¿ç§åæ³å¨å¤§å¤æ°çåºåæ¯è¡ä¸éçã
ç ´å第ä¸ä¸ªæ¡ä»¶ **鿢å ** ï¼ä¹å°±æ¯è¯´å¯ä»¥éç¨ **å¥å¤ºå¼è°åº¦ç®æ³**ï¼ä½å¥å¤ºå¼è°åº¦æ¹æ³ç®åä¸è¬ä»
éç¨äº **主åèµæº** å **å¤çå¨èµæº** çåé
ï¼å¹¶ä¸éç¨äºæä»¥çèµæºï¼ä¼å¯¼è´ **èµæºå©ç¨çä¸é**ã
æä»¥ä¸è¬æ¯è¾å®ç¨ç **é¢é²æ»éçæ¹æ³**ï¼æ¯éè¿èèç ´å第äºä¸ªæ¡ä»¶å第å个æ¡ä»¶ã
**1ãéæåé
çç¥**
éæåé
çç¥å¯ä»¥ç ´åæ»é产çç第äºä¸ªæ¡ä»¶ï¼å æå¹¶çå¾
ï¼ãæè°éæåé
çç¥ï¼å°±æ¯æä¸ä¸ªè¿ç¨å¿
须卿§è¡åå°±ç³è¯·å°å®æéè¦çå
¨é¨èµæºï¼å¹¶ä¸ç¥é宿è¦çèµæºé½å¾å°æ»¡è¶³ä¹åæå¼å§æ§è¡ãè¿ç¨è¦ä¹å æææçèµæºç¶åå¼å§æ§è¡ï¼è¦ä¹ä¸å æèµæºï¼ä¸ä¼åºç°å æä¸äºèµæºçå¾
ä¸äºèµæºçæ
åµã
éæåé
çç¥é»è¾ç®åï¼å®ç°ä¹å¾å®¹æï¼ä½è¿ç§çç¥ **严éå°éä½äºèµæºå©ç¨ç**ï¼å ä¸ºå¨æ¯ä¸ªè¿ç¨æå æçèµæºä¸ï¼æäºèµæºæ¯å¨æ¯è¾é åçæ§è¡æ¶é´ééç¨çï¼çè³æäºèµæºæ¯å¨é¢å¤çæ
åµä¸ææ¯ç¨çï¼è¿æ ·å°±å¯è½é æäºä¸ä¸ªè¿ç¨å æäºä¸äº **å ä¹ä¸ç¨çèµæºè使å
¶ä»éè¦è¯¥èµæºçè¿ç¨äº§ççå¾
** çæ
åµã
**2ã屿¬¡åé
çç¥**
屿¬¡åé
çç¥ç ´åäºäº§çæ»éç第å个æ¡ä»¶(循ç¯çå¾
)ãå¨å±æ¬¡åé
çç¥ä¸ï¼ææçèµæºè¢«åæäºå¤ä¸ªå±æ¬¡ï¼ä¸ä¸ªè¿ç¨å¾å°æä¸æ¬¡çä¸ä¸ªèµæºåï¼å®åªè½åç³è¯·è¾é«ä¸å±çèµæºï¼å½ä¸ä¸ªè¿ç¨è¦éæ¾æå±çä¸ä¸ªèµæºæ¶ï¼å¿
é¡»å
éæ¾æå ç¨çè¾é«å±çèµæºï¼æè¿ç§çç¥ï¼æ¯ä¸å¯è½åºç°å¾ªç¯çå¾
é¾çï¼å ä¸ºé£æ ·çè¯ï¼å°±åºç°äºå·²ç»ç³è¯·äºè¾é«å±çèµæºï¼åèå»ç³è¯·äºè¾ä½å±çèµæºï¼ä¸ç¬¦å屿¬¡åé
çç¥ï¼è¯æç¥ã
##### æ»éçé¿å
ä¸é¢æå°ç **ç ´å** æ»é产ççå个å¿
è¦æ¡ä»¶ä¹ä¸å°±å¯ä»¥æå **é¢é²ç³»ç»åçæ»é** ï¼ä½æ¯ä¼å¯¼è´ **使çè¿ç¨è¿è¡** å **èµæºä½¿ç¨ç** ãèæ»éçé¿å
ç¸åï¼å®çè§åº¦æ¯å
许系ç»ä¸**åæ¶åå¨å个å¿
è¦æ¡ä»¶** ï¼åªè¦ææ¡å¹¶åè¿ç¨ä¸ä¸æ¯ä¸ªè¿ç¨æå
³çèµæºå¨æç³è¯·æ
åµï¼ååº **ææºååççéæ©** ï¼ä»ç¶å¯ä»¥é¿å
æ»éï¼å 为å大æ¡ä»¶ä»
ä»
æ¯äº§çæ»éçå¿
è¦æ¡ä»¶ã
æä»¬å°ç³»ç»çç¶æå为 **å®å
¨ç¶æ** å **ä¸å®å
¨ç¶æ** ï¼æ¯å½å¨æªç³è¯·è
åé
èµæºåå
æµè¯ç³»ç»ç¶æï¼è¥æç³»ç»èµæºåé
ç»ç³è¯·è
ä¼äº§çæ»éï¼åæç»åé
ï¼å¦åæ¥åç³è¯·ï¼å¹¶ä¸ºå®åé
èµæºã
> 妿æä½ç³»ç»è½å¤ä¿è¯ææçè¿ç¨å¨æéçæ¶é´å
å¾å°éè¦çå
¨é¨èµæºï¼åç§°ç³»ç»å¤äºå®å
¨ç¶æï¼å¦åè¯´ç³»ç»æ¯ä¸å®å
¨çã徿¾ç¶ï¼ç³»ç»å¤äºå®å
¨ç¶æåä¸ä¼åçæ»éï¼ç³»ç»è¥å¤äºä¸å®å
¨ç¶æåå¯è½åçæ»éã
é£ä¹å¦ä½ä¿è¯ç³»ç»ä¿æå¨å®å
¨ç¶æå¢ï¼éè¿ç®æ³ï¼å
¶ä¸æå
·æä»£è¡¨æ§ç **é¿å
æ»éç®æ³** å°±æ¯ Dijkstra çé¶è¡å®¶ç®æ³ï¼é¶è¡å®¶ç®æ³ç¨ä¸å¥è¯è¡¨è¾¾å°±æ¯ï¼å½ä¸ä¸ªè¿ç¨ç³è¯·ä½¿ç¨èµæºçæ¶åï¼**é¶è¡å®¶ç®æ³** éè¿å
**è¯æ¢** åé
ç»è¯¥è¿ç¨èµæºï¼ç¶åéè¿ **å®å
¨æ§ç®æ³** 夿åé
åç³»ç»æ¯å¦å¤äºå®å
¨ç¶æï¼è¥ä¸å®å
¨åè¯æ¢åé
ä½åºï¼è®©è¯¥è¿ç¨ç»§ç»çå¾
ï¼è¥è½å¤è¿å
¥å°å®å
¨çç¶æï¼åå°± **ççåé
èµæºç»è¯¥è¿ç¨**ã
é¶è¡å®¶ç®æ³è¯¦æ
å¯è§ï¼[ãä¸å¥è¯+ä¸å¼ å¾è¯´æ¸
æ¥ââé¶è¡å®¶ç®æ³ã](https://blog.csdn.net/qq_33414271/article/details/80245715) ã
æä½ç³»ç»æç¨æ ä¸è®²è¿°çé¶è¡å®¶ç®æ³ä¹æ¯è¾æ¸
æ°ï¼å¯ä»¥ä¸ç.
æ»éçé¿å
(é¶è¡å®¶ç®æ³)æ¹åè§£å³äº **èµæºä½¿ç¨çä½çé®é¢** ï¼ä½æ¯å®è¦ä¸æå°æ£æµæ¯ä¸ªè¿ç¨å¯¹åç±»èµæºçå ç¨åç³è¯·æ
åµï¼ä»¥åå **å®å
¨æ§æ£æ¥** ï¼éè¦è±è´¹è¾å¤çæ¶é´ã
##### æ»éçæ£æµ
å¯¹èµæºçåé
å 以éå¶å¯ä»¥ **é¢é²åé¿å
** æ»éçåçï¼ä½æ¯é½ä¸å©äºåè¿ç¨å¯¹ç³»ç»èµæºç**å
åå
±äº«**ãè§£å³æ»éé®é¢çå¦ä¸æ¡é徿¯ **æ»éæ£æµåè§£é¤** (è¿éçªç¶èæ³å°äºä¹è§éåæ²è§éï¼æè§æ»éçæ£æµåè§£é¤å°±åæ¯ **ä¹è§é** ï¼åé
èµæºæ¶ä¸å»æå管ä¼ä¸ä¼åçæ»éäºï¼çå°ççæ»éåºç°äºåæ¥è§£å³åï¼è **æ»éçé¢é²åé¿å
** æ´åæ¯æ²è§éï¼æ»æ¯è§å¾æ»éä¼åºç°ï¼æä»¥å¨åé
èµæºçæ¶åå°±å¾è°¨æ
)ã
è¿ç§æ¹æ³å¯¹èµæºçåé
ä¸å 以任ä½éå¶ï¼ä¹ä¸éåæ»éé¿å
æªæ½ï¼ä½ç³»ç» **宿¶å°è¿è¡ä¸ä¸ª âæ»éæ£æµâ** çç¨åºï¼å¤æç³»ç»å
æ¯å¦åºç°æ»éï¼å¦ææ£æµå°ç³»ç»åçäºæ»éï¼åéåæªæ½å»è§£é¤å®ã
**è¿ç¨-èµæºåé
å¾**
æä½ç³»ç»ä¸çæ¯ä¸å»æ¶å»ç**ç³»ç»ç¶æ**é½å¯ä»¥ç¨**è¿ç¨-èµæºåé
å¾**æ¥è¡¨ç¤ºï¼è¿ç¨-èµæºåé
徿¯æè¿°è¿ç¨åèµæºç³è¯·ååé
å
³ç³»çä¸ç§æåå¾ï¼å¯ç¨äº**æ£æµç³»ç»æ¯å¦å¤äºæ»éç¶æ**ã
ç¨ä¸ä¸ªæ¹æ¡è¡¨ç¤ºæ¯ä¸ä¸ªèµæºç±»ï¼æ¹æ¡ä¸çé»ç¹è¡¨ç¤ºè¯¥èµæºç±»ä¸çåä¸ªèµæºï¼æ¯ä¸ªé®è¿ç¨ç¨ä¸ä¸ªåå表示ï¼ç¨ **æåè¾¹** æ¥è¡¨ç¤º**è¿ç¨ç³è¯·èµæºåèµæºè¢«åé
çæ
åµ**ã
å¾ä¸ 2-21 æ¯**è¿ç¨-èµæºåé
å¾**çä¸ä¸ªä¾åï¼å
¶ä¸å
±æä¸ä¸ªèµæºç±»ï¼æ¯ä¸ªè¿ç¨çèµæºå æåç³è¯·æ
åµå·²æ¸
æ¥å°è¡¨ç¤ºå¨å¾ä¸ãå¨è¿ä¸ªä¾åä¸ï¼ç±äºåå¨ **å æåçå¾
èµæºçç¯è·¯** ï¼å¯¼è´ä¸ç»è¿ç¨æ°¸è¿å¤äºçå¾
èµæºçç¶æï¼åçäº **æ»é**ã

è¿ç¨-èµæºåé
å¾ä¸åå¨ç¯è·¯å¹¶ä¸ä¸å®æ¯åçäºæ»éãå 为循ç¯çå¾
èµæºä»
ä»
æ¯æ»éåççå¿
è¦æ¡ä»¶ï¼è䏿¯å
忡件ãå¾ 2-22 便æ¯ä¸ä¸ªæç¯è·¯èæ æ»éçä¾åãè½ç¶è¿ç¨ P1 åè¿ç¨ P3 åå«å ç¨äºä¸ä¸ªèµæº R1 åä¸ä¸ªèµæº R2ï¼å¹¶ä¸å 为çå¾
å¦ä¸ä¸ªèµæº R2 åå¦ä¸ä¸ªèµæº R1 å½¢æäºç¯è·¯ï¼ä½è¿ç¨ P2 åè¿ç¨ P4 åå«å æäºä¸ä¸ªèµæº R1 åä¸ä¸ªèµæº R2ï¼å®ä»¬ç³è¯·çèµæºå¾å°äºæ»¡è¶³ï¼å¨æéçæ¶é´éä¼å½è¿èµæºï¼äºæ¯è¿ç¨ P1 æ P3 é½è½è·å¾å¦ä¸ä¸ªæéçèµæºï¼ç¯è·¯èªå¨è§£é¤ï¼ç³»ç»ä¹å°±ä¸å卿»éç¶æäºã
##### æ»éæ£æµæ¥éª¤
ç¥éäºæ»éæ£æµçåçï¼æä»¬å¯ä»¥å©ç¨ä¸åæ¥éª¤ç¼åä¸ä¸ª **æ»éæ£æµ** ç¨åºï¼æ£æµç³»ç»æ¯å¦äº§çäºæ»éã
1. 妿è¿ç¨-èµæºåé
å¾ä¸æ ç¯è·¯ï¼åæ¤æ¶ç³»ç»æ²¡æåçæ»é
2. 妿è¿ç¨-èµæºåé
å¾ä¸æç¯è·¯ï¼ä¸æ¯ä¸ªèµæºç±»ä»
æä¸ä¸ªèµæºï¼åç³»ç»ä¸å·²ç»åçäºæ»éã
3. 妿è¿ç¨-èµæºåé
å¾ä¸æç¯è·¯ï¼ä¸æ¶åå°çèµæºç±»æå¤ä¸ªèµæºï¼æ¤æ¶ç³»ç»æªå¿
ä¼åçæ»éã妿è½å¨è¿ç¨-èµæºåé
å¾ä¸æ¾åºä¸ä¸ª **æ¢ä¸é»å¡åéç¬ç«çè¿ç¨** ï¼è¯¥è¿ç¨è½å¤å¨æéçæ¶é´å
å½è¿å æçèµæºï¼ä¹å°±æ¯æè¾¹ç»æ¶é¤æäºï¼é夿¤è¿ç¨ï¼ç´å°è½å¨æéçæ¶é´å
**æ¶é¤ææçè¾¹** ï¼åä¸ä¼åçæ»éï¼å¦åä¼åçæ»éã(æ¶é¤è¾¹çè¿ç¨ç±»ä¼¼äº **æææåº**)
##### æ»éçè§£é¤
彿»éæ£æµç¨åºæ£æµå°å卿»éåçæ¶ï¼åºè®¾æ³è®©å
¶è§£é¤ï¼è®©ç³»ç»ä»æ»éç¶æä¸æ¢å¤è¿æ¥ï¼å¸¸ç¨çè§£é¤æ»éçæ¹æ³æä»¥ä¸åç§ï¼
1. **ç«å³ç»æææè¿ç¨çæ§è¡ï¼éæ°å¯å¨æä½ç³»ç»** ï¼è¿ç§æ¹æ³ç®åï¼ä½ä»¥åæå¨çå·¥ä½å
¨é¨ä½åºï¼æå¤±å¾å¤§ã
2. **æ¤éæ¶åæ»éçææè¿ç¨ï¼è§£é¤æ»éåç»§ç»è¿è¡** ï¼è¿ç§æ¹æ³è½å½»åºæç ´**æ»éç循ç¯çå¾
**æ¡ä»¶ï¼ä½å°ä»åºå¾å¤§ä»£ä»·ï¼ä¾å¦æäºè¿ç¨å¯è½å·²ç»è®¡ç®äºå¾é¿æ¶é´ï¼ç±äºè¢«æ¤éè使产ççé¨åç»æä¹è¢«æ¶é¤äºï¼åéæ°æ§è¡æ¶è¿è¦å次è¿è¡è®¡ç®ã
3. **é个æ¤éæ¶åæ»éçè¿ç¨ï¼åæ¶å
¶èµæºç´è³æ»éè§£é¤ã**
4. **æ¢å èµæº** ï¼ä»æ¶åæ»éçä¸ä¸ªæå 个è¿ç¨ä¸æ¢å èµæºï¼æå¤ºå¾çèµæºååé
ç»æ¶åæ»éçè¿ç¨ç´è³æ»éè§£é¤ã
### æä½ç³»ç»å
å管çåºç¡
#### å
å管çä»ç»
ð¨âð» **é¢è¯å®**: **æä½ç³»ç»çå
å管çä¸»è¦æ¯åä»ä¹ï¼**
ð **æï¼** æä½ç³»ç»çå
å管ç主è¦è´è´£å
åçåé
ä¸åæ¶ï¼malloc 彿°ï¼ç³è¯·å
åï¼free 彿°ï¼éæ¾å
åï¼ï¼å¦å¤å°å转æ¢ä¹å°±æ¯å°é»è¾å°åè½¬æ¢æç¸åºçç©çå°åçåè½ä¹æ¯æä½ç³»ç»å
å管çåçäºæ
ã
#### 常è§çå ç§å
åç®¡çæºå¶
ð¨âð» **é¢è¯å®**: **æä½ç³»ç»çå
åç®¡çæºå¶äºè§£åï¼å
å管çæåªå ç§æ¹å¼?**
ð **æï¼** è¿ä¸ªå¨å¦ä¹ æä½ç³»ç»çæ¶åæäºè§£è¿ã
ç®åå为**è¿ç»åé
ç®¡çæ¹å¼**å**éè¿ç»åé
ç®¡çæ¹å¼**è¿ä¸¤ç§ãè¿ç»åé
ç®¡çæ¹å¼æ¯æä¸ºä¸ä¸ªç¨æ·ç¨åºåé
ä¸ä¸ªè¿ç»çå
å空é´ï¼å¸¸è§çå¦ **åå¼ç®¡ç** ãåæ ·å°ï¼éè¿ç»åé
ç®¡çæ¹å¼å
许ä¸ä¸ªç¨åºä½¿ç¨çå
ååå¸å¨ç¦»æ£æè
说ä¸ç¸é»çå
åä¸ï¼å¸¸è§çå¦**页å¼ç®¡ç** å **段å¼ç®¡ç**ã
1. **åå¼ç®¡ç** ï¼ è¿å¤æ¶ä»£çè®¡ç®æºæä½ç³»ç»çå
åç®¡çæ¹å¼ãå°å
åå为å 个åºå®å¤§å°çåï¼æ¯ä¸ªåä¸åªå
å«ä¸ä¸ªè¿ç¨ã妿ç¨åºè¿è¡éè¦å
åçè¯ï¼æä½ç³»ç»å°±åé
ç»å®ä¸åï¼å¦æç¨åºè¿è¡åªéè¦å¾å°ç空é´çè¯ï¼åé
çè¿åå
åå¾å¤§ä¸é¨åå ä¹è¢«æµªè´¹äºãè¿äºå¨æ¯ä¸ªå䏿ªè¢«å©ç¨ç空é´ï¼æä»¬ç§°ä¹ä¸ºç¢çã
2. **页å¼ç®¡ç** ï¼æä¸»åå为大å°ç¸çä¸åºå®çä¸é¡µä¸é¡µçå½¢å¼ï¼é¡µè¾å°ï¼ç¸æ¯äºåå¼ç®¡ççååç²åº¦æ´å°ï¼æé«äºå
åå©ç¨çï¼åå°äºç¢çã页å¼ç®¡çéè¿é¡µè¡¨å¯¹åºé»è¾å°ååç©çå°åã
3. **段å¼ç®¡ç** ï¼ é¡µå¼ç®¡çè½ç¶æé«äºå
åå©ç¨çï¼ä½æ¯é¡µå¼ç®¡çå
¶ä¸ç页并æ ä»»ä½å®é
æä¹ã 段å¼ç®¡çæä¸»ååä¸ºä¸æ®µæ®µçï¼æ®µæ¯æå®é
æä¹çï¼æ¯ä¸ªæ®µå®ä¹äºä¸ç»é»è¾ä¿¡æ¯ï¼ä¾å¦,æä¸»ç¨åºæ®µ MAINãåç¨åºæ®µ Xãæ°æ®æ®µ D åæ æ®µ S çã æ®µå¼ç®¡çéè¿æ®µè¡¨å¯¹åºé»è¾å°ååç©çå°åã
ç®åæ¥è¯´ï¼é¡µæ¯ç©çåä½ï¼æ®µæ¯é»è¾åä½ãå页å¯ä»¥æææé«å
åå©ç¨çï¼å段å¯ä»¥æ´å¥½æ»¡è¶³ç¨æ·éæ±ã
ð¨âð»**é¢è¯å®** ï¼ åççè¿ä¸éï¼ä¸è¿æ¼æäºä¸ä¸ªå¾éè¦ç **段页å¼ç®¡çæºå¶** ãæ®µé¡µå¼ç®¡çæºå¶ç»åäºæ®µå¼ç®¡çå页å¼ç®¡ççä¼ç¹ãç®åæ¥è¯´æ®µé¡µå¼ç®¡çæºå¶å°±æ¯æä¸»åå
åæè¥å¹²æ®µï¼æ¯ä¸ªæ®µååæè¥å¹²é¡µï¼ä¹å°±æ¯è¯´ **段页å¼ç®¡çæºå¶** 䏿®µä¸æ®µä¹é´ä»¥å段çå
é¨ç齿¯ç¦»æ£çã
ð **æ** ï¼è°¢è°¢é¢è¯å®ï¼ååæè¿ä¸ªç»å¿è®°äºï½
#### 快表åå¤çº§é¡µè¡¨
ð¨âð»**é¢è¯å®** ï¼ é¡µè¡¨ç®¡çæºå¶ä¸æä¸¤ä¸ªå¾éè¦çæ¦å¿µï¼å¿«è¡¨åå¤çº§é¡µè¡¨ï¼è¿ä¸¤ä¸ªä¸è¥¿åå«è§£å³äºé¡µè¡¨ç®¡çä¸å¾éè¦ç两个é®é¢ãä½ ç»æç®åä»ç»ä¸ä¸å§ï¼
ð **æ** ï¼å¨å页å
å管çä¸ï¼å¾éè¦çä¸¤ç¹æ¯ï¼
1. èæå°åå°ç©çå°åç转æ¢è¦å¿«ã
2. è§£å³èæå°å空é´å¤§ï¼é¡µè¡¨ä¹ä¼å¾å¤§çé®é¢ã
###### 快表
ä¸ºäºæé«èæå°åå°ç©çå°åç转æ¢éåº¦ï¼æä½ç³»ç»å¨ **é¡µè¡¨æ¹æ¡** åºç¡ä¹ä¸å¼å
¥äº **快表** æ¥å éèæå°åå°ç©çå°åç转æ¢ãæä»¬å¯ä»¥æå¿«è¡¨ç解为ä¸ç§ç¹æ®çé«éç¼å²åå¨å¨ï¼Cacheï¼ï¼å
¶ä¸çå
容æ¯é¡µè¡¨çä¸é¨åæè
å
¨é¨å
容ãä½ä¸ºé¡µè¡¨ç Cacheï¼å®çä½ç¨ä¸é¡µè¡¨ç¸ä¼¼ï¼ä½æ¯æé«äºè®¿é®éçãç±äºéç¨é¡µè¡¨åå°å转æ¢ï¼è¯»åå
åæ°æ®æ¶ CPU è¦è®¿é®ä¸¤æ¬¡ä¸»åãæäºå¿«è¡¨ï¼ææ¶åªè¦è®¿é®ä¸æ¬¡é«éç¼å²åå¨å¨ï¼ä¸æ¬¡ä¸»åï¼è¿æ ·å¯å 鿥æ¾å¹¶æé«æä»¤æ§è¡é度ã
使ç¨å¿«è¡¨ä¹åçå°åè½¬æ¢æµç¨æ¯è¿æ ·çï¼
1. æ ¹æ®èæå°åä¸ç页巿¥å¿«è¡¨ï¼
2. å¦æè¯¥é¡µå¨å¿«è¡¨ä¸ï¼ç´æ¥ä»å¿«è¡¨ä¸è¯»åç¸åºçç©çå°åï¼
3. å¦æè¯¥é¡µä¸å¨å¿«è¡¨ä¸ï¼å°±è®¿é®å
åä¸ç页表ï¼åä»é¡µè¡¨ä¸å¾å°ç©çå°åï¼åæ¶å°é¡µè¡¨ä¸ç该æ å°è¡¨é¡¹æ·»å å°å¿«è¡¨ä¸ï¼
4. å½å¿«è¡¨å¡«æ»¡åï¼åè¦ç»è®°æ°é¡µæ¶ï¼å°±æç
§ä¸å®çæ·æ±°çç¥æ·æ±°æå¿«è¡¨ä¸çä¸ä¸ªé¡µã
çå®äºä¹åä½ ä¼åç°å¿«è¡¨åæä»¬å¹³æ¶ç»å¸¸å¨æä»¬å¼åçç³»ç»ä½¿ç¨çç¼åï¼æ¯å¦ Redisï¼å¾åï¼çç¡®æ¯è¿æ ·çï¼æä½ç³»ç»ä¸çå¾å¤ææ³ãå¾å¤ç»å
¸çç®æ³ï¼ä½ é½å¯ä»¥å¨æä»¬æ¥å¸¸å¼å使ç¨çåç§å·¥å
·æè
æ¡æ¶ä¸æ¾å°å®ä»¬çå½±åã
###### å¤çº§é¡µè¡¨
å¼å
¥å¤çº§é¡µè¡¨ç主è¦ç®çæ¯ä¸ºäºé¿å
æå
¨é¨é¡µè¡¨ä¸ç´æ¾å¨å
åä¸å ç¨è¿å¤ç©ºé´ï¼ç¹å«æ¯é£äºæ ¹æ¬å°±ä¸éè¦ç页表就ä¸éè¦ä¿çå¨å
åä¸ã
å¤çº§é¡µè¡¨å±äºæ¶é´æ¢ç©ºé´çå
¸ååºæ¯ã
###### æ»ç»
ä¸ºäºæé«å
åçç©ºé´æ§è½ï¼æåºäºå¤çº§é¡µè¡¨çæ¦å¿µï¼ä½æ¯æå°ç©ºé´æ§è½æ¯ä»¥æµªè´¹æ¶é´æ§è½ä¸ºåºç¡çï¼å æ¤ä¸ºäºè¡¥å
æå¤±çæ¶é´æ§è½ï¼æåºäºå¿«è¡¨ï¼å³ TLBï¼çæ¦å¿µã ä¸è®ºæ¯å¿«è¡¨è¿æ¯å¤çº§é¡µè¡¨å®é
ä¸é½å©ç¨å°äºç¨åºçå±é¨æ§åçï¼å±é¨æ§åçå¨åé¢çèæå
åè¿é¨åä¼ä»ç»å°ã
#### å页æºå¶ååæ®µæºå¶çå
±åç¹ååºå«
ð¨âð»**é¢è¯å®** ï¼ **å页æºå¶ååæ®µæºå¶æåªäºå
±åç¹ååºå«å¢ï¼**
ð **æ** ï¼
1. **å
±åç¹** ï¼
- å页æºå¶ååæ®µæºå¶é½æ¯ä¸ºäºæé«å
åå©ç¨çï¼åå°å
åç¢çã
- 页忮µé½æ¯ç¦»æ£åå¨çï¼æä»¥ä¸¤è
齿¯ç¦»æ£åé
å
åçæ¹å¼ã使¯ï¼æ¯ä¸ªé¡µå段ä¸çå
忝è¿ç»çã
2. **åºå«** ï¼
- 页ç大尿¯åºå®çï¼ç±æä½ç³»ç»å³å®ï¼è段ç大å°ä¸åºå®ï¼åå³äºæä»¬å½åè¿è¡çç¨åºã
- å页ä»
ä»
æ¯ä¸ºäºæ»¡è¶³æä½ç³»ç»å
å管ççéæ±ï¼è段æ¯é»è¾ä¿¡æ¯çåä½ï¼å¨ç¨åºä¸å¯ä»¥ä½ç°ä¸ºä»£ç æ®µï¼æ°æ®æ®µï¼è½å¤æ´å¥½æ»¡è¶³ç¨æ·çéè¦ã
#### é»è¾(èæ)å°ååç©çå°å
ð¨âð»**é¢è¯å®** ï¼ä½ ååè¿æå°äº**é»è¾å°ååç©çå°å**è¿ä¸¤ä¸ªæ¦å¿µï¼æä¸å¤ªæ¸
æ¥ï¼ä½ è½ä¸ºæè§£éä¸ä¸ä¸ï¼
ð **æï¼** em...好çåï¼æä»¬ç¼ç¨ä¸è¬åªæå¯è½åé»è¾å°åæäº¤éï¼æ¯å¦å¨ C è¯è¨ä¸ï¼æééé¢åå¨çæ°å¼å°±å¯ä»¥çè§£æä¸ºå
åéçä¸ä¸ªå°åï¼è¿ä¸ªå°åä¹å°±æ¯æä»¬è¯´çé»è¾å°åï¼é»è¾å°åç±æä½ç³»ç»å³å®ãç©çå°åæçæ¯çå®ç©çå
åä¸å°åï¼æ´å
·ä½ä¸ç¹æ¥è¯´å°±æ¯å
åå°åå¯åå¨ä¸çå°åãç©çå°åæ¯å
ååå
çæ£çå°åã
#### CPU 寻åäºè§£å?为ä»ä¹éè¦èæå°å空é´?
ð¨âð»**é¢è¯å®** ï¼**CPU 寻åäºè§£å?为ä»ä¹éè¦èæå°å空é´?**
ð **æ** ï¼è¿é¨åæç䏿¸
æ¥ï¼
äºæ¯é¢è¯å®ä¹åæé»é»å»æ¥é
äºç¸å
³ææ¡£ï¼çä¸äºæ²¡æææ¯ç泪水ããã
> è¿é¨åå
容åèäº Microsoft å®ç½çä»ç»ï¼å°åï¼
ç°ä»£å¤çå¨ä½¿ç¨çæ¯ä¸ç§ç§°ä¸º **èæå¯»å(Virtual Addressing)** ç坻忹å¼ã**使ç¨èæå¯»åï¼CPU éè¦å°èæå°åç¿»è¯æç©çå°åï¼è¿æ ·æè½è®¿é®å°çå®çç©çå
åã** å®é
ä¸å®æèæå°å转æ¢ä¸ºç©çå°å转æ¢çç¡¬ä»¶æ¯ CPU ä¸å«æä¸ä¸ªè¢«ç§°ä¸º **å
å管çåå
ï¼Memory Management Unit, MMUï¼** ç硬件ãå¦ä¸å¾æç¤ºï¼

**为ä»ä¹è¦æèæå°å空é´å¢ï¼**
å
仿²¡æèæå°å空é´çæ¶å说起å§ï¼æ²¡æèæå°å空é´çæ¶åï¼**ç¨åºç´æ¥è®¿é®åæä½ç齿¯ç©çå
å** ã使¯è¿æ ·æä»ä¹é®é¢å¢ï¼
1. ç¨æ·ç¨åºå¯ä»¥è®¿é®ä»»æå
åï¼å¯»åå
åçæ¯ä¸ªåèï¼è¿æ ·å°±å¾å®¹æï¼æææè
æ æï¼ç ´åæä½ç³»ç»ï¼é ææä½ç³»ç»å´©æºã
2. æ³è¦åæ¶è¿è¡å¤ä¸ªç¨åºç¹å«å°é¾ï¼æ¯å¦ä½ æ³åæ¶è¿è¡ä¸ä¸ªå¾®ä¿¡åä¸ä¸ª QQ é³ä¹é½ä¸è¡ã为ä»ä¹å¢ï¼ä¸¾ä¸ªç®åçä¾åï¼å¾®ä¿¡å¨è¿è¡çæ¶åç»å
åå°å 1xxx èµå¼åï¼QQ é³ä¹ä¹åæ ·ç»å
åå°å 1xxx èµå¼ï¼é£ä¹ QQ é³ä¹å¯¹å
åçèµå¼å°±ä¼è¦ç微信ä¹åæèµçå¼ï¼è¿å°±é æäºå¾®ä¿¡è¿ä¸ªç¨åºå°±ä¼å´©æºã
**æ»ç»æ¥è¯´ï¼å¦æç´æ¥æç©çå°åæ´é²åºæ¥çè¯ä¼å¸¦æ¥ä¸¥éé®é¢ï¼æ¯å¦å¯è½å¯¹æä½ç³»ç»é æä¼¤å®³ä»¥åç»åæ¶è¿è¡å¤ä¸ªç¨åºé æå°é¾ã**
éè¿èæå°å访é®å
åæä»¥ä¸ä¼å¿ï¼
- ç¨åºå¯ä»¥ä½¿ç¨ä¸ç³»åç¸é»çèæå°åæ¥è®¿é®ç©çå
åä¸ä¸ç¸é»ç大å
åç¼å²åºã
- ç¨åºå¯ä»¥ä½¿ç¨ä¸ç³»åèæå°åæ¥è®¿é®å¤§äºå¯ç¨ç©çå
åçå
åç¼å²åºãå½ç©çå
åçä¾åºéåå°æ¶ï¼å
å管çå¨ä¼å°ç©çå
å页ï¼é常大å°ä¸º 4 KBï¼ä¿åå°ç£çæä»¶ãæ°æ®æä»£ç 页伿 ¹æ®éè¦å¨ç©çå
åä¸ç£çä¹é´ç§»å¨ã
- ä¸åè¿ç¨ä½¿ç¨çèæå°åå½¼æ¤é离ãä¸ä¸ªè¿ç¨ä¸çä»£ç æ æ³æ´æ¹æ£å¨ç±å¦ä¸è¿ç¨ææä½ç³»ç»ä½¿ç¨çç©çå
åã
### èæå
å
#### ä»ä¹æ¯èæå
å(Virtual Memory)?
ð¨âð»**é¢è¯å®** ï¼åé®ä½ ä¸ä¸ªå¸¸è¯æ§çé®é¢ï¼**ä»ä¹æ¯èæå
å(Virtual Memory)?**
ð **æ** ï¼è¿ä¸ªå¨æä»¬å¹³æ¶ä½¿ç¨çµèç¹å«æ¯ Windows ç³»ç»çæ¶å太常è§äºãå¾å¤æ¶åæä»¬ä½¿ç¨äºå¾å¤å å
åç软件ï¼è¿äºè½¯ä»¶å ç¨çå
åå¯è½å·²ç»è¿è¿è¶
åºäºæä»¬çµèæ¬èº«å
·æçç©çå
åã**为ä»ä¹å¯ä»¥è¿æ ·å¢ï¼** æ£æ¯å 为 **èæå
å** çåå¨ï¼éè¿ **èæå
å** å¯ä»¥è®©ç¨åºå¯ä»¥æ¥æè¶
è¿ç³»ç»ç©çå
å大å°çå¯ç¨å
å空é´ãå¦å¤ï¼**èæå
å为æ¯ä¸ªè¿ç¨æä¾äºä¸ä¸ªä¸è´çãç§æçå°å空é´ï¼å®è®©æ¯ä¸ªè¿ç¨äº§çäºä¸ç§èªå·±å¨ç¬äº«ä¸»åçéè§ï¼æ¯ä¸ªè¿ç¨æ¥æä¸çè¿ç»å®æ´çå
å空é´ï¼**ãè¿æ ·ä¼æ´å ææå°ç®¡çå
åå¹¶åå°åºéã
**èæå
å**æ¯è®¡ç®æºç³»ç»å
å管ççä¸ç§ææ¯ï¼æä»¬å¯ä»¥æå¨è®¾ç½®èªå·±çµèçèæå
åãä¸è¦å纯认为èæå
ååªæ¯â使ç¨ç¡¬çç©ºé´æ¥æ©å±å
åâçææ¯ã**èæå
åçéè¦æä¹æ¯å®å®ä¹äºä¸ä¸ªè¿ç»çèæå°å空é´**ï¼å¹¶ä¸ **æå
åæ©å±å°ç¡¬ç空é´**ãæ¨èé
读ï¼[ãèæå
åçé£ç¹äºå¿ã](https://juejin.im/post/59f8691b51882534af254317)
ç»´åºç¾ç§ä¸æå å¥è¯æ¯è¿æ ·ä»ç»èæå
åçã
> **èæå
å** 使å¾åºç¨ç¨åºè®¤ä¸ºå®æ¥æè¿ç»çå¯ç¨çå
åï¼ä¸ä¸ªè¿ç»å®æ´çå°å空é´ï¼ï¼èå®é
ä¸ï¼å®é常æ¯è¢«åéæå¤ä¸ªç©çå
åç¢çï¼è¿æé¨åææ¶åå¨å¨å¤é¨ç£çåå¨å¨ä¸ï¼å¨éè¦æ¶è¿è¡æ°æ®äº¤æ¢ã䏿²¡æä½¿ç¨èæå
åææ¯çç³»ç»ç¸æ¯ï¼ä½¿ç¨è¿ç§ææ¯çç³»ç»ä½¿å¾å¤§åç¨åºçç¼åå徿´å®¹æï¼å¯¹çæ£çç©çå
åï¼ä¾å¦ RAMï¼ç使ç¨ä¹æ´ææçãç®åï¼å¤§å¤æ°æä½ç³»ç»é½ä½¿ç¨äºèæå
åï¼å¦ Windows å®¶æçâèæå
åâï¼Linux çâ交æ¢ç©ºé´âçãFrom:
#### å±é¨æ§åç
ð¨âð»**é¢è¯å®** ï¼è¦æ³æ´å¥½å°çè§£èæå
åææ¯ï¼å¿
é¡»è¦ç¥éè®¡ç®æºä¸èåç**å±é¨æ§åç**ãå¦å¤ï¼å±é¨æ§åçæ¢éç¨äºç¨åºç»æï¼ä¹éç¨äºæ°æ®ç»æï¼æ¯é常éè¦çä¸ä¸ªæ¦å¿µã
ð **æ** ï¼å±é¨æ§åçæ¯èæå
åææ¯çåºç¡ï¼æ£æ¯å 为ç¨åºè¿è¡å
·æå±é¨æ§åçï¼æå¯ä»¥åªè£
å
¥é¨åç¨åºå°å
åå°±å¼å§è¿è¡ã
> 以ä¸å
容æèªãè®¡ç®æºæä½ç³»ç»æç¨ã 第 4 ç« åå¨å¨ç®¡çã
æ©å¨ 1968 å¹´çæ¶åï¼å°±æäººæåºæä»¬çç¨åºå¨æ§è¡çæ¶åå¾å¾åç°å±é¨æ§è§å¾ï¼ä¹å°±æ¯è¯´å¨æä¸ªè¾ççæ¶é´æ®µå
ï¼ç¨åºæ§è¡å±éäºæä¸å°é¨åï¼ç¨åºè®¿é®çåå¨ç©ºé´ä¹å±éäºæä¸ªåºåã
å±é¨æ§åç表ç°å¨ä»¥ä¸ä¸¤ä¸ªæ¹é¢ï¼
1. **æ¶é´å±é¨æ§** ï¼å¦æç¨åºä¸çææ¡æä»¤ä¸æ¦æ§è¡ï¼ä¸ä¹
以å该æä»¤å¯è½å次æ§è¡ï¼å¦æææ°æ®è¢«è®¿é®è¿ï¼ä¸ä¹
以åè¯¥æ°æ®å¯è½å次被访é®ãäº§çæ¶é´å±é¨æ§çå
¸ååå ï¼æ¯ç±äºå¨ç¨åºä¸åå¨ç大éçå¾ªç¯æä½ã
2. **空é´å±é¨æ§** ï¼ä¸æ¦ç¨åºè®¿é®äºæä¸ªåå¨åå
ï¼å¨ä¸ä¹
ä¹åï¼å
¶éè¿çåå¨åå
ä¹å°è¢«è®¿é®ï¼å³ç¨åºå¨ä¸æ®µæ¶é´å
æè®¿é®çå°åï¼å¯è½éä¸å¨ä¸å®çèå´ä¹å
ï¼è¿æ¯å 为æä»¤é常æ¯é¡ºåºåæ¾ãé¡ºåºæ§è¡çï¼æ°æ®ä¹ä¸è¬æ¯ä»¥åéãæ°ç»ã表çå½¢å¼ç°èåå¨çã
æ¶é´å±é¨æ§æ¯éè¿å°è¿æ¥ä½¿ç¨çæä»¤åæ°æ®ä¿åå°é«éç¼ååå¨å¨ä¸ï¼å¹¶ä½¿ç¨é«éç¼åç屿¬¡ç»æå®ç°ã空é´å±é¨æ§é常æ¯ä½¿ç¨è¾å¤§çé«éç¼åï¼å¹¶å°é¢åæºå¶éæå°é«éç¼åæ§å¶é»è¾ä¸å®ç°ãèæå
åææ¯å®é
ä¸å°±æ¯å»ºç«äº âå
åä¸å¤åâç两级åå¨å¨çç»æï¼å©ç¨å±é¨æ§åçå®ç°é«éç¼åã
#### èæåå¨å¨
> **å误ï¼èæåå¨å¨åå«åèæå
åï¼é½æ¯ Virtual Memory çç¿»è¯ï¼å±äºåä¸ä¸ªæ¦å¿µã**
ð¨âð»**é¢è¯å®** ï¼~~é½è¯´äºèæå
åäºãä½ å讲讲**èæåå¨å¨**æï¼~~
ð **æ** ï¼
> è¿é¨åå
容æ¥èªï¼[çéèç æä½ç³»ç»ç¥è¯ç¹æ´ç](https://wizardforcel.gitbooks.io/wangdaokaoyan-os/content/13.html)ã
åºäºå±é¨æ§åçï¼å¨ç¨åºè£
å
¥æ¶ï¼å¯ä»¥å°ç¨åºçä¸é¨åè£
å
¥å
åï¼èå°å
¶ä»é¨åçå¨å¤åï¼å°±å¯ä»¥å¯å¨ç¨åºæ§è¡ãç±äºå¤åå¾å¾æ¯å
å大å¾å¤ï¼æä»¥æä»¬è¿è¡ç软件çå
å大å°å®é
䏿¯å¯ä»¥æ¯è®¡ç®æºç³»ç»å®é
çå
å大å°å¤§çãå¨ç¨åºæ§è¡è¿ç¨ä¸ï¼å½æè®¿é®çä¿¡æ¯ä¸å¨å
åæ¶ï¼ç±æä½ç³»ç»å°æéè¦çé¨åè°å
¥å
åï¼ç¶åç»§ç»æ§è¡ç¨åºãå¦ä¸æ¹é¢ï¼æä½ç³»ç»å°å
å䏿æ¶ä¸ä½¿ç¨çå
容æ¢å°å¤åä¸ï¼ä»èè
¾åºç©ºé´åæ¾å°è¦è°å
¥å
åçä¿¡æ¯ãè¿æ ·ï¼è®¡ç®æºå¥½åä¸ºç¨æ·æä¾äºä¸ä¸ªæ¯å®é
å
å大å¾å¤çåå¨å¨ââ**èæåå¨å¨**ã
å®é
ä¸ï¼æè§å¾èæå
ååæ ·æ¯ä¸ç§æ¶é´æ¢ç©ºé´ççç¥ï¼ä½ ç¨ CPU çè®¡ç®æ¶é´ï¼é¡µçè°å
¥è°åºè±è´¹çæ¶é´ï¼æ¢æ¥äºä¸ä¸ªèæçæ´å¤§çç©ºé´æ¥æ¯æç¨åºçè¿è¡ãä¸å¾ä¸æå¹ï¼ç¨åºä¸çå ä¹ä¸æ¯æ¶é´æ¢ç©ºé´å°±æ¯ç©ºé´æ¢æ¶é´ã
#### èæå
åçææ¯å®ç°
ð¨âð»**é¢è¯å®** ï¼**èæå
åææ¯çå®ç°å¢ï¼**
ð **æ** ï¼**èæå
åçå®ç°éè¦å»ºç«å¨ç¦»æ£åé
çå
åç®¡çæ¹å¼çåºç¡ä¸ã** èæå
åçå®ç°æä»¥ä¸ä¸ç§æ¹å¼ï¼
1. **请æ±å页åå¨ç®¡ç** ï¼å»ºç«å¨å页管çä¹ä¸ï¼ä¸ºäºæ¯æèæåå¨å¨åè½èå¢å äºè¯·æ±è°é¡µåè½å页é¢ç½®æ¢åè½ã请æ±å页æ¯ç®åæå¸¸ç¨çä¸ç§å®ç°èæåå¨å¨çæ¹æ³ã请æ±å页åå¨ç®¡çç³»ç»ä¸ï¼å¨ä½ä¸å¼å§è¿è¡ä¹åï¼ä»
è£
å
¥å½åè¦æ§è¡çé¨å段å³å¯è¿è¡ãåå¦å¨ä½ä¸è¿è¡çè¿ç¨ä¸åç°è¦è®¿é®ç页é¢ä¸å¨å
åï¼åç±å¤çå¨éç¥æä½ç³»ç»æç
§å¯¹åºç页é¢ç½®æ¢ç®æ³å°ç¸åºç页é¢è°å
¥å°ä¸»åï¼åæ¶æä½ç³»ç»ä¹å¯ä»¥å°ææ¶ä¸ç¨ç页é¢ç½®æ¢å°å¤åä¸ã
2. **请æ±å段åå¨ç®¡ç** ï¼å»ºç«å¨å段åå¨ç®¡çä¹ä¸ï¼å¢å äºè¯·æ±è°æ®µåè½ãåæ®µç½®æ¢åè½ã请æ±å段å¨åç®¡çæ¹å¼å°±å¦å请æ±å页å¨åç®¡çæ¹å¼ä¸æ ·ï¼å¨ä½ä¸å¼å§è¿è¡ä¹åï¼ä»
è£
å
¥å½åè¦æ§è¡çé¨å段å³å¯è¿è¡ï¼å¨æ§è¡è¿ç¨ä¸ï¼å¯ä½¿ç¨è¯·æ±è°å
¥ä¸æå¨æè£
å
¥è¦è®¿é®ä½åä¸å¨å
åçç¨åºæ®µï¼å½å
å空é´å·²æ»¡ï¼èåéè¦è£
å
¥æ°ç段æ¶ï¼æ ¹æ®ç½®æ¢åè½éå½è°åºæä¸ªæ®µï¼ä»¥ä¾¿è
¾åºç©ºé´èè£
å
¥æ°ç段ã
3. **è¯·æ±æ®µé¡µå¼åå¨ç®¡ç**
**è¿éå¤è¯´ä¸ä¸ï¼å¾å¤äººå®¹æææ··è¯·æ±å页ä¸å页åå¨ç®¡çï¼ä¸¤è
æä½ä¸åå¢ï¼**
请æ±å页åå¨ç®¡ç建ç«å¨å页管çä¹ä¸ãä»ä»¬çæ ¹æ¬åºå«æ¯æ¯å¦å°ç¨åºå
¨é¨æéçå
¨é¨å°å空é´é½è£
å
¥ä¸»åï¼è¿ä¹æ¯è¯·æ±å页åå¨ç®¡çå¯ä»¥æä¾èæå
åçåå ï¼æä»¬å¨ä¸é¢å·²ç»åæè¿äºã
å®ä»¬ä¹é´çæ ¹æ¬åºå«å¨äºæ¯å¦å°ä¸ä½ä¸çå
¨é¨å°å空é´åæ¶è£
å
¥ä¸»åã请æ±å页åå¨ç®¡çä¸è¦æ±å°ä½ä¸å
¨é¨å°å空é´åæ¶è£
å
¥ä¸»åãåºäºè¿ä¸ç¹ï¼è¯·æ±å页åå¨ç®¡çå¯ä»¥æä¾èåï¼èå页åå¨ç®¡çå´ä¸è½æä¾èåã
ä¸ç®¡æ¯ä¸é¢é£ç§å®ç°æ¹å¼ï¼æä»¬ä¸è¬é½éè¦ï¼
1. ä¸å®å®¹éçå
ååå¤åï¼å¨è½½å
¥ç¨åºçæ¶åï¼åªéè¦å°ç¨åºçä¸é¨åè£
å
¥å
åï¼èå°å
¶ä»é¨åçå¨å¤åï¼ç¶åç¨åºå°±å¯ä»¥æ§è¡äºï¼
2. **ç¼ºé¡µä¸æ**ï¼å¦æ**éæ§è¡çæä»¤æè®¿é®çæ°æ®å°æªå¨å
å**ï¼ç§°ä¸ºç¼ºé¡µæç¼ºæ®µï¼ï¼åç±å¤çå¨éç¥æä½ç³»ç»å°ç¸åºçé¡µé¢ææ®µ**è°å
¥å°å
å**ï¼ç¶åç»§ç»æ§è¡ç¨åºï¼
3. **èæå°å空é´** ï¼é»è¾å°åå°ç©çå°åç忢ã
#### 页é¢ç½®æ¢ç®æ³
ð¨âð»**é¢è¯å®** ï¼èæå
å管çå¾éè¦çä¸ä¸ªæ¦å¿µå°±æ¯é¡µé¢ç½®æ¢ç®æ³ãé£ä½ 说ä¸ä¸ **页é¢ç½®æ¢ç®æ³çä½ç¨?常è§ç页é¢ç½®æ¢ç®æ³æåªäº?**
ð **æ** ï¼
> è¿ä¸ªé¢ç®ç»å¸¸ä½ä¸ºç¬è¯é¢åºç°ï¼ç½ä¸å·²ç»ç»åºäºå¾ä¸éçåçï¼æè¿éåªæ¯æ»ç»æ´çäºä¸ä¸ã
å°åæ å°è¿ç¨ä¸ï¼è¥å¨é¡µé¢ä¸åç°æè¦è®¿é®ç页é¢ä¸å¨å
åä¸ï¼ååçç¼ºé¡µä¸æ ã
> **ç¼ºé¡µä¸æ** å°±æ¯è¦è®¿é®ç**页**ä¸å¨ä¸»åï¼éè¦æä½ç³»ç»å°å
¶è°å
¥ä¸»åååè¿è¡è®¿é®ã å¨è¿ä¸ªæ¶åï¼è¢«å
åæ å°çæä»¶å®é
䏿äºä¸ä¸ªåé¡µäº¤æ¢æä»¶ã
å½åçç¼ºé¡µä¸ææ¶ï¼å¦æå½åå
åä¸å¹¶æ²¡æç©ºé²ç页é¢ï¼æä½ç³»ç»å°±å¿
é¡»å¨å
åéæ©ä¸ä¸ªé¡µé¢å°å
¶ç§»åºå
åï¼ä»¥ä¾¿ä¸ºå³å°è°å
¥ç页é¢è®©åºç©ºé´ãç¨æ¥éæ©æ·æ±°åªä¸é¡µçè§åå«å页é¢ç½®æ¢ç®æ³ï¼æä»¬å¯ä»¥æé¡µé¢ç½®æ¢ç®æ³çææ¯æ·æ±°é¡µé¢çè§åã
- **OPT 页é¢ç½®æ¢ç®æ³ï¼æä½³é¡µé¢ç½®æ¢ç®æ³ï¼** ï¼æä½³(Optimal, OPT)ç½®æ¢ç®æ³æéæ©çè¢«æ·æ±°é¡µé¢å°æ¯ä»¥åæ°¸ä¸ä½¿ç¨çï¼æè
æ¯å¨æé¿æ¶é´å
ä¸å被访é®ç页é¢,è¿æ ·å¯ä»¥ä¿è¯è·å¾æä½ç缺页çãä½ç±äºäººä»¬ç®åæ æ³é¢ç¥è¿ç¨å¨å
åä¸çè¥å页é¢ä¸åªä¸ªæ¯æªæ¥æé¿æ¶é´å
ä¸å被访é®çï¼å èè¯¥ç®æ³æ æ³å®ç°ãä¸è¬ä½ä¸ºè¡¡éå
¶ä»ç½®æ¢ç®æ³çæ¹æ³ã
- **FIFOï¼First In First Outï¼ é¡µé¢ç½®æ¢ç®æ³ï¼å
è¿å
åºé¡µé¢ç½®æ¢ç®æ³ï¼** : æ»æ¯æ·æ±°æå
è¿å
¥å
åç页é¢ï¼å³éæ©å¨å
åä¸é©»çæ¶é´æä¹
ç页é¢è¿è¡æ·æ±°ã
- **LRU ï¼Least Recently Usedï¼é¡µé¢ç½®æ¢ç®æ³ï¼æè¿æä¹
æªä½¿ç¨é¡µé¢ç½®æ¢ç®æ³ï¼** ï¼LRU ç®æ³èµäºæ¯ä¸ªé¡µé¢ä¸ä¸ªè®¿é®å段ï¼ç¨æ¥è®°å½ä¸ä¸ªé¡µé¢èªä¸æ¬¡è¢«è®¿é®ä»¥æ¥æç»åçæ¶é´ Tï¼å½é¡»æ·æ±°ä¸ä¸ªé¡µé¢æ¶ï¼éæ©ç°æé¡µé¢ä¸å
¶ T 弿大çï¼å³æè¿æä¹
æªä½¿ç¨ç页é¢äºä»¥æ·æ±°ã
- **LFU ï¼Least Frequently Usedï¼é¡µé¢ç½®æ¢ç®æ³ï¼æå°ä½¿ç¨é¡µé¢ç½®æ¢ç®æ³ï¼** : 该置æ¢ç®æ³éæ©å¨ä¹åæ¶æä½¿ç¨æå°ç页é¢ä½ä¸ºæ·æ±°é¡µã
## 3.3 æ°æ®ç»æ
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
æ°æ®ç»æè¿é¨åçåºç¡ç¥è¯å·²ç»æ»ç»å®æã
ç±äºç¯å¹
é®é¢ï¼è¿éç´æ¥æ¾ JavaGuide å¨çº¿ç½ç«ç½ç«ä¸çæç« 龿¥ï¼å°ä¼ä¼´å¯ä»¥æ ¹æ®ä¸ªäººéæ±èªè¡å¦ä¹ ï¼
- [çº¿æ§æ°æ®ç»æ :æ°ç»ãé¾è¡¨ãæ ãéå](https://javaguide.cn/cs-basics/data-structure/linear-data-structure.html)
- [å¾](https://javaguide.cn/cs-basics/data-structure/graph.html)
- [å ](https://javaguide.cn/cs-basics/data-structure/heap.html)
- [æ ](https://javaguide.cn/cs-basics/data-structure/tree.html)
- [çº¢é»æ ](https://javaguide.cn/cs-basics/data-structure/red-black-tree.html)
- [å¸éè¿æ»¤å¨](https://javaguide.cn/cs-basics/data-structure/bloom-filter.html)

## 3.3 ç®æ³
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
ç®æ³è¿é¨åç®åå·²ç»æ»ç»äºé¨ååºç¡ç常è§çç®æ³é¢è¯é¢ã
ç±äºç¯å¹
é®é¢ï¼è¿éç´æ¥æ¾ç½ç«ä¸çæç« 龿¥ï¼å°ä¼ä¼´å¯ä»¥æ ¹æ®ä¸ªäººéæ±èªè¡å¦ä¹ ï¼
- [å é常è§çåç¬¦ä¸²ç®æ³é¢](https://javaguide.cn/cs-basics/algorithms/string-algorithm-problems.html)
- [å é常è§çé¾è¡¨ç®æ³é¢](https://javaguide.cn/cs-basics/algorithms/linkedlist-algorithm-problems.html)
- [åæofferé¨åç¼ç¨é¢](https://javaguide.cn/cs-basics/algorithms/the-sword-refers-to-offer.html)
- [å大ç»å
¸æåºç®æ³æ»ç»](https://javaguide.cn/cs-basics/algorithms/10-classical-sorting-algorithms.html)
------
# 4. æ°æ®åº
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
## 4.1 æ°æ®åºåºç¡
æ°æ®åºç¥è¯åºç¡ï¼è¿é¨åå
容ä¸å®è¦ç解记å¿ãè½ç¶è¿é¨åå
å®¹åªæ¯ç论ç¥è¯ï¼ä½æ¯é常éè¦ï¼è¿æ¯åé¢å¦ä¹ MySQL æ°æ®åºçåºç¡ãPS: è¿é¨åå
容ç±äºæ¶åå¤ªå¤æ¦å¿µæ§å
å®¹ï¼æä»¥åèäºç»´åºç¾ç§åç¾åº¦ç¾ç§ç¸åºçä»ç»ã
### ä»ä¹æ¯æ°æ®åº, æ°æ®åºç®¡çç³»ç», æ°æ®åºç³»ç», æ°æ®åºç®¡çå?
* **æ°æ®åº** : æ°æ®åº(DataBase ç®ç§° DB)å°±æ¯ä¿¡æ¯çéåæè
è¯´æ°æ®åºæ¯ç±æ°æ®åºç®¡çç³»ç»ç®¡ççæ°æ®çéåã
* **æ°æ®åºç®¡çç³»ç»** : æ°æ®åºç®¡çç³»ç»(Database Management System ç®ç§° DBMS)æ¯ä¸ç§æçºµåç®¡çæ°æ®åºç大å软件ï¼é常ç¨äºå»ºç«ã使ç¨åç»´æ¤æ°æ®åºã
* **æ°æ®åºç³»ç»** : æ°æ®åºç³»ç»(Data Base Systemï¼ç®ç§° DBS)é常ç±è½¯ä»¶ãæ°æ®åºåæ°æ®ç®¡çå(DBA)ç»æã
* **æ°æ®åºç®¡çå** : æ°æ®åºç®¡çå(Database Administrator, ç®ç§° DBA)è´è´£å
¨é¢ç®¡çåæ§å¶æ°æ®åºç³»ç»ã
æ°æ®åºç³»ç»åºæ¬ææå¦ä¸å¾æç¤ºï¼

### ä»ä¹æ¯å
ç», ç , åéç , 主ç , å¤ç , 䏻屿§, é䏻屿§ï¼
* **å
ç»** ï¼ å
ç»ï¼tupleï¼æ¯å
³ç³»æ°æ®åºä¸çåºæ¬æ¦å¿µï¼å
³ç³»æ¯ä¸å¼ 表ï¼è¡¨ä¸çæ¯è¡ï¼å³æ°æ®åºä¸çæ¯æ¡è®°å½ï¼å°±æ¯ä¸ä¸ªå
ç»ï¼æ¯åå°±æ¯ä¸ä¸ªå±æ§ã å¨äºç»´è¡¨éï¼å
ç»ä¹ç§°ä¸ºè¡ã
* **ç ** ï¼ç å°±æ¯è½å¯ä¸æ è¯å®ä½ç屿§ï¼å¯¹åºè¡¨ä¸çåã
* **åéç ** ï¼ è¥å
³ç³»ä¸çæä¸å±æ§æå±æ§ç»çå¼è½å¯ä¸çæ è¯ä¸ä¸ªå
ç»ï¼èå
¶ä»»ä½ãåéé½ä¸è½åæ è¯ï¼åç§°è¯¥å±æ§ç»ä¸ºåéç ãä¾å¦ï¼å¨å¦çå®ä½ä¸ï¼âå¦å·âæ¯è½å¯ä¸çåºåå¦çå®ä½çï¼åæ¶åå设âå§åâãâç级âç屿§ç»å足以åºåå¦çå®ä½ï¼é£ä¹{å¦å·}å{å§åï¼ç级}齿¯åéç ã
* **主ç ** : 主ç ä¹å«ä¸»é®ãä¸»ç æ¯ä»åéç ä¸éåºæ¥çã ä¸ä¸ªå®ä½éä¸åªè½æä¸ä¸ªä¸»ç ï¼ä½å¯ä»¥æå¤ä¸ªåéç ã
* **å¤ç ** : å¤ç ä¹å«å¤é®ã妿ä¸ä¸ªå
³ç³»ä¸çä¸ä¸ªå±æ§æ¯å¦å¤ä¸ä¸ªå
³ç³»ä¸ç主ç åè¿ä¸ªå±æ§ä¸ºå¤ç ã
* **䏻屿§** ï¼ åéç ä¸åºç°è¿ç屿§ç§°ä¸ºä¸»å±æ§ãæ¯å¦å
³ç³» 工人ï¼å·¥å·ï¼èº«ä»½è¯å·ï¼å§åï¼æ§å«ï¼é¨é¨ï¼. æ¾ç¶å·¥å·å身份è¯å·é½è½å¤å¯ä¸æ 示è¿ä¸ªå
³ç³»ï¼æä»¥é½æ¯åéç ãå·¥å·ã身份è¯å·è¿ä¸¤ä¸ªå±æ§å°±æ¯ä¸»å±æ§ãå¦æä¸»ç æ¯ä¸ä¸ªå±æ§ç»ï¼é£ä¹å±æ§ç»ä¸ç屿§é½æ¯ä¸»å±æ§ã
* **é䏻屿§ï¼** ä¸å
å«å¨ä»»ä½ä¸ä¸ªåéç ä¸ç屿§ç§°ä¸ºé䏻屿§ãæ¯å¦å¨å
³ç³»ââå¦çï¼å¦å·ï¼å§åï¼å¹´é¾ï¼æ§å«ï¼ç级ï¼ä¸ï¼ä¸»ç æ¯âå¦å·âï¼é£ä¹å
¶ä»çâå§åâãâå¹´é¾âãâæ§å«âãâç级âå°±é½å¯ä»¥ç§°ä¸ºé䏻屿§ã
### 主é®åå¤é®æä»ä¹åºå«?
* **主é®(主ç )** ï¼ä¸»é®ç¨äºå¯ä¸æ è¯ä¸ä¸ªå
ç»ï¼ä¸è½æéå¤ï¼ä¸å
许为空ãä¸ä¸ªè¡¨åªè½æä¸ä¸ªä¸»é®ã
* **å¤é®(å¤ç )** ï¼å¤é®ç¨æ¥åå
¶ä»è¡¨å»ºç«èç³»ç¨ï¼å¤é®æ¯å¦ä¸è¡¨ç主é®ï¼å¤é®æ¯å¯ä»¥æéå¤çï¼å¯ä»¥æ¯ç©ºå¼ãä¸ä¸ªè¡¨å¯ä»¥æå¤ä¸ªå¤é®ã
### 为ä»ä¹ä¸æ¨è使ç¨å¤é®ä¸çº§èï¼
对äºå¤é®å级èï¼é¿éå·´å·´å¼åæåè¿æ ·è¯´å°ï¼
> ã强å¶ãä¸å¾ä½¿ç¨å¤é®ä¸çº§èï¼ä¸åå¤é®æ¦å¿µå¿
é¡»å¨åºç¨å±è§£å³ã
>
> 说æ: 以å¦çåæç»©çå
³ç³»ä¸ºä¾ï¼å¦ç表ä¸ç student_id æ¯ä¸»é®ï¼é£ä¹æç»©è¡¨ä¸ç student_id å为å¤é®ãå¦ææ´æ°å¦ç表ä¸ç student_idï¼åæ¶è§¦åæç»©è¡¨ä¸ç student_id æ´æ°ï¼å³ä¸ºçº§èæ´æ°ãå¤é®ä¸çº§èæ´æ°éç¨äºåæºä½å¹¶åï¼ä¸éååå¸å¼ãé«å¹¶åé群; çº§èæ´æ°æ¯å¼ºé»å¡ï¼å卿°æ®åºæ´æ°é£æ´çé£ é©; å¤é®å½±åæ°æ®åºçæå
¥é度
为ä»ä¹ä¸è¦ç¨å¤é®å¢ï¼å¤§é¨å人å¯è½ä¼è¿æ ·åçï¼
> 1. **å¢å äºå¤ææ§ï¼** a. æ¯æ¬¡åDELETE æè
UPDATEé½å¿
é¡»èèå¤é®çº¦æï¼ä¼å¯¼è´å¼åçæ¶åå¾çè¦, æµè¯æ°æ®æä¸ºä¸æ¹ä¾¿; b. å¤é®ç主ä»å
³ç³»æ¯å®çï¼åå¦é£å¤©éæ±æååï¼æ°æ®åºä¸çè¿ä¸ªåæ®µæ ¹æ¬ä¸éè¦åå
¶ä»è¡¨æå
³èçè¯å°±ä¼å¢å å¾å¤éº»ç¦ã
> 2. **å¢å äºé¢å¤å·¥ä½**ï¼ æ°æ®åºéè¦å¢å ç»´æ¤å¤é®çå·¥ä½ï¼æ¯å¦å½æä»¬åä¸äºæ¶åå¤é®å段çå¢ï¼å ï¼æ´æ°æä½ä¹åï¼éè¦è§¦åç¸å
³æä½å»æ£æ¥ï¼ä¿è¯æ°æ®ççä¸è´æ§åæ£ç¡®æ§ï¼è¿æ ·ä¼ä¸å¾ä¸æ¶èèµæºï¼ï¼ä¸ªäººè§å¾è¿ä¸ªä¸æ¯ä¸ç¨å¤é®çåå ï¼å 为å³ä½¿ä½ ä¸ä½¿ç¨å¤é®ï¼ä½ å¨åºç¨å±é¢ä¹è¿æ¯è¦ä¿è¯çãæä»¥ï¼æè§å¾è¿ä¸ªå½±åå¯ä»¥å¿½ç¥ä¸è®¡ãï¼
> 4. **对ååºå表ä¸å好** ï¼å 为ååºå表ä¸å¤é®æ¯æ æ³çæçã
> 5. ......
æä¸ªäººè§å¾ä¸é¢è¿ç§åç䏿¯ç¹å«çå
¨é¢ï¼åªæ¯è¯´äºå¤é®åå¨çä¸ä¸ªå¸¸è§çé®é¢ãå®é
ä¸ï¼æä»¬ç¥éå¤é®ä¹æ¯æå¾å¤å¥½å¤çï¼æ¯å¦ï¼
1. ä¿è¯äºæ°æ®åºæ°æ®çä¸è´æ§å宿´æ§ï¼
2. 级èæä½æ¹ä¾¿ï¼åè½»äºç¨åºä»£ç éï¼
3. ......
æä»¥è¯´ï¼ä¸è¦ä¸è¡èçå°±æå¼äºå¤é®è¿ä¸ªæ¦å¿µï¼æ¢ç¶å®åå¨å°±æå®åå¨çéçï¼å¦æç³»ç»ä¸æ¶åååºå表ï¼å¹¶åé䏿¯å¾é«çæ
åµè¿æ¯å¯ä»¥èè使ç¨å¤é®çã
### ä»ä¹æ¯ ER å¾ï¼
> æä»¬åä¸ä¸ªé¡¹ç®çæ¶åä¸å®è¦è¯çç» ER 徿¥ææ¸
æ°æ®åºè®¾è®¡ï¼è¿ä¸ªä¹æ¯é¢è¯å®é®ä½ 项ç®çæ¶åç»å¸¸ä¼è¢«é®éçã
**E-R å¾** ä¹ç§°å®ä½-èç³»å¾(Entity Relationship Diagram)ï¼æä¾äºè¡¨ç¤ºå®ä½ç±»åã屿§åèç³»çæ¹æ³ï¼ç¨æ¥æè¿°ç°å®ä¸ççæ¦å¿µæ¨¡åã 宿¯æè¿°ç°å®ä¸çå
³ç³»æ¦å¿µæ¨¡åçæææ¹æ³ã æ¯è¡¨ç¤ºæ¦å¿µå
³ç³»æ¨¡åçä¸ç§æ¹å¼ã
ä¸å¾æ¯ä¸ä¸ªå¦çé课ç ER å¾ï¼æ¯ä¸ªå¦çå¯ä»¥éè¥å¹²é¨è¯¾ç¨ï¼åä¸é¨è¯¾ç¨ä¹å¯ä»¥è¢«è¥å¹²äººéæ©ï¼æä»¥å®ä»¬ä¹é´çå
³ç³»æ¯å¤å¯¹å¤ï¼M: Nï¼ãå¦å¤ï¼è¿æå
¶ä»ä¸¤ç§å
³ç³»æ¯ï¼1 对 1ï¼1:1ï¼ã1 对å¤ï¼1: Nï¼ã

æä»¬è¯çå°ä¸é¢ç ER å¾è½¬æ¢ææ°æ®åºå®é
çå
³ç³»æ¨¡å(å®é
设计ä¸ï¼æä»¬é常ä¼å°ä»»è¯¾æå¸ä¹ä½ä¸ºä¸ä¸ªå®ä½æ¥å¤ç)ï¼

### æ°æ®åºèå¼äºè§£å?
**1NF(第ä¸èå¼)**
屿§ï¼å¯¹åºäºè¡¨ä¸çåæ®µï¼ä¸è½å被åå²ï¼ä¹å°±æ¯è¿ä¸ªå段åªè½æ¯ä¸ä¸ªå¼ï¼ä¸è½åå为å¤ä¸ªå
¶ä»çåæ®µäºã**1NF æ¯ææå
³ç³»åæ°æ®åºçæåºæ¬è¦æ±** ï¼ä¹å°±æ¯è¯´å
³ç³»åæ°æ®åºä¸å建ç表ä¸å®æ»¡è¶³ç¬¬ä¸èå¼ã
**2NF(第äºèå¼)**
2NF å¨ 1NF çåºç¡ä¹ä¸ï¼æ¶é¤äºé䏻屿§å¯¹äºç çé¨å彿°ä¾èµãå¦ä¸å¾æç¤ºï¼å±ç¤ºäºç¬¬ä¸èå¼å°ç¬¬äºèå¼çè¿æ¸¡ã第äºèå¼å¨ç¬¬ä¸èå¼çåºç¡ä¸å¢å äºä¸ä¸ªåï¼è¿ä¸ªå称为主é®ï¼é䏻屿§é½ä¾èµäºä¸»é®ã

ä¸äºéè¦çæ¦å¿µï¼
* **彿°ä¾èµï¼functional dependencyï¼** ï¼è¥å¨ä¸å¼ 表ä¸ï¼å¨å±æ§ï¼æå±æ§ç»ï¼X çå¼ç¡®å®çæ
åµä¸ï¼å¿
å®è½ç¡®å®å±æ§ Y çå¼ï¼é£ä¹å°±å¯ä»¥è¯´ Y 彿°ä¾èµäº Xï¼åä½ X â Yã
* **é¨å彿°ä¾èµï¼partial functional dependencyï¼** ï¼å¦æ XâYï¼å¹¶ä¸åå¨ X çä¸ä¸ªçåé X0ï¼ä½¿å¾ X0âYï¼åç§° Y 对 X é¨å彿°ä¾èµãæ¯å¦å¦çåºæ¬ä¿¡æ¯è¡¨ R ä¸ï¼å¦å·ï¼èº«ä»½è¯å·ï¼å§åï¼å½ç¶å¦å·å±æ§å弿¯å¯ä¸çï¼å¨ R å
³ç³»ä¸ï¼ï¼å¦å·ï¼èº«ä»½è¯å·ï¼->ï¼å§åï¼ï¼ï¼å¦å·ï¼->ï¼å§åï¼ï¼ï¼èº«ä»½è¯å·ï¼->ï¼å§åï¼ï¼æä»¥å§åé¨å彿°ä¾èµä¸ï¼å¦å·ï¼èº«ä»½è¯å·ï¼ï¼
* **å®å
¨å½æ°ä¾èµ(Full functional dependency)** ï¼å¨ä¸ä¸ªå
³ç³»ä¸ï¼è¥æä¸ªé䏻屿§æ°æ®é¡¹ä¾èµäºå
¨é¨å
³é®åç§°ä¹ä¸ºå®å
¨å½æ°ä¾èµãæ¯å¦å¦çåºæ¬ä¿¡æ¯è¡¨ Rï¼å¦å·ï¼ç级ï¼å§åï¼å设ä¸åçç级å¦å·æç¸åçï¼ç级å
å¦å·ä¸è½ç¸åï¼å¨ R å
³ç³»ä¸ï¼ï¼å¦å·ï¼ç级ï¼->ï¼å§åï¼ï¼ä½æ¯ï¼å¦å·ï¼->(å§å)䏿ç«ï¼ï¼ç级ï¼->(å§å)䏿ç«ï¼æä»¥å§åå®å
¨å½æ°ä¾èµä¸ï¼å¦å·ï¼ç级ï¼ï¼
* **ä¼ é彿°ä¾èµ** ï¼ å¨å
³ç³»æ¨¡å¼ R(U)ä¸ï¼è®¾ Xï¼Yï¼Z æ¯ U çä¸åç屿§åéï¼å¦æ X ç¡®å® YãY ç¡®å® Zï¼ä¸æ X ä¸å
å« Yï¼Y ä¸ç¡®å® Xï¼ï¼XâªYï¼â©Z=空éåï¼åç§° Z ä¼ é彿°ä¾èµ(transitive functional dependency) äº Xãä¼ é彿°ä¾èµä¼å¯¼è´æ°æ®åä½åå¼å¸¸ãä¼ é彿°ä¾èµç Y å Z åéå¾å¾åå±äºæä¸ä¸ªäºç©ï¼å æ¤å¯å°å
¶åå¹¶æ¾å°ä¸ä¸ªè¡¨ä¸ãæ¯å¦å¨å
³ç³» R(å¦å· , å§å, ç³»åï¼ç³»ä¸»ä»»)ä¸ï¼å¦å· â ç³»åï¼ç³»å â ç³»ä¸»ä»»ï¼æä»¥åå¨é䏻屿§ç³»ä¸»ä»»å¯¹äºå¦å·çä¼ é彿°ä¾èµãã
**3NF(第ä¸èå¼)**
3NF å¨ 2NF çåºç¡ä¹ä¸ï¼æ¶é¤äºé䏻屿§å¯¹äºç çä¼ é彿°ä¾èµ ã符å 3NF è¦æ±çæ°æ®åºè®¾è®¡ï¼**åºæ¬**ä¸è§£å³äºæ°æ®åä½è¿å¤§ï¼æå
¥å¼å¸¸ï¼ä¿®æ¹å¼å¸¸ï¼å é¤å¼å¸¸çé®é¢ãæ¯å¦å¨å
³ç³» R(å¦å· , å§å, ç³»åï¼ç³»ä¸»ä»»)ä¸ï¼å¦å· â ç³»åï¼ç³»å â ç³»ä¸»ä»»ï¼æä»¥åå¨é䏻屿§ç³»ä¸»ä»»å¯¹äºå¦å·çä¼ é彿°ä¾èµï¼æä»¥è¯¥è¡¨ç设计ï¼ä¸ç¬¦å 3NF çè¦æ±ã
**æ»ç»**
* 1NFï¼å±æ§ä¸å¯ååã
* 2NFï¼1NF çåºç¡ä¹ä¸ï¼æ¶é¤äºé䏻屿§å¯¹äºç çé¨å彿°ä¾èµã
* 3NFï¼3NF å¨ 2NF çåºç¡ä¹ä¸ï¼æ¶é¤äºé䏻屿§å¯¹äºç çä¼ é彿°ä¾èµ ã
### ä»ä¹æ¯åå¨è¿ç¨?
æä»¬å¯ä»¥æåå¨è¿ç¨çææ¯ä¸äº SQL è¯å¥çéåï¼ä¸é´å äºç¹é»è¾æ§å¶è¯å¥ãåå¨è¿ç¨å¨ä¸å¡æ¯è¾å¤æçæ¶åæ¯é常å®ç¨çï¼æ¯å¦å¾å¤æ¶åæä»¬å®æä¸ä¸ªæä½å¯è½éè¦åä¸å¤§ä¸² SQL è¯å¥ï¼è¿æ¶åæä»¬å°±å¯ä»¥åæä¸ä¸ªåå¨è¿ç¨ï¼è¿æ ·ä¹æ¹ä¾¿äºæä»¬ä¸ä¸æ¬¡çè°ç¨ãåå¨è¿ç¨ä¸æ¦è°è¯å®æéè¿åå°±è½ç¨³å®è¿è¡ï¼å¦å¤ï¼ä½¿ç¨åå¨è¿ç¨æ¯å纯 SQL è¯å¥æ§è¡è¦å¿«ï¼å 为åå¨è¿ç¨æ¯é¢ç¼è¯è¿çã
åå¨è¿ç¨å¨äºèç½å
¬å¸åºç¨ä¸å¤ï¼å 为åå¨è¿ç¨é¾ä»¥è°è¯åæ©å±ï¼è䏿²¡æç§»æ¤æ§ï¼è¿ä¼æ¶èæ°æ®åºèµæºã
é¿éå·´å·´ Java å¼åæåéè¦æ±ç¦æ¢ä½¿ç¨åå¨è¿ç¨ã

### dropãdelete ä¸ truncate åºå«ï¼
#### ç¨æ³ä¸å
* drop(䏢弿°æ®): `drop table 表å` ï¼ç´æ¥å°è¡¨é½å 餿ï¼å¨å é¤è¡¨çæ¶å使ç¨ã
* truncate (æ¸
ç©ºæ°æ®) : `truncate table 表å` ï¼åªå é¤è¡¨ä¸çæ°æ®ï¼åæå
¥æ°æ®çæ¶åèªå¢é¿ id åä» 1 å¼å§ï¼å¨æ¸
ç©ºè¡¨ä¸æ°æ®çæ¶å使ç¨ã
* deleteï¼å 餿°æ®ï¼ : `delete from 表å where åå=å¼`ï¼å 餿ä¸è¡çæ°æ®ï¼å¦æä¸å where åå¥å`truncate table 表å`ä½ç¨ç±»ä¼¼ã
truncate åä¸å¸¦ where åå¥ç deleteã以å drop é½ä¼å é¤è¡¨å
çæ°æ®ï¼ä½æ¯ **truncate å delete åªå 餿°æ®ä¸å é¤è¡¨çç»æ(å®ä¹)ï¼æ§è¡ drop è¯å¥ï¼æ¤è¡¨çç»æä¹ä¼å é¤ï¼ä¹å°±æ¯æ§è¡ drop ä¹å对åºç表ä¸å¤åå¨ã**
#### å±äºä¸åçæ°æ®åºè¯è¨
truncate å drop å±äº DDL(æ°æ®å®ä¹è¯è¨)è¯å¥ï¼æä½ç«å³çæï¼åæ°æ®ä¸æ¾å° rollback segment ä¸ï¼ä¸è½åæ»ï¼æä½ä¸è§¦å triggerãè delete è¯å¥æ¯ DML (æ°æ®åºæä½è¯è¨)è¯å¥ï¼è¿ä¸ªæä½ä¼æ¾å° rollback segement ä¸ï¼äºå¡æäº¤ä¹åæçæã
**DML è¯å¥å DDL è¯å¥åºå«ï¼**
* DML æ¯æ°æ®åºæä½è¯è¨ï¼Data Manipulation Languageï¼ç缩åï¼æ¯æå¯¹æ°æ®åºä¸è¡¨è®°å½çæä½ï¼ä¸»è¦å
æ¬è¡¨è®°å½çæå
¥ï¼insertï¼ãæ´æ°ï¼updateï¼ãå é¤ï¼deleteï¼åæ¥è¯¢ï¼selectï¼ï¼æ¯å¼åäººåæ¥å¸¸ä½¿ç¨æé¢ç¹çæä½ã
* DDL ï¼Data Definition Languageï¼æ¯æ°æ®å®ä¹è¯è¨ç缩åï¼ç®åæ¥è¯´ï¼å°±æ¯å¯¹æ°æ®åºå
é¨ç对象è¿è¡å建ãå é¤ãä¿®æ¹çæä½è¯è¨ãå®å DML è¯è¨çæå¤§åºå«æ¯ DML åªæ¯å¯¹è¡¨å
鍿°æ®çæä½ï¼è䏿¶åå°è¡¨çå®ä¹ãç»æçä¿®æ¹ï¼æ´ä¸ä¼æ¶åå°å
¶ä»å¯¹è±¡ãDDL è¯å¥æ´å¤çè¢«æ°æ®åºç®¡çåï¼DBAï¼æä½¿ç¨ï¼ä¸è¬çå¼å人åå¾å°ä½¿ç¨ã
> ç±äº`select`ä¸ä¼å¯¹è¡¨è¿è¡ç ´åï¼æä»¥æçå°æ¹ä¹ä¼æ`select`åç¬åºåå¼å«åæ°æ®åºæ¥è¯¢è¯è¨DQLï¼Data Query Languageï¼
#### æ§è¡é度ä¸å
ä¸è¬æ¥è¯´ï¼drop > truncate > deleteï¼è¿ä¸ªææ²¡æè®¾è®¡æµè¯è¿ï¼ã
> `delete`å½ä»¤æ§è¡çæ¶åä¼äº§çæ°æ®åºç`binlog`æ¥å¿ï¼èæ¥å¿è®°å½æ¯éè¦æ¶èæ¶é´çï¼ä½æ¯ä¹æä¸ªå¥½å¤æ¹ä¾¿æ°æ®åæ»æ¢å¤ã
>
> `truncate`å½ä»¤æ§è¡çæ¶åä¸ä¼äº§çæ°æ®åºæ¥å¿ï¼å æ¤æ¯`delete`è¦å¿«ã餿¤ä¹å¤ï¼è¿ä¼æè¡¨çèªå¢å¼éç½®åç´¢å¼æ¢å¤å°åå§å¤§å°çã
>
> `drop`å½ä»¤ä¼æè¡¨å ç¨ç空é´å
¨é¨éæ¾æã
>
> Tipsï¼ä½ åºè¯¥æ´å¤å°å
³æ³¨å¨ä½¿ç¨åºæ¯ä¸ï¼è䏿¯æ§è¡æçã
### æ°æ®åºè®¾è®¡é常å为åªå æ¥?
1. **éæ±åæ** : åæç¨æ·çéæ±ï¼å
æ¬æ°æ®ãåè½åæ§è½éæ±ã
2. **æ¦å¿µç»æè®¾è®¡** : 主è¦éç¨ E-R 模åè¿è¡è®¾è®¡ï¼å
æ¬ç» E-R å¾ã
3. **é»è¾ç»æè®¾è®¡** : éè¿å° E-R å¾è½¬æ¢æè¡¨ï¼å®ç°ä» E-R 模åå°å
³ç³»æ¨¡åç转æ¢ã
4. **ç©çç»æè®¾è®¡** : ä¸»è¦æ¯ä¸ºæè®¾è®¡çæ°æ®åºéæ©åéçåå¨ç»æåååè·¯å¾ã
5. **æ°æ®åºå®æ½** : å
æ¬ç¼ç¨ãæµè¯åè¯è¿è¡
6. **æ°æ®åºçè¿è¡åç»´æ¤** : ç³»ç»çè¿è¡ä¸æ°æ®åºçæ¥å¸¸ç»´æ¤ã
## 4.2 MySQL
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼

### MySQL åºç¡
#### å
³ç³»åæ°æ®åºä»ç»
顾åæä¹ï¼å
³ç³»åæ°æ®åºå°±æ¯ä¸ç§å»ºç«å¨å
³ç³»æ¨¡åçåºç¡ä¸çæ°æ®åºãå
³ç³»æ¨¡å表æäºæ°æ®åºä¸æåå¨çæ°æ®ä¹é´çèç³»ï¼ä¸å¯¹ä¸ãä¸å¯¹å¤ãå¤å¯¹å¤ï¼ã
å
³ç³»åæ°æ®åºä¸ï¼æä»¬çæ°æ®é½è¢«åæ¾å¨äºåç§è¡¨ä¸ï¼æ¯å¦ç¨æ·è¡¨ï¼ï¼è¡¨ä¸çæ¯ä¸è¡å°±åæ¾ç䏿¡æ°æ®ï¼æ¯å¦ä¸ä¸ªç¨æ·çä¿¡æ¯ï¼ã

大é¨åå
³ç³»åæ°æ®åºé½ä½¿ç¨ SQL æ¥æä½æ°æ®åºä¸çæ°æ®ãå¹¶ä¸ï¼å¤§é¨åå
³ç³»åæ°æ®åºé½æ¯æäºå¡çåå¤§ç¹æ§(ACID)ã
**æåªäºå¸¸è§çå
³ç³»åæ°æ®åºå¢ï¼**
MySQLãPostgreSQLãOracleãSQL ServerãSQLiteï¼å¾®ä¿¡æ¬å°çè天记å½çåå¨å°±æ¯ç¨ç SQLiteï¼ ......ã
#### MySQL ä»ç»

**MySQL æ¯ä¸ç§å
³ç³»åæ°æ®åºï¼ä¸»è¦ç¨äºæä¹
åå卿们çç³»ç»ä¸çä¸äºæ°æ®æ¯å¦ç¨æ·ä¿¡æ¯ã**
ç±äº MySQL æ¯å¼æºå
è´¹å¹¶ä¸æ¯è¾æççæ°æ®åºï¼å æ¤ï¼MySQL 被大é使ç¨å¨åç§ç³»ç»ä¸ãä»»ä½äººé½å¯ä»¥å¨ GPL(General Public License) ç许å¯ä¸ä¸è½½å¹¶æ ¹æ®ä¸ªæ§åçéè¦å¯¹å
¶è¿è¡ä¿®æ¹ãMySQL çé»è®¤ç«¯å£å·æ¯**3306**ã
### MySQL åºç¡æ¶æ
ä¸å¾æ¯ MySQL çä¸ä¸ªç®è¦æ¶æå¾ï¼ä»ä¸å¾ä½ å¯ä»¥å¾æ¸
æ°ççå°å®¢æ·ç«¯ç䏿¡ SQL è¯å¥å¨ MySQL å
鍿¯å¦ä½æ§è¡çã

ä»ä¸å¾å¯ä»¥çåºï¼ MySQL 主è¦ç±ä¸é¢å é¨åææï¼
- **è¿æ¥å¨ï¼** 身份认è¯åæéç¸å
³(ç»å½ MySQL çæ¶å)ã
- **æ¥è¯¢ç¼åï¼** æ§è¡æ¥è¯¢è¯å¥çæ¶åï¼ä¼å
æ¥è¯¢ç¼åï¼MySQL 8.0 çæ¬åç§»é¤ï¼å 为è¿ä¸ªåè½ä¸å¤ªå®ç¨ï¼ã
- **åæå¨ï¼** 没æå½ä¸ç¼åçè¯ï¼SQL è¯å¥å°±ä¼ç»è¿åæå¨ï¼åæå¨è¯´ç½äºå°±æ¯è¦å
çä½ ç SQL è¯å¥è¦å¹²åï¼åæ£æ¥ä½ ç SQL è¯å¥è¯æ³æ¯å¦æ£ç¡®ã
- **ä¼åå¨ï¼** æç
§ MySQL 认为æä¼çæ¹æ¡å»æ§è¡ã
- **æ§è¡å¨ï¼** æ§è¡è¯å¥ï¼ç¶åä»åå¨å¼æè¿åæ°æ®ã æ§è¡è¯å¥ä¹åä¼å
夿æ¯å¦ææéï¼å¦ææ²¡ææéçè¯ï¼å°±ä¼æ¥éã
- **æä»¶å¼åå¨å¼æ** ï¼ ä¸»è¦è´è´£æ°æ®çåå¨å读åï¼éç¨çæ¯æä»¶å¼æ¶æï¼æ¯æ InnoDBãMyISAMãMemory çå¤ç§åå¨å¼æã
### MySQL åå¨å¼æ
MySQL æ ¸å¿å¨äºåå¨å¼æï¼æ³è¦æ·±å
¥å¦ä¹ MySQLï¼å¿
å®è¦æ·±å
¥ç ç©¶ MySQL åå¨å¼æã
#### MySQL æ¯æåªäºåå¨å¼æï¼é»è®¤ä½¿ç¨åªä¸ªï¼
MySQL æ¯æå¤ç§åå¨å¼æï¼ä½ å¯ä»¥éè¿ `show engines` å½ä»¤æ¥æ¥ç MySQL æ¯æçææåå¨å¼æã

ä»ä¸å¾æä»¬å¯ä»¥æ¥çåºï¼ MySQL å½åé»è®¤çåå¨å¼ææ¯ InnoDBãå¹¶ä¸ï¼ææçåå¨å¼æä¸åªæ InnoDB æ¯äºå¡æ§åå¨å¼æï¼ä¹å°±æ¯è¯´åªæ InnoDB æ¯æäºå¡ã
æè¿é使ç¨ç MySQL çæ¬æ¯ 8.xï¼ä¸åç MySQL çæ¬ä¹é´å¯è½ä¼æå·®å«ã
MySQL 5.5.5 ä¹åï¼MyISAM æ¯ MySQL çé»è®¤åå¨å¼æã5.5.5 çæ¬ä¹åï¼InnoDB æ¯ MySQL çé»è®¤åå¨å¼æã
ä½ å¯ä»¥éè¿ `select version()` å½ä»¤æ¥çä½ ç MySQL çæ¬ã
```bash
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.27 |
+-----------+
1 row in set (0.00 sec)
```
ä½ ä¹å¯ä»¥éè¿ `show variables like '%storage_engine%'` å½ä»¤ç´æ¥æ¥ç MySQL å½åé»è®¤çåå¨å¼æã

å¦æä½ åªæ³æ¥çæ°æ®åºä¸æä¸ªè¡¨ä½¿ç¨çåå¨å¼æçè¯ï¼å¯ä»¥ä½¿ç¨ `show table status from db_name where name='table_name'`å½ä»¤ã

å¦æä½ æ³è¦æ·±å
¥äºè§£æ¯ä¸ªåå¨å¼æä»¥åå®ä»¬ä¹é´çåºå«ï¼æ¨èä½ å»é
è¯»ä»¥ä¸ MySQL 宿¹ææ¡£å¯¹åºçä»ç»(é¢è¯ä¸ä¼é®è¿ä¹ç»ï¼äºè§£å³å¯)ï¼
- InnoDB åå¨å¼æè¯¦ç»ä»ç»ï¼https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html ã
- å
¶ä»åå¨å¼æè¯¦ç»ä»ç»ï¼https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html ã

#### MySQL åå¨å¼ææ¶æäºè§£åï¼
MySQL åå¨å¼æéç¨çæ¯æä»¶å¼æ¶æï¼æ¯æå¤ç§åå¨å¼æï¼æä»¬çè³å¯ä»¥ä¸ºä¸åçæ°æ®åºè¡¨è®¾ç½®ä¸åçåå¨å¼æä»¥éåºä¸ååºæ¯çéè¦ã**åå¨å¼ææ¯åºäºè¡¨çï¼è䏿¯æ°æ®åºã**
å¹¶ä¸ï¼ä½ è¿å¯ä»¥æ ¹æ® MySQL å®ä¹çåå¨å¼æå®ç°æ 忥壿¥ç¼åä¸ä¸ªå±äºèªå·±çåå¨å¼æãè¿äºé宿¹æä¾çåå¨å¼æå¯ä»¥ç§°ä¸ºç¬¬ä¸æ¹åå¨å¼æï¼åºå«äºå®æ¹åå¨å¼æãåç®åæå¸¸ç¨ç InnoDB å
¶å®åå¼å§å°±æ¯ä¸ä¸ªç¬¬ä¸æ¹åå¨å¼æï¼åé¢ç±äºè¿äºä¼ç§ï¼å
¶è¢« Oracle ç´æ¥æ¶è´äºã
MySQL 宿¹ææ¡£ä¹æä»ç»å°å¦ä½ç¼åä¸ä¸ªèªå®ä¹åå¨å¼æï¼å°åï¼https://dev.mysql.com/doc/internals/en/custom-engine.html ã
#### MyISAM å InnoDB çåºå«æ¯ä»ä¹ï¼

MySQL 5.5 ä¹åï¼MyISAM å¼ææ¯ MySQL çé»è®¤åå¨å¼æï¼å¯è°æ¯é£å
䏿¶ã
è½ç¶ï¼MyISAM çæ§è½è¿è¡ï¼åç§ç¹æ§ä¹è¿ä¸éï¼æ¯å¦å
¨æç´¢å¼ãå缩ã空é´å½æ°çï¼ã使¯ï¼MyISAM 䏿¯æäºå¡åè¡çº§éï¼è䏿大ç缺é·å°±æ¯å´©æºåæ æ³å®å
¨æ¢å¤ã
MySQL 5.5.5 ä¹åï¼MyISAM æ¯ MySQL çé»è®¤åå¨å¼æã5.5.5 çæ¬ä¹åï¼InnoDB æ¯ MySQL çé»è®¤åå¨å¼æã
è¨å½æ£ä¼ ï¼å±ä»¬ä¸é¢è¿æ¯æ¥ç®å对æ¯ä¸ä¸ä¸¤è
ï¼
**1.æ¯å¦æ¯æè¡çº§é**
MyISAM åªæè¡¨çº§é(table-level locking)ï¼è InnoDB æ¯æè¡çº§é(row-level locking)å表级é,é»è®¤ä¸ºè¡çº§éã
ä¹å°±è¯´ï¼MyISAM ä¸éå°±æ¯éä½äºæ´å¼ 表ï¼è¿å¨å¹¶ååçæ
åµä¸æ¯å¤ä¹æ»´æ¨æ¨åï¼è¿ä¹æ¯ä¸ºä»ä¹ InnoDB å¨å¹¶ååçæ¶åï¼æ§è½æ´çç®äºï¼
**2.æ¯å¦æ¯æäºå¡**
MyISAM 䏿ä¾äºå¡æ¯æã
InnoDB æä¾äºå¡æ¯æï¼å®ç°äº SQL æ åå®ä¹äºå个é离级å«ï¼å
·ææäº¤(commit)ååæ»(rollback)äºå¡çè½åãå¹¶ä¸ï¼InnoDB é»è®¤ä½¿ç¨ç REPEATABLE-READï¼å¯é读ï¼éç¦»çº§å«æ¯å¯ä»¥è§£å³å¹»è¯»é®é¢åççï¼åºäº MVCC å Next-Key Lockï¼ã
å
³äº MySQL äºå¡ç详ç»ä»ç»ï¼å¯ä»¥ççæåçè¿ç¯æç« ï¼[MySQL äºå¡é离级å«è¯¦è§£](https://javaguide.cn/database/mysql/transaction-isolation-level.html)ã
**3.æ¯å¦æ¯æå¤é®**
MyISAM 䏿¯æï¼è InnoDB æ¯æã
å¤é®å¯¹äºç»´æ¤æ°æ®ä¸è´æ§é常æå¸®å©ï¼ä½æ¯å¯¹æ§è½æä¸å®çæèãå æ¤ï¼é常æ
åµä¸ï¼æä»¬æ¯ä¸å»ºè®®å¨å®é
ç产项ç®ä¸ä½¿ç¨å¤é®çï¼å¨ä¸å¡ä»£ç ä¸è¿è¡çº¦æå³å¯ï¼
é¿éçãJava å¼åæåã乿¯æç¡®è§å®ç¦æ¢ä½¿ç¨å¤é®çã

ä¸è¿ï¼å¨ä»£ç ä¸è¿è¡çº¦æçè¯ï¼å¯¹ç¨åºåçè½åè¦æ±æ´é«ï¼å
·ä½æ¯å¦è¦éç¨å¤é®è¿æ¯è¦æ ¹æ®ä½ ç项ç®å®é
æ
åµèå®ã
æ»ç»ï¼ä¸è¬æä»¬ä¹æ¯ä¸å»ºè®®å¨æ°æ®åºå±é¢ä½¿ç¨å¤é®çï¼åºç¨å±é¢å¯ä»¥è§£å³ãä¸è¿ï¼è¿æ ·ä¼å¯¹æ°æ®çä¸è´æ§é æå¨èãå
·ä½è¦ä¸è¦ä½¿ç¨å¤é®è¿æ¯è¦æ ¹æ®ä½ çé¡¹ç®æ¥å³å®ã
**4.æ¯å¦æ¯ææ°æ®åºå¼å¸¸å´©æºåçå®å
¨æ¢å¤**
MyISAM 䏿¯æï¼è InnoDB æ¯æã
ä½¿ç¨ InnoDB çæ°æ®åºå¨å¼å¸¸å´©æºåï¼æ°æ®åºéæ°å¯å¨çæ¶åä¼ä¿è¯æ°æ®åºæ¢å¤å°å´©æºåçç¶æãè¿ä¸ªæ¢å¤çè¿ç¨ä¾èµäº `redo log` ã
**5.æ¯å¦æ¯æ MVCC**
MyISAM 䏿¯æï¼è InnoDB æ¯æã
讲çï¼è¿ä¸ªå¯¹æ¯æç¹åºè¯ï¼æ¯ç« MyISAM è¿è¡çº§éé½ä¸æ¯æãMVCC å¯ä»¥ç使¯è¡çº§éçä¸ä¸ªå级ï¼å¯ä»¥ææåå°å éæä½ï¼æé«æ§è½ã
**6.ç´¢å¼å®ç°ä¸ä¸æ ·ã**
è½ç¶ MyISAM 弿å InnoDB 弿齿¯ä½¿ç¨ B+Tree ä½ä¸ºç´¢å¼ç»æï¼ä½æ¯ä¸¤è
çå®ç°æ¹å¼ä¸å¤ªä¸æ ·ã
InnoDB 弿ä¸ï¼å
¶æ°æ®æä»¶æ¬èº«å°±æ¯ç´¢å¼æä»¶ãç¸æ¯ MyISAMï¼ç´¢å¼æä»¶åæ°æ®æä»¶æ¯å离çï¼å
¶è¡¨æ°æ®æä»¶æ¬èº«å°±æ¯æ B+Tree ç»ç»çä¸ä¸ªç´¢å¼ç»æï¼æ çå¶èç¹ data åä¿åäºå®æ´çæ°æ®è®°å½ã
详ç»åºå«ï¼æ¨èä½ ççæåçè¿ç¯æç« ï¼[MySQL ç´¢å¼è¯¦è§£](https://javaguide.cn/database/mysql/mysql-index.html)ã
#### MyISAM å InnoDB å¦ä½éæ©ï¼
大夿°æ¶åæä»¬ä½¿ç¨ç齿¯ InnoDB åå¨å¼æï¼å¨æäºè¯»å¯éçæ
åµä¸ï¼ä½¿ç¨ MyISAM 乿¯åéçãä¸è¿ï¼åææ¯ä½ ç项ç®ä¸ä»æ MyISAM 䏿¯æäºå¡ãå´©æºæ¢å¤ç缺ç¹ï¼å¯æ¯~æä»¬ä¸è¬é½ä¼ä»æåï¼ï¼ã
ãMySQL 髿§è½ãä¸é¢æä¸å¥è¯è¿æ ·åå°:
> ä¸è¦è½»æç¸ä¿¡âMyISAM æ¯ InnoDB å¿«âä¹ç±»çç»éªä¹è°ï¼è¿ä¸ªç»è®ºå¾å¾ä¸æ¯ç»å¯¹çãå¨å¾å¤æä»¬å·²ç¥åºæ¯ä¸ï¼InnoDB çé度é½å¯ä»¥è®© MyISAM æå°è«åï¼å°¤å
¶æ¯ç¨å°äºèç°ç´¢å¼ï¼æè
éè¦è®¿é®çæ°æ®é½å¯ä»¥æ¾å
¥å
åçåºç¨ã
ä¸è¬æ
åµä¸æä»¬éæ© InnoDB 齿¯æ²¡æé®é¢çï¼ä½æ¯æäºæ
åµä¸ä½ å¹¶ä¸å¨ä¹å¯æ©å±è½ååå¹¶åè½åï¼ä¹ä¸éè¦äºå¡æ¯æï¼ä¹ä¸å¨ä¹å´©æºåçå®å
¨æ¢å¤é®é¢çè¯ï¼éæ© MyISAM 乿¯ä¸ä¸ªä¸éçéæ©ã使¯ä¸è¬æ
åµä¸ï¼æä»¬é½æ¯éè¦èèå°è¿äºé®é¢çã
å æ¤ï¼å¯¹äºå±ä»¬æ¥å¸¸å¼åçä¸å¡ç³»ç»æ¥è¯´ï¼ä½ å 乿¾ä¸å°ä»ä¹çç±åä½¿ç¨ MyISAM ä½ä¸ºèªå·±ç MySQL æ°æ®åºçåå¨å¼æã
### MySQL æ¥è¯¢ç¼å
æ§è¡æ¥è¯¢è¯å¥çæ¶åï¼ä¼å
æ¥è¯¢ç¼åãä¸è¿ï¼MySQL 8.0 çæ¬åç§»é¤ï¼å 为è¿ä¸ªåè½ä¸å¤ªå®ç¨
`my.cnf` å å
¥ä»¥ä¸é
ç½®ï¼éå¯ MySQL å¼å¯æ¥è¯¢ç¼å
```properties
query_cache_type=1
query_cache_size=600000
```
MySQL æ§è¡ä»¥ä¸å½ä»¤ä¹å¯ä»¥å¼å¯æ¥è¯¢ç¼å
```properties
set global query_cache_type=1;
set global query_cache_size=600000;
```
å¦ä¸ï¼**å¼å¯æ¥è¯¢ç¼ååå¨åæ ·çæ¥è¯¢æ¡ä»¶ä»¥åæ°æ®æ
åµä¸ï¼ä¼ç´æ¥å¨ç¼åä¸è¿åç»æ**ãè¿éçæ¥è¯¢æ¡ä»¶å
æ¬æ¥è¯¢æ¬èº«ãå½åè¦æ¥è¯¢çæ°æ®åºã客æ·ç«¯åè®®çæ¬å·çä¸äºå¯è½å½±åç»æçä¿¡æ¯ãï¼**æ¥è¯¢ç¼åä¸å½ä¸çæ
åµï¼ï¼1ï¼**ï¼å æ¤ä»»ä½ä¸¤ä¸ªæ¥è¯¢å¨ä»»ä½å符ä¸çä¸åé½ä¼å¯¼è´ç¼åä¸å½ä¸ãæ¤å¤ï¼ï¼**æ¥è¯¢ç¼åä¸å½ä¸çæ
åµï¼ï¼2ï¼**ï¼å¦ææ¥è¯¢ä¸å
å«ä»»ä½ç¨æ·èªå®ä¹å½æ°ãåå¨å½æ°ãç¨æ·åéã临æ¶è¡¨ãMySQL åºä¸çç³»ç»è¡¨ï¼å
¶æ¥è¯¢ç»æä¹ä¸ä¼è¢«ç¼åã
ï¼**æ¥è¯¢ç¼åä¸å½ä¸çæ
åµï¼ï¼3ï¼**ï¼**ç¼å建ç«ä¹å**ï¼MySQL çæ¥è¯¢ç¼åç³»ç»ä¼è·è¸ªæ¥è¯¢ä¸æ¶åçæ¯å¼ è¡¨ï¼å¦æè¿äºè¡¨ï¼æ°æ®æç»æï¼åçååï¼é£ä¹åè¿å¼ 表ç¸å
³çææç¼åæ°æ®é½å°å¤±æã
**ç¼åè½ç¶è½å¤æåæ°æ®åºçæ¥è¯¢æ§è½ï¼ä½æ¯ç¼ååæ¶ä¹å¸¦æ¥äºé¢å¤çå¼éï¼æ¯æ¬¡æ¥è¯¢åé½è¦å䏿¬¡ç¼åæä½ï¼å¤±æåè¿è¦éæ¯ã** å æ¤ï¼å¼å¯æ¥è¯¢ç¼åè¦è°¨æ
ï¼å°¤å
¶å¯¹äºåå¯éçåºç¨æ¥è¯´æ´æ¯å¦æ¤ã妿å¼å¯ï¼è¦æ³¨æåçæ§å¶ç¼å空é´å¤§å°ï¼ä¸è¬æ¥è¯´å
¶å¤§å°è®¾ç½®ä¸ºå å MB æ¯è¾åéãæ¤å¤ï¼**è¿å¯ä»¥éè¿ sql_cache å sql_no_cache æ¥æ§å¶æä¸ªæ¥è¯¢è¯å¥æ¯å¦éè¦ç¼åï¼**
```sql
select sql_no_cache count(*) from usr;
```
### MySQL äºå¡
#### ä½è°äºå¡ï¼
æä»¬è®¾æ³ä¸ä¸ªåºæ¯ï¼è¿ä¸ªåºæ¯ä¸æä»¬éè¦æå
¥å¤æ¡ç¸å
³èçæ°æ®å°æ°æ®åºï¼ä¸å¹¸çæ¯ï¼è¿ä¸ªè¿ç¨å¯è½ä¼éå°ä¸é¢è¿äºé®é¢ï¼
- æ°æ®åºä¸éçªç¶å 为æäºåå ææäºã
- 客æ·ç«¯çªç¶å 为ç½ç»åå è¿æ¥ä¸ä¸æ°æ®åºäºã
- å¹¶åè®¿é®æ°æ®åºæ¶ï¼å¤ä¸ªçº¿ç¨åæ¶åå
¥æ°æ®åºï¼è¦çäºå½¼æ¤çæ´æ¹ã
- ......
ä¸é¢çä»»ä½ä¸ä¸ªé®é¢é½å¯è½ä¼å¯¼è´æ°æ®çä¸ä¸è´æ§ã为äºä¿è¯æ°æ®çä¸è´æ§ï¼ç³»ç»å¿
é¡»è½å¤å¤çè¿äºé®é¢ãäºå¡å°±æ¯æä»¬æ½è±¡åºæ¥ç®åè¿äºé®é¢çé¦éæºå¶ãäºå¡çæ¦å¿µèµ·æºäºæ°æ®åºï¼ç®åï¼å·²ç»æä¸ºä¸ä¸ªæ¯è¾å¹¿æ³çæ¦å¿µã
**ä½ä¸ºäºå¡ï¼** ä¸è¨è½ä¹ï¼**äºå¡æ¯é»è¾ä¸çä¸ç»æä½ï¼è¦ä¹é½æ§è¡ï¼è¦ä¹é½ä¸æ§è¡ã**
äºå¡æç»å
¸ä¹ç»å¸¸è¢«æ¿åºæ¥è¯´ä¾åå°±æ¯è½¬è´¦äºãåå¦å°æè¦ç»å°çº¢è½¬è´¦ 1000 å
ï¼è¿ä¸ªè½¬è´¦ä¼æ¶åå°ä¸¤ä¸ªå
³é®æä½ï¼è¿ä¸¤ä¸ªæä½å¿
须齿åæè
é½å¤±è´¥ã
1. å°å°æçä½é¢åå° 1000 å
2. å°å°çº¢çä½é¢å¢å 1000 å
ã
äºå¡ä¼æè¿ä¸¤ä¸ªæä½å°±å¯ä»¥çæé»è¾ä¸çä¸ä¸ªæ´ä½ï¼è¿ä¸ªæ´ä½å
å«çæä½è¦ä¹é½æåï¼è¦ä¹é½è¦å¤±è´¥ãè¿æ ·å°±ä¸ä¼åºç°å°æä½é¢åå°èå°çº¢çä½é¢å´å¹¶æ²¡æå¢å çæ
åµã

#### ä½è°æ°æ®åºäºå¡ï¼
大夿°æ
åµä¸ï¼æä»¬å¨è°è®ºäºå¡çæ¶åï¼å¦ææ²¡æç¹æ**åå¸å¼äºå¡**ï¼å¾å¾æçå°±æ¯**æ°æ®åºäºå¡**ã
æ°æ®åºäºå¡å¨æä»¬æ¥å¸¸å¼å䏿¥è§¦çæå¤äºãå¦æä½ ç项ç®å±äºå使¶æçè¯ï¼ä½ æ¥è§¦å°çå¾å¾å°±æ¯æ°æ®åºäºå¡äºã
**飿°æ®åºäºå¡æä»ä¹ä½ç¨å¢ï¼**
ç®åæ¥è¯´ï¼æ°æ®åºäºå¡å¯ä»¥ä¿è¯å¤ä¸ªå¯¹æ°æ®åºçæä½ï¼ä¹å°±æ¯ SQL è¯å¥ï¼ææä¸ä¸ªé»è¾ä¸çæ´ä½ãææè¿ä¸ªé»è¾ä¸çæ´ä½çè¿äºæ°æ®åºæä½éµå¾ªï¼**è¦ä¹å
¨é¨æ§è¡æå,è¦ä¹å
¨é¨ä¸æ§è¡** ã
```sql
# å¼å¯ä¸ä¸ªäºå¡
START TRANSACTION;
# 夿¡ SQL è¯å¥
SQL1,SQL2...
### æäº¤äºå¡
COMMIT;
```

å¦å¤ï¼å
³ç³»åæ°æ®åºï¼ä¾å¦ï¼`MySQL`ã`SQL Server`ã`Oracle` çï¼äºå¡é½æ **ACID** ç¹æ§ï¼

1. **ååæ§**ï¼`Atomicity`ï¼ ï¼ äºå¡æ¯æå°çæ§è¡åä½ï¼ä¸å
许åå²ãäºå¡çååæ§ç¡®ä¿å¨ä½è¦ä¹å
¨é¨å®æï¼è¦ä¹å®å
¨ä¸èµ·ä½ç¨ï¼
2. **ä¸è´æ§**ï¼`Consistency`ï¼ï¼ æ§è¡äºå¡ååï¼æ°æ®ä¿æä¸è´ï¼ä¾å¦è½¬è´¦ä¸å¡ä¸ï¼æ 论äºå¡æ¯å¦æåï¼è½¬è´¦è
åæ¶æ¬¾äººçæ»é¢åºè¯¥æ¯ä¸åçï¼
3. **é离æ§**ï¼`Isolation`ï¼ï¼ å¹¶åè®¿é®æ°æ®åºæ¶ï¼ä¸ä¸ªç¨æ·çäºå¡ä¸è¢«å
¶ä»äºå¡æå¹²æ°ï¼åå¹¶åäºå¡ä¹é´æ°æ®åºæ¯ç¬ç«çï¼
4. **æä¹
æ§**ï¼`Durabilily`ï¼ï¼ ä¸ä¸ªäºå¡è¢«æäº¤ä¹åãå®å¯¹æ°æ®åºä¸æ°æ®çæ¹åæ¯æä¹
çï¼å³ä½¿æ°æ®åºåçæ
éä¹ä¸åºè¯¥å¯¹å
¶æä»»ä½å½±åã
ð è¿éè¦é¢å¤è¡¥å
ä¸ç¹ï¼**åªæä¿è¯äºäºå¡çæä¹
æ§ãååæ§ãé离æ§ä¹åï¼ä¸è´æ§æè½å¾å°ä¿éãä¹å°±æ¯è¯´ AãIãD æ¯ææ®µï¼C æ¯ç®çï¼** æ³å¿
大家ä¹åæä¸æ ·ï¼è¢« ACID è¿ä¸ªæ¦å¿µè¢«è¯¯å¯¼äºå¾ä¹
! æä¹æ¯çå¨å¿æèå¸çå
¬å¼è¯¾[ãå¨å¿æçè½¯ä»¶æ¶æè¯¾ã](https://time.geekbang.org/opencourse/intro/100064201)æææ¸
æ¥çï¼å¤ç好书ï¼ï¼ï¼ï¼ã

å¦å¤ï¼DDIA ä¹å°±æ¯ [ãDesigning Data-Intensive Applicationï¼æ°æ®å¯éååºç¨ç³»ç»è®¾è®¡ï¼ã](https://book.douban.com/subject/30329536/) çä½è
å¨ä»çè¿æ¬ä¹¦ä¸å¦æ¯è¯´ï¼
> Atomicity, isolation, and durability are properties of the database, whereas consisâ
> tency (in the ACID sense) is a property of the application. The application may rely
> on the databaseâs atomicity and isolation properties in order to achieve consistency,
> but itâs not up to the database alone.
>
> ç¿»è¯è¿æ¥çæææ¯ï¼ååæ§ï¼é离æ§åæä¹
æ§æ¯æ°æ®åºç屿§ï¼èä¸è´æ§ï¼å¨ ACID æä¹ä¸ï¼æ¯åºç¨ç¨åºç屿§ãåºç¨å¯è½ä¾èµæ°æ®åºçååæ§åéç¦»å±æ§æ¥å®ç°ä¸è´æ§ï¼ä½è¿å¹¶ä¸ä»
åå³äºæ°æ®åºãå æ¤ï¼åæ¯ C ä¸å±äº ACID ã
ãDesigning Data-Intensive Applicationï¼æ°æ®å¯éååºç¨ç³»ç»è®¾è®¡ï¼ãè¿æ¬ä¹¦å¼ºæ¨ä¸æ³¢ï¼å¼å¾è¯»å¾å¤éï¼è±ç£ææ¥è¿ 90% ç人çäºè¿æ¬ä¹¦ä¹åç»äºäºæå¥½è¯ãå¦å¤ï¼ä¸æç¿»è¯çæ¬å·²ç»å¨ Github 弿ºï¼å°åï¼[https://github.com/Vonng/ddia](https://github.com/Vonng/ddia) ã

#### å¹¶åäºå¡å¸¦æ¥äºåªäºé®é¢?
å¨å
¸åçåºç¨ç¨åºä¸ï¼å¤ä¸ªäºå¡å¹¶åè¿è¡ï¼ç»å¸¸ä¼æä½ç¸åçæ°æ®æ¥å®æåèªçä»»å¡ï¼å¤ä¸ªç¨æ·å¯¹å䏿°æ®è¿è¡æä½ï¼ãå¹¶åè½ç¶æ¯å¿
é¡»çï¼ä½å¯è½ä¼å¯¼è´ä»¥ä¸çé®é¢ã
- **è读ï¼Dirty readï¼:** å½ä¸ä¸ªäºå¡æ£å¨è®¿é®æ°æ®å¹¶ä¸å¯¹æ°æ®è¿è¡äºä¿®æ¹ï¼èè¿ç§ä¿®æ¹è¿æ²¡ææäº¤å°æ°æ®åºä¸ï¼è¿æ¶å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®äºè¿ä¸ªæ°æ®ï¼ç¶å使ç¨äºè¿ä¸ªæ°æ®ãå 为è¿ä¸ªæ°æ®æ¯è¿æ²¡ææäº¤çæ°æ®ï¼é£ä¹å¦å¤ä¸ä¸ªäºå¡è¯»å°çè¿ä¸ªæ°æ®æ¯âèæ°æ®âï¼ä¾æ®âèæ°æ®âæåçæä½å¯è½æ¯ä¸æ£ç¡®çã
- **丢失修æ¹ï¼Lost to modifyï¼:** æå¨ä¸ä¸ªäºå¡è¯»åä¸ä¸ªæ°æ®æ¶ï¼å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®äºè¯¥æ°æ®ï¼é£ä¹å¨ç¬¬ä¸ä¸ªäºå¡ä¸ä¿®æ¹äºè¿ä¸ªæ°æ®åï¼ç¬¬äºä¸ªäºå¡ä¹ä¿®æ¹äºè¿ä¸ªæ°æ®ãè¿æ ·ç¬¬ä¸ä¸ªäºå¡å
çä¿®æ¹ç»æå°±è¢«ä¸¢å¤±ï¼å æ¤ç§°ä¸ºä¸¢å¤±ä¿®æ¹ã ä¾å¦ï¼äºå¡ 1 读åæè¡¨ä¸çæ°æ® A=20ï¼äºå¡ 2 ä¹è¯»å A=20ï¼äºå¡ 1 ä¿®æ¹ A=A-1ï¼äºå¡ 2 ä¹ä¿®æ¹ A=A-1ï¼æç»ç»æ A=19ï¼äºå¡ 1 çä¿®æ¹è¢«ä¸¢å¤±ã
- **ä¸å¯éå¤è¯»ï¼Unrepeatable readï¼:** æå¨ä¸ä¸ªäºå¡å
夿¬¡è¯»å䏿°æ®ãå¨è¿ä¸ªäºå¡è¿æ²¡æç»ææ¶ï¼å¦ä¸ä¸ªäºå¡ä¹è®¿é®è¯¥æ°æ®ãé£ä¹ï¼å¨ç¬¬ä¸ä¸ªäºå¡ä¸çä¸¤æ¬¡è¯»æ°æ®ä¹é´ï¼ç±äºç¬¬äºä¸ªäºå¡çä¿®æ¹å¯¼è´ç¬¬ä¸ä¸ªäºå¡ä¸¤æ¬¡è¯»åçæ°æ®å¯è½ä¸å¤ªä¸æ ·ãè¿å°±åçäºå¨ä¸ä¸ªäºå¡å
两次读å°çæ°æ®æ¯ä¸ä¸æ ·çæ
åµï¼å æ¤ç§°ä¸ºä¸å¯éå¤è¯»ã
- **幻读ï¼Phantom readï¼:** 幻读ä¸ä¸å¯éå¤è¯»ç±»ä¼¼ãå®åçå¨ä¸ä¸ªäºå¡ï¼T1ï¼è¯»åäºå è¡æ°æ®ï¼æ¥çå¦ä¸ä¸ªå¹¶åäºå¡ï¼T2ï¼æå
¥äºä¸äºæ°æ®æ¶ãå¨éåçæ¥è¯¢ä¸ï¼ç¬¬ä¸ä¸ªäºå¡ï¼T1ï¼å°±ä¼åç°å¤äºä¸äºåæ¬ä¸åå¨çè®°å½ï¼å°±å¥½ååçäºå¹»è§ä¸æ ·ï¼æä»¥ç§°ä¸ºå¹»è¯»ã
**ä¸å¯éå¤è¯»å幻读æä»ä¹åºå«å¢ï¼**
- ä¸å¯éå¤è¯»çéç¹æ¯å
å®¹ä¿®æ¹æè
è®°å½åå°æ¯å¦å¤æ¬¡è¯»å䏿¡è®°å½åç°å
¶ä¸æäºè®°å½çå¼è¢«ä¿®æ¹ï¼
- 幻读çéç¹å¨äºè®°å½æ°å¢æ¯å¦å¤æ¬¡æ§è¡å䏿¡æ¥è¯¢è¯å¥ï¼DQLï¼æ¶ï¼åç°æ¥å°çè®°å½å¢å äºã
幻读å
¶å®å¯ä»¥ç使¯ä¸å¯éå¤è¯»çä¸ç§ç¹æ®æ
åµï¼åç¬æåºå幻读çåå ä¸»è¦æ¯è§£å³å¹»è¯»åä¸å¯éå¤è¯»çæ¹æ¡ä¸ä¸æ ·ã
举个ä¾åï¼æ§è¡ `delete` å `update` æä½çæ¶åï¼å¯ä»¥ç´æ¥å¯¹è®°å½å éï¼ä¿è¯äºå¡å®å
¨ãèæ§è¡ `insert` æä½çæ¶åï¼ç±äºè®°å½éï¼Record Lockï¼åªè½éä½å·²ç»åå¨çè®°å½ï¼ä¸ºäºé¿å
æå
¥æ°è®°å½ï¼éè¦ä¾èµé´ééï¼Gap Lockï¼ãä¹å°±æ¯è¯´æ§è¡ `insert` æä½çæ¶åéè¦ä¾èµ Next-Key Lockï¼Record Lock+Gap Lockï¼ è¿è¡å 鿥ä¿è¯ä¸åºç°å¹»è¯»ã
#### SQL æ åå®ä¹äºåªäºäºå¡é离级å«?
SQL æ åå®ä¹äºå个é离级å«ï¼
- **READ-UNCOMMITTED(è¯»åæªæäº¤)** ï¼ æä½çé离级å«ï¼å
许读åå°æªæäº¤çæ°æ®åæ´ï¼å¯è½ä¼å¯¼è´è读ã幻读æä¸å¯éå¤è¯»ã
- **READ-COMMITTED(读åå·²æäº¤)** ï¼ å
许读åå¹¶åäºå¡å·²ç»æäº¤çæ°æ®ï¼å¯ä»¥é»æ¢è读ï¼ä½æ¯å¹»è¯»æä¸å¯éå¤è¯»ä»æå¯è½åçã
- **REPEATABLE-READ(å¯éå¤è¯»)** ï¼ å¯¹åä¸å段ç夿¬¡è¯»åç»æé½æ¯ä¸è´çï¼é¤éæ°æ®æ¯è¢«æ¬èº«äºå¡èªå·±æä¿®æ¹ï¼å¯ä»¥é»æ¢è读åä¸å¯éå¤è¯»ï¼ä½å¹»è¯»ä»æå¯è½åçã
- **SERIALIZABLE(å¯ä¸²è¡å)** ï¼ æé«çé离级å«ï¼å®å
¨æä» ACID çé离级å«ãææçäºå¡ä¾æ¬¡é个æ§è¡ï¼è¿æ ·äºå¡ä¹é´å°±å®å
¨ä¸å¯è½äº§çå¹²æ°ï¼ä¹å°±æ¯è¯´ï¼è¯¥çº§å«å¯ä»¥é²æ¢è读ãä¸å¯éå¤è¯»ä»¥å幻读ã
---
| éç¦»çº§å« | è读 | ä¸å¯éå¤è¯» | 幻读 |
| :--------------: | :--: | :--------: | :--: |
| READ-UNCOMMITTED | â | â | â |
| READ-COMMITTED | Ã | â | â |
| REPEATABLE-READ | Ã | Ã | â |
| SERIALIZABLE | Ã | Ã | Ã |
#### MySQL çéç¦»çº§å«æ¯åºäºéå®ç°çåï¼
MySQL çé离级å«åºäºéå MVCC æºå¶å
±åå®ç°çã
SERIALIZABLE é离级å«ï¼æ¯éè¿éæ¥å®ç°çãé¤äº SERIALIZABLE é离级å«ï¼å
¶ä»çé离级å«é½æ¯åºäº MVCC å®ç°ã
ä¸è¿ï¼ SERIALIZABLE ä¹å¤çå
¶ä»é离级å«å¯è½ä¹éè¦ç¨å°éæºå¶ï¼å°±æ¯å¦ REPEATABLE-READ å¨å½å读æ
åµä¸éè¦ä½¿ç¨å é读æ¥ä¿è¯ä¸ä¼åºç°å¹»è¯»ã
#### MySQL çé»è®¤éç¦»çº§å«æ¯ä»ä¹?
MySQL InnoDB åå¨å¼æçé»è®¤æ¯æçéç¦»çº§å«æ¯ **REPEATABLE-READï¼å¯é读ï¼**ãæä»¬å¯ä»¥éè¿`SELECT @@tx_isolation;`å½ä»¤æ¥æ¥çï¼MySQL 8.0 该å½ä»¤æ¹ä¸º`SELECT @@transaction_isolation;`
```sql
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
```
å
³äº MySQL äºå¡é离级å«ç详ç»ä»ç»ï¼å¯ä»¥ççæåçè¿ç¯æç« ï¼[MySQL äºå¡é离级å«è¯¦è§£](https://javaguide.cn/database/mysql/transaction-isolation-level.html)ã
### MySQL é
#### 表级éåè¡çº§éäºè§£åï¼æä»ä¹åºå«ï¼
MyISAM ä»
ä»
æ¯æè¡¨çº§é(table-level locking)ï¼ä¸éå°±éæ´å¼ è¡¨ï¼è¿å¨å¹¶ååçæ
åµä¸æ§é常差ã
InnoDB ä¸å
æ¯æè¡¨çº§é(table-level locking)ï¼è¿æ¯æè¡çº§é(row-level locking)ï¼é»è®¤ä¸ºè¡çº§éãè¡çº§éçç²åº¦æ´å°ï¼ä»
对ç¸å
³çè®°å½ä¸éå³å¯ï¼å¯¹ä¸è¡æè
å¤è¡è®°å½å éï¼ï¼æä»¥å¯¹äºå¹¶ååå
¥æä½æ¥è¯´ï¼ InnoDB çæ§è½æ´é«ã
**表级éåè¡çº§é对æ¯** ï¼
- **表级éï¼** MySQL ä¸éå®ç²åº¦æå¤§çä¸ç§éï¼æ¯é对éç´¢å¼å段å çéï¼å¯¹å½åæä½çæ´å¼ 表å éï¼å®ç°ç®åï¼èµæºæ¶è乿¯è¾å°ï¼å éå¿«ï¼ä¸ä¼åºç°æ»éãå
¶éå®ç²åº¦æå¤§ï¼è§¦åéå²çªçæ¦çæé«ï¼å¹¶å度æä½ï¼MyISAM å InnoDB 弿齿¯æè¡¨çº§éã
- **è¡çº§éï¼** MySQL ä¸éå®ç²åº¦æå°çä¸ç§éï¼æ¯é对索å¼å段å çéï¼åªé对å½åæä½çè¡è®°å½è¿è¡å éã è¡çº§éè½å¤§å¤§åå°æ°æ®åºæä½çå²çªãå
¶å éç²åº¦æå°ï¼å¹¶å度é«ï¼ä½å éçå¼é乿大ï¼å éæ
¢ï¼ä¼åºç°æ»éã
#### è¡çº§éçä½¿ç¨æä»ä¹æ³¨æäºé¡¹ï¼
InnoDB çè¡éæ¯é对索å¼å段å çéï¼è¡¨çº§éæ¯é对éç´¢å¼å段å çéã彿们æ§è¡ `UPDATE`ã`DELETE` è¯å¥æ¶ï¼å¦æ `WHERE`æ¡ä»¶ä¸å段没æå½ä¸å¯ä¸ç´¢å¼æè
ç´¢å¼å¤±æçè¯ï¼å°±ä¼å¯¼è´æ«æå
¨è¡¨å¯¹è¡¨ä¸çææè¡è®°å½è¿è¡å éãè¿ä¸ªå¨æä»¬æ¥å¸¸å·¥ä½å¼åä¸ç»å¸¸ä¼éå°ï¼ä¸å®è¦å¤å¤æ³¨æï¼ï¼ï¼
ä¸è¿ï¼å¾å¤æ¶åå³ä½¿ç¨äºç´¢å¼ä¹æå¯è½ä¼èµ°å
¨è¡¨æ«æï¼è¿æ¯å 为 MySQL ä¼åå¨çåå ã
#### å
±äº«éåæä»éå¢ï¼
ä¸è®ºæ¯è¡¨çº§éè¿æ¯è¡çº§éï¼é½åå¨å
±äº«éï¼Share Lockï¼S éï¼åæä»éï¼Exclusive Lockï¼X éï¼è¿ä¸¤ç±»ï¼
- **å
±äº«éï¼S éï¼** ï¼å称读éï¼äºå¡å¨è¯»åè®°å½çæ¶åè·åå
±äº«éï¼å
许å¤ä¸ªäºå¡åæ¶è·åï¼éå
¼å®¹ï¼ã
- **æä»éï¼X éï¼** ï¼åç§°åé/ç¬å éï¼äºå¡å¨ä¿®æ¹è®°å½çæ¶åè·åæä»éï¼ä¸å
许å¤ä¸ªäºå¡åæ¶è·åã妿ä¸ä¸ªè®°å½å·²ç»è¢«å äºæä»éï¼é£å
¶ä»äºå¡ä¸è½åå¯¹è¿æ¡äºå¡å ä»»ä½ç±»åçéï¼éä¸å
¼å®¹ï¼ã
æä»éä¸ä»»ä½çéé½ä¸å
¼å®¹ï¼å
±äº«éä»
åå
±äº«éå
¼å®¹ã
| | S é | X é |
| :--- | :----- | :--- |
| S é | ä¸å²çª | å²çª |
| X é | å²çª | å²çª |
ç±äº MVCC çåå¨ï¼å¯¹äºä¸è¬ç `SELECT` è¯å¥ï¼InnoDB ä¸ä¼å ä»»ä½éãä¸è¿ï¼ ä½ å¯ä»¥éè¿ä»¥ä¸è¯å¥æ¾å¼å å
±äº«éææä»éã
```sql
# å
±äº«é
SELECT ... LOCK IN SHARE MODE;
# æä»é
SELECT ... FOR UPDATE;
```
#### æåéæä»ä¹ä½ç¨ï¼
妿éè¦ç¨å°è¡¨éçè¯ï¼å¦ä½å¤æè¡¨ä¸çè®°å½æ²¡æè¡éå¢ï¼ä¸è¡ä¸è¡éåè¯å®æ¯ä¸è¡ï¼æ§è½å¤ªå·®ãæä»¬éè¦ç¨å°ä¸ä¸ªå«åæåéçä¸ä¸æ¥å¿«é夿æ¯å¦å¯ä»¥å¯¹æä¸ªè¡¨ä½¿ç¨è¡¨éã
æåéæ¯è¡¨çº§éï¼å
±æä¸¤ç§ï¼
- **æåå
±äº«éï¼Intention Shared Lockï¼IS éï¼**ï¼äºå¡ææå对表ä¸çæäºå å
±äº«éï¼S éï¼ï¼å å
±äº«éåå¿
é¡»å
åå¾è¯¥è¡¨ç IS éã
- **æåæä»éï¼Intention Exclusive Lockï¼IX éï¼**ï¼äºå¡ææå对表ä¸çæäºè®°å½å æä»éï¼X éï¼ï¼å æä»éä¹åå¿
é¡»å
åå¾è¯¥è¡¨ç IX éã
æåéæ¯ææ°æ®å¼æèªå·±ç»´æ¤çï¼ç¨æ·æ æ³æå¨æä½æåéï¼å¨ä¸ºæ°æ®è¡å å
±äº« / æä»éä¹åï¼InooDB ä¼å
è·åè¯¥æ°æ®è¡æå¨å¨æ°æ®è¡¨çå¯¹åºæåéã
æåéä¹é´æ¯äºç¸å
¼å®¹çã
| | IS é | IX é |
| ----- | ----- | ----- |
| IS é | å
¼å®¹ | å
¼å®¹ |
| IX é | å
¼å®¹ | å
¼å®¹ |
æåéåå
±äº«éåæå®éäºæ¥ï¼è¿éæçæ¯è¡¨çº§å«çå
±äº«éåæä»éï¼æåéä¸ä¼ä¸è¡çº§çå
±äº«éåæä»éäºæ¥ï¼ã
| | IS é | IX é |
| ---- | ----- | ----- |
| S é | å
¼å®¹ | äºæ¥ |
| X é | äºæ¥ | äºæ¥ |
ãMySQL ææ¯å
å¹ InnoDB åå¨å¼æãè¿æ¬ä¹¦å¯¹åºçæè¿°åºè¯¥æ¯ç¬è¯¯äºã

#### InnoDB æåªå ç±»è¡éï¼
MySQL InnoDB æ¯æä¸ç§è¡é宿¹å¼ï¼
- **è®°å½éï¼Record Lockï¼** ï¼ä¹è¢«ç§°ä¸ºè®°å½éï¼å±äºå个è¡è®°å½ä¸çéã
- **é´ééï¼Gap Lockï¼** ï¼éå®ä¸ä¸ªèå´ï¼ä¸å
æ¬è®°å½æ¬èº«ã
- **临é®éï¼Next-key Lockï¼** ï¼Record Lock+Gap Lockï¼éå®ä¸ä¸ªèå´ï¼å
å«è®°å½æ¬èº«ãè®°å½éåªè½éä½å·²ç»åå¨çè®°å½ï¼ä¸ºäºé¿å
æå
¥æ°è®°å½ï¼éè¦ä¾èµé´ééã
InnoDB çé»è®¤éç¦»çº§å« RRï¼å¯éè¯»ï¼æ¯å¯ä»¥è§£å³å¹»è¯»é®é¢åççï¼ä¸»è¦æä¸é¢ä¸¤ç§æ
åµï¼
- **å¿«ç
§è¯»**ï¼ä¸è´æ§ééå®è¯»ï¼ ï¼ç± MVCC æºå¶æ¥ä¿è¯ä¸åºç°å¹»è¯»ã
- **å½å读** ï¼ä¸è´æ§éå®è¯»ï¼ï¼ ä½¿ç¨ Next-Key Lock è¿è¡å 鿥ä¿è¯ä¸åºç°å¹»è¯»ã
#### å½å读åå¿«ç
§è¯»æä»ä¹åºå«ï¼
**å¿«ç
§è¯»**ï¼ä¸è´æ§ééå®è¯»ï¼å°±æ¯å纯ç `SELECT` è¯å¥ï¼ä½ä¸å
æ¬ä¸é¢è¿ä¸¤ç±» `SELECT` è¯å¥ï¼
```sql
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
```
å¿«ç
§å³è®°å½çåå²çæ¬ï¼æ¯è¡è®°å½å¯è½åå¨å¤ä¸ªåå²çæ¬ï¼å¤çæ¬ææ¯ï¼ã
å¿«ç
§è¯»çæ
åµä¸ï¼å¦æè¯»åçè®°å½æ£å¨æ§è¡ UPDATE/DELETE æä½ï¼è¯»åæä½ä¸ä¼å æ¤å»çå¾
è®°å½ä¸ X éçéæ¾ï¼èæ¯ä¼å»è¯»åè¡çä¸ä¸ªå¿«ç
§ã
åªæå¨äºå¡éç¦»çº§å« RC(读åå·²æäº¤) å RRï¼å¯é读ï¼ä¸ï¼InnoDB æä¼ä½¿ç¨ä¸è´æ§ééå®è¯»ï¼
- å¨ RC 级å«ä¸ï¼å¯¹äºå¿«ç
§æ°æ®ï¼ä¸è´æ§ééå®è¯»æ»æ¯è¯»å被éå®è¡çææ°ä¸ä»½å¿«ç
§æ°æ®ã
- å¨ RR 级å«ä¸ï¼å¯¹äºå¿«ç
§æ°æ®ï¼ä¸è´æ§ééå®è¯»æ»æ¯è¯»åæ¬äºå¡å¼å§æ¶çè¡æ°æ®çæ¬ã
å¿«ç
§è¯»æ¯è¾éåå¯¹äºæ°æ®ä¸è´æ§è¦æ±ä¸æ¯ç¹å«é«ä¸è¿½æ±æè´æ§è½çä¸å¡åºæ¯ã
**å½å读** ï¼ä¸è´æ§éå®è¯»ï¼å°±æ¯ç»è¡è®°å½å X éæ S éã
å½å读çä¸äºå¸¸è§ SQL è¯å¥ç±»åå¦ä¸ï¼
```sql
# 对读çè®°å½å ä¸ä¸ªXé
SELECT...FOR UPDATE
# 对读çè®°å½å ä¸ä¸ªSé
SELECT...LOCK IN SHARE MODE
# 对修æ¹çè®°å½å ä¸ä¸ªXé
INSERT...
UPDATE...
DELETE...
```
### åè
- ã髿§è½ MySQLã第 7 ç« MySQL é«çº§ç¹æ§
- ãMySQL ææ¯å
å¹ InnoDB åå¨å¼æã第 6 ç« é
- Relational Databaseï¼https://www.omnisci.com/technical-glossary/relational-database
- ææ¯å享 | é离级å«ï¼æ£ç¡®ç解幻读ï¼https://opensource.actionsky.com/20210818-mysql/
- MySQL Server Logs - MySQL 5.7 Reference Manualï¼https://dev.mysql.com/doc/refman/5.7/en/server-logs.html
- Redo Log - MySQL 5.7 Reference Manualï¼https://dev.mysql.com/doc/refman/5.7/en/innodb-redo-log.html
- Locking Reads - MySQL 5.7 Reference Manualï¼https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html
- æ·±å
¥çè§£æ°æ®åºè¡éä¸è¡¨é https://zhuanlan.zhihu.com/p/52678870
- 详解 MySQL InnoDB 䏿åéçä½ç¨ï¼https://juejin.cn/post/6844903666332368909
- 卿°æ®åºä¸ä¸å¯éå¤è¯»å幻读å°åºåºè¯¥æä¹åï¼ï¼https://www.zhihu.com/question/392569386
## 4.3 Redis
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
### Redis åºç¡
#### ç®åä»ç»ä¸ä¸ Redis!
ç®åæ¥è¯´ **Redis å°±æ¯ä¸ä¸ªä½¿ç¨ C è¯è¨å¼åçæ°æ®åº**ï¼ä¸è¿ä¸ä¼ ç»æ°æ®åºä¸åçæ¯ **Redis çæ°æ®æ¯åå¨å
åä¸ç** ï¼ä¹å°±æ¯å®æ¯å
åæ°æ®åºï¼æä»¥è¯»åé度é常快ï¼å æ¤ Redis 被广æ³åºç¨äºç¼åæ¹åã
å¦å¤ï¼Redis é¤äºåç¼åä¹å¤ï¼ä¹ç»å¸¸ç¨æ¥ååå¸å¼éï¼çè³æ¯æ¶æ¯éåã
Redis æä¾äºå¤ç§æ°æ®ç±»åæ¥æ¯æä¸åçä¸å¡åºæ¯ãRedis è¿æ¯æäºå¡ ãæä¹
åãLua èæ¬ãå¤ç§éç¾¤æ¹æ¡ã
ä½ å¯ä»¥èªå·±æ¬æºå®è£
Redis æè
éè¿ Redis å®ç½æä¾ç[å¨çº¿ Redis ç¯å¢](https://try.redis.io/)æ¥å®é
ä½éª Redisã

#### åå¸å¼ç¼å常è§çææ¯éåæ¹æ¡æåªäºï¼
åå¸å¼ç¼åçè¯ï¼ä½¿ç¨çæ¯è¾å¤çä¸»è¦æ¯ **Memcached** å **Redis**ãä¸è¿ï¼ç°å¨åºæ¬æ²¡æçè¿è¿æé¡¹ç®ä½¿ç¨ **Memcached** æ¥åç¼åï¼é½æ¯ç´æ¥ç¨ **Redis**ã
Memcached æ¯åå¸å¼ç¼åæå¼å§å
´èµ·çé£ä¼ï¼æ¯è¾å¸¸ç¨çã忥ï¼éç Redis çåå±ï¼å¤§å®¶æ
¢æ
¢é½è½¬èä½¿ç¨æ´å 强大ç Redis äºã
åå¸å¼ç¼å主è¦è§£å³çæ¯åæºç¼åç容éåæå¡å¨éå¶å¹¶ä¸æ æ³ä¿åéç¨ä¿¡æ¯çé®é¢ãå ä¸ºï¼æ¬å°ç¼ååªå¨å½åæå¡éææï¼æ¯å¦å¦æä½ é¨ç½²äºä¸¤ä¸ªç¸åçæå¡ï¼ä»ä»¬ä¸¤è
ä¹é´çç¼åæ°æ®æ¯æ æ³å
±åçã
#### 说ä¸ä¸ Redis å Memcached çåºå«åå
±åç¹
ç°å¨å
¬å¸ä¸è¬é½æ¯ç¨ Redis æ¥å®ç°ç¼åï¼èä¸ Redis èªèº«ä¹è¶æ¥è¶å¼ºå¤§äºï¼ä¸è¿ï¼äºè§£ Redis å Memcached çåºå«åå
±åç¹ï¼æå©äºæä»¬å¨åç¸åºçææ¯éåçæ¶åï¼è½å¤åå°æçææ®ï¼
**å
±åç¹** ï¼
1. 齿¯åºäºå
åçæ°æ®åºï¼ä¸è¬é½ç¨æ¥å½åç¼å使ç¨ã
2. é½æè¿æçç¥ã
3. 两è
çæ§è½é½é常é«ã
**åºå«** ï¼
1. **Redis æ¯ææ´ä¸°å¯çæ°æ®ç±»åï¼æ¯ææ´å¤æçåºç¨åºæ¯ï¼**ãRedis ä¸ä»
ä»
æ¯æç®åç k/v ç±»åçæ°æ®ï¼åæ¶è¿æä¾ listï¼setï¼zsetï¼hash çæ°æ®ç»æçåå¨ãMemcached åªæ¯ææç®åç k/v æ°æ®ç±»åã
2. **Redis æ¯ææ°æ®çæä¹
åï¼å¯ä»¥å°å
åä¸çæ°æ®ä¿æå¨ç£çä¸ï¼éå¯çæ¶åå¯ä»¥å次å è½½è¿è¡ä½¿ç¨,è Memcached ææ°æ®å
¨é¨åå¨å
åä¹ä¸ã**
3. **Redis æç¾é¾æ¢å¤æºå¶ã** å 为å¯ä»¥æç¼åä¸çæ°æ®æä¹
åå°ç£çä¸ã
4. **Redis 卿å¡å¨å
å使ç¨å®ä¹åï¼å¯ä»¥å°ä¸ç¨çæ°æ®æ¾å°ç£çä¸ã使¯ï¼Memcached 卿å¡å¨å
å使ç¨å®ä¹åï¼å°±ä¼ç´æ¥æ¥å¼å¸¸ã**
5. **Memcached 没æåççé群模å¼ï¼éè¦ä¾é 客æ·ç«¯æ¥å®ç°å¾é群ä¸åçåå
¥æ°æ®ï¼ä½æ¯ Redis ç®åæ¯åçæ¯æ cluster 模å¼çã**
6. **Memcached æ¯å¤çº¿ç¨ï¼éé»å¡ IO å¤ç¨çç½ç»æ¨¡åï¼Redis 使ç¨å线ç¨çå¤è·¯ IO å¤ç¨æ¨¡åã** ï¼Redis 6.0 å¼å
¥äºå¤çº¿ç¨ IO ï¼
7. **Redis æ¯æåå¸è®¢é
模åãLua èæ¬ãäºå¡çåè½ï¼è Memcached 䏿¯æãå¹¶ä¸ï¼Redis æ¯ææ´å¤çç¼ç¨è¯è¨ã**
8. **Memcached è¿ææ°æ®çå é¤çç¥åªç¨äºæ°æ§å é¤ï¼è Redis åæ¶ä½¿ç¨äºæ°æ§å é¤ä¸å®æå é¤ã**
ç¸ä¿¡çäºä¸é¢ç对æ¯ä¹åï¼æä»¬å·²ç»æ²¡æä»ä¹çç±å¯ä»¥éæ©ä½¿ç¨ Memcached æ¥ä½ä¸ºèªå·±é¡¹ç®çåå¸å¼ç¼åäºã
#### ç¼åæ°æ®çå¤çæµç¨æ¯ææ ·çï¼
ä½ä¸ºæç·ä¸å·ï¼æç»å¤§å®¶ç»äºä¸ä¸ªèå¾ã

ç®åæ¥è¯´å°±æ¯:
1. å¦æç¨æ·è¯·æ±çæ°æ®å¨ç¼åä¸å°±ç´æ¥è¿åã
2. ç¼åä¸ä¸åå¨çè¯å°±çæ°æ®åºä¸æ¯å¦åå¨ã
3. æ°æ®åºä¸åå¨çè¯å°±æ´æ°ç¼åä¸çæ°æ®ã
4. æ°æ®åºä¸ä¸åå¨çè¯å°±è¿åç©ºæ°æ®ã
#### 为ä»ä¹è¦ç¨ Redis/为ä»ä¹è¦ç¨ç¼åï¼
_ç®åï¼æ¥è¯´ä½¿ç¨ç¼åä¸»è¦æ¯ä¸ºäºæåç¨æ·ä½éªä»¥ååºå¯¹æ´å¤çç¨æ·ã_
ä¸é¢æä»¬ä¸»è¦ä»â髿§è½âåâé«å¹¶åâè¿ä¸¤ç¹æ¥çå¾
è¿ä¸ªé®é¢ã

**髿§è½** ï¼
对ç
§ä¸é¢ ð æç»çå¾ãæä»¬è®¾æ³è¿æ ·çåºæ¯ï¼
åå¦ç¨æ·ç¬¬ä¸æ¬¡è®¿é®æ°æ®åºä¸çæäºæ°æ®çè¯ï¼è¿ä¸ªè¿ç¨æ¯æ¯è¾æ
¢ï¼æ¯ç«æ¯ä»ç¡¬çä¸è¯»åçã使¯ï¼å¦æè¯´ï¼ç¨æ·è®¿é®çæ°æ®å±äºé«é¢æ°æ®å¹¶ä¸ä¸ä¼ç»å¸¸æ¹åçè¯ï¼é£ä¹æä»¬å°±å¯ä»¥å¾æ¾å¿å°å°è¯¥ç¨æ·è®¿é®çæ°æ®åå¨ç¼åä¸ã
**è¿æ ·æä»ä¹å¥½å¤å¢ï¼** é£å°±æ¯ä¿è¯ç¨æ·ä¸ä¸æ¬¡å访é®è¿äºæ°æ®çæ¶åå°±å¯ä»¥ç´æ¥ä»ç¼åä¸è·åäºãæä½ç¼åå°±æ¯ç´æ¥æä½å
åï¼æä»¥é度ç¸å½å¿«ã
ä¸è¿ï¼è¦ä¿ææ°æ®åºåç¼åä¸çæ°æ®çä¸è´æ§ã å¦ææ°æ®åºä¸çå¯¹åºæ°æ®æ¹åçä¹åï¼åæ¥æ¹åç¼åä¸ç¸åºçæ°æ®å³å¯ï¼
**é«å¹¶åï¼**
ä¸è¬å MySQL è¿ç±»çæ°æ®åºç QPS 大æ¦é½å¨ 1w å·¦å³ï¼4 æ ¸ 8gï¼ ï¼ä½æ¯ä½¿ç¨ Redis ç¼åä¹åå¾å®¹æè¾¾å° 10w+ï¼çè³æé«è½è¾¾å° 30w+ï¼å°±åæº redis çæ
åµï¼redis é群çè¯ä¼æ´é«ï¼ã
> QPSï¼Query Per Secondï¼ï¼æå¡å¨æ¯ç§å¯ä»¥æ§è¡çæ¥è¯¢æ¬¡æ°ï¼
ç±æ¤å¯è§ï¼ç´æ¥æä½ç¼åè½å¤æ¿åçæ°æ®åºè¯·æ±æ°éæ¯è¿è¿å¤§äºç´æ¥è®¿é®æ°æ®åºçï¼æä»¥æä»¬å¯ä»¥èèææ°æ®åºä¸çé¨åæ°æ®è½¬ç§»å°ç¼åä¸å»ï¼è¿æ ·ç¨æ·çä¸é¨å请æ±ä¼ç´æ¥å°ç¼åè¿éèä¸ç¨ç»è¿æ°æ®åºãè¿èï¼æä»¬ä¹å°±æé«äºç³»ç»æ´ä½çå¹¶åã
#### Redis é¤äºåç¼åï¼è¿è½åä»ä¹ï¼
- **åå¸å¼é** ï¼ éè¿ Redis æ¥ååå¸å¼éæ¯ä¸ç§æ¯è¾å¸¸è§çæ¹å¼ãé常æ
åµä¸ï¼æä»¬é½æ¯åºäº Redisson æ¥å®ç°åå¸å¼éãç¸å
³é
读ï¼[ãåå¸å¼éä¸ççè
æ¹æ¡ - Redissonã](https://mp.weixin.qq.com/s/CbnPRfvq4m1sqo2uKI6qQw)ã
- **éæµ** ï¼ä¸è¬æ¯éè¿ Redis + Lua èæ¬çæ¹å¼æ¥å®ç°éæµãç¸å
³é
读ï¼[ãæå¸ç¨äº 6 å¹´ç Redis åå¸å¼éæµå¨ï¼å¯ä»¥è¯´æ¯é常å害äºï¼ã](https://mp.weixin.qq.com/s/kyFAWH3mVNJvurQDt4vchA)ã
- **æ¶æ¯éå** ï¼Redis èªå¸¦ç list æ°æ®ç»æå¯ä»¥ä½ä¸ºä¸ä¸ªç®åçéå使ç¨ãRedis 5.0 ä¸å¢å ç Stream ç±»åçæ°æ®ç»ææ´å éåç¨æ¥åæ¶æ¯éåã宿¯è¾ç±»ä¼¼äº Kafkaï¼æä¸»é¢åæ¶è´¹ç»çæ¦å¿µï¼æ¯ææ¶æ¯æä¹
å以å ACK æºå¶ã
- **夿ä¸å¡åºæ¯** ï¼éè¿ Redis 以å Redis æ©å±ï¼æ¯å¦ Redissonï¼æä¾çæ°æ®ç»æï¼æä»¬å¯ä»¥å¾æ¹ä¾¿å°å®æå¾å¤å¤æçä¸å¡åºæ¯æ¯å¦éè¿ bitmap ç»è®¡æ´»è·ç¨æ·ãéè¿ sorted set ç»´æ¤æè¡æ¦ã
- ......
#### Redis å¯ä»¥åæ¶æ¯éåä¹ï¼
Redis 5.0 æ°å¢å çä¸ä¸ªæ°æ®ç»æ `Stream` å¯ä»¥ç¨æ¥åæ¶æ¯éåï¼`Stream` æ¯æï¼
- åå¸ / 订é
模å¼
- æç
§æ¶è´¹è
ç»è¿è¡æ¶è´¹
- æ¶æ¯æä¹
åï¼ RDB å AOFï¼
ä¸è¿ï¼åä¸ä¸çæ¶æ¯éåç¸æ¯ï¼è¿æ¯æå¾å¤æ¬ 缺çå°æ¹æ¯å¦æ¶æ¯ä¸¢å¤±åå 积é®é¢ä¸å¥½è§£å³ãå æ¤ï¼æä»¬é常建议æ¯ä¸ä½¿ç¨ Redis æ¥åæ¶æ¯éåçï¼ä½ å®å
¨å¯ä»¥éæ©å¸é¢ä¸æ¯è¾æççä¸äºæ¶æ¯éåæ¯å¦ RocketMQãKafkaã
ç¸å
³æç« æ¨èï¼[Redis æ¶æ¯éåçä¸ç§æ¹æ¡ï¼ListãStreamsãPub/Subï¼](https://javakeeper.starfish.ink/data-management/Redis/Redis-MQ.html)ã
### Redis æ°æ®ç»æ
#### Redis 常ç¨çæ°æ®ç»ææåªäºï¼
- **5 ç§åºç¡æ°æ®ç»æ** ï¼Stringï¼å符串ï¼ãListï¼å表ï¼ãSetï¼éåï¼ãHashï¼æ£åï¼ãZsetï¼æåºéåï¼ã
- **3 ç§ç¹æ®æ°æ®ç»æ** ï¼HyperLogLogsï¼åºæ°ç»è®¡ï¼ãBitmap ï¼ä½åå¨ï¼ãGeospatial (å°çä½ç½®)ã
å
³äº 5 ç§åºç¡æ°æ®ç»æç详ç»ä»ç»è¯·çè¿ç¯æç« ï¼[Redis 5 ç§åºæ¬æ°æ®ç»æè¯¦è§£](https://javaguide.cn/database/redis/redis-data-structures-01.html)ã
å
³äº 3 ç§ç¹æ®æ°æ®ç»æç详ç»ä»ç»è¯·çè¿ç¯æç« ï¼[Redis 3 ç§ç¹æ®æ°æ®ç»æè¯¦è§£](https://javaguide.cn/database/redis/redis-data-structures-02.html)ã
#### String çåºç¨åºæ¯æåªäºï¼
- å¸¸è§æ°æ®ï¼æ¯å¦ sessionãtokenããåºåååç对象ï¼çç¼åï¼
- è®¡æ°æ¯å¦ç¨æ·å使¶é´çè¯·æ±æ°ï¼ç®åéæµå¯ä»¥ç¨å°ï¼ã页é¢å使¶é´çè®¿é®æ°ï¼
- åå¸å¼é(å©ç¨ `SETNX key value` å½ä»¤å¯ä»¥å®ç°ä¸ä¸ªæç®æçåå¸å¼é)ï¼
- ......
å
³äº String ç详ç»ä»ç»è¯·çè¿ç¯æç« ï¼[Redis 5 ç§åºæ¬æ°æ®ç»æè¯¦è§£](https://javaguide.cn/database/redis/redis-data-structures-01.html)ã
#### String è¿æ¯ Hash åå¨å¯¹è±¡æ°æ®æ´å¥½å¢ï¼
- String åå¨çæ¯åºåååçå¯¹è±¡æ°æ®ï¼åæ¾çæ¯æ´ä¸ªå¯¹è±¡ãHash æ¯å¯¹å¯¹è±¡çæ¯ä¸ªå段åç¬åå¨ï¼å¯ä»¥è·åé¨ååæ®µçä¿¡æ¯ï¼ä¹å¯ä»¥ä¿®æ¹æè
æ·»å é¨ååæ®µï¼èçç½ç»æµéãå¦æå¯¹è±¡ä¸æäºå段éè¦ç»å¸¸å卿è
ç»å¸¸éè¦åç¬æ¥è¯¢å¯¹è±¡ä¸ç个å«å段信æ¯ï¼Hash å°±é常éåã
- String åå¨ç¸å¯¹æ¥è¯´æ´å èçå
åï¼ç¼åç¸åæ°éçå¯¹è±¡æ°æ®ï¼String æ¶èçå
åçº¦æ¯ Hash çä¸åãå¹¶ä¸ï¼åå¨å
·æå¤å±åµå¥ç对象æ¶ä¹æ¹ä¾¿å¾å¤ãå¦æç³»ç»å¯¹æ§è½åèµæºæ¶èé常ææçè¯ï¼String å°±é常éåã
å¨ç»å¤§é¨åæ
åµï¼æä»¬å»ºè®®ä½¿ç¨ String æ¥åå¨å¯¹è±¡æ°æ®å³å¯ï¼
飿 ¹æ®ä½ çä»ç»ï¼è´ç©è½¦ä¿¡æ¯ç¨ String è¿æ¯ Hash å卿´å¥½å¢?
è´ç©è½¦ä¿¡æ¯å»ºè®®ä½¿ç¨ Hash åå¨ï¼
- ç¨æ· id 为 key
- åå id 为 fieldï¼ååæ°é为 value
ç±äºè´ç©è½¦ä¸çååé¢ç¹ä¿®æ¹ååå¨ï¼è¿ä¸ªæ¶å Hash å°±é常éåäºï¼
#### ä½¿ç¨ Redis å®ç°ä¸ä¸ªæè¡æ¦æä¹åï¼
Redis 䏿ä¸ä¸ªå«å `sorted set` çæ°æ®ç»æç»å¸¸è¢«ç¨å¨åç§æè¡æ¦çåºæ¯ï¼æ¯å¦ç´æé´é礼ç©çæè¡æ¦ãæååçå¾®ä¿¡æ¥æ°æè¡æ¦ãçè
è£èä¸çæ®µä½æè¡æ¦ãè¯é¢ç度æè¡æ¦ççã
ç¸å
³çä¸äº Redis å½ä»¤: `ZRANGE` (ä»å°å°å¤§æåº) ã `ZREVRANGE` ï¼ä»å¤§å°å°æåºï¼ã`ZREVRANK` (æå®å
ç´ æå)ã

[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) çãææ¯é¢è¯é¢ç¯ãå°±æä¸ç¯æç« 详ç»ä»ç»å¦ä½ä½¿ç¨ Sorted Set æ¥è®¾è®¡å¶ä½ä¸ä¸ªæè¡æ¦ã

#### ä½¿ç¨ Set å®ç°æ½å¥ç³»ç»éè¦ç¨å°ä»ä¹å½ä»¤ï¼
- `SPOP key count` ï¼ éæºç§»é¤å¹¶è·åæå®éåä¸ä¸ä¸ªæå¤ä¸ªå
ç´ ï¼éåä¸å
许éå¤ä¸å¥çåºæ¯ã
- `SRANDMEMBER key count` : éæºè·åæå®éå䏿宿°éçå
ç´ ï¼éåå
许éå¤ä¸å¥çåºæ¯ã
#### ä½¿ç¨ Bitmap ç»è®¡æ´»è·ç¨æ·æä¹åï¼
ä½¿ç¨æ¥æï¼ç²¾ç¡®å°å¤©ï¼ä½ä¸º keyï¼ç¶åç¨æ· ID 为 offsetï¼å¦æå½æ¥æ´»è·è¿å°±è®¾ç½®ä¸º 1ã
åå§åæ°æ®ï¼
```bash
> SETBIT 20210308 1 1
(integer) 0
> SETBIT 20210308 2 1
(integer) 0
> SETBIT 20210309 1 1
(integer) 0
```
ç»è®¡ 20210308~20210309 æ»æ´»è·ç¨æ·æ°:
```bash
> BITOP and desk1 20210308 20210309
(integer) 1
> BITCOUNT desk1
(integer) 1
```
ç»è®¡ 20210308~20210309 å¨çº¿æ´»è·ç¨æ·æ°:
```bash
> BITOP or desk2 20210308 20210309
(integer) 1
> BITCOUNT desk2
(integer) 2
```
#### ä½¿ç¨ HyperLogLog ç»è®¡é¡µé¢ UV æä¹åï¼
1ãå°è®¿é®æå®é¡µé¢çæ¯ä¸ªç¨æ· ID æ·»å å° `HyperLogLog` ä¸ã
```bash
PFADD PAGE_1:UV USER1 USER2 ...... USERn
```
2ãç»è®¡æå®é¡µé¢ç UVã
```bash
PFCOUNT PAGE_1:UV
```
### Redis çº¿ç¨æ¨¡å
对äºè¯»åå½ä»¤æ¥è¯´ï¼Redis ä¸ç´æ¯åçº¿ç¨æ¨¡åãä¸è¿ï¼å¨ Redis 4.0 çæ¬ä¹åå¼å
¥äºå¤çº¿ç¨æ¥æ§è¡ä¸äºå¤§é®å¼å¯¹ç弿¥å 餿ä½ï¼ Redis 6.0 çæ¬ä¹åå¼å
¥äºå¤çº¿ç¨æ¥å¤çç½ç»è¯·æ±ï¼æé«ç½ç» IO è¯»åæ§è½ï¼ã
#### Redis åçº¿ç¨æ¨¡åäºè§£åï¼
**Redis åºäº Reactor æ¨¡å¼æ¥è®¾è®¡å¼åäºèªå·±çä¸å¥é«æçäºä»¶å¤ç模å** ï¼Netty ççº¿ç¨æ¨¡åä¹åºäº Reactor 模å¼ï¼Reactor 模å¼ä¸æ§æ¯é«æ§è½ IO çåºç³ï¼ï¼è¿å¥äºä»¶å¤ç模å对åºçæ¯ Redis ä¸çæä»¶äºä»¶å¤çå¨ï¼file event handlerï¼ãç±äºæä»¶äºä»¶å¤çå¨ï¼file event handlerï¼æ¯åçº¿ç¨æ¹å¼è¿è¡çï¼æä»¥æä»¬ä¸è¬é½è¯´ Redis æ¯åçº¿ç¨æ¨¡åã
**æ¢ç¶æ¯å线ç¨ï¼é£æä¹çå¬å¤§éç客æ·ç«¯è¿æ¥å¢ï¼**
Redis éè¿ **IO å¤è·¯å¤ç¨ç¨åº** æ¥ç嬿¥èªå®¢æ·ç«¯ç大éè¿æ¥ï¼æè
说æ¯çå¬å¤ä¸ª socketï¼ï¼å®ä¼å°æå
´è¶£çäºä»¶åç±»åï¼è¯»ãåï¼æ³¨åå°å
æ ¸ä¸å¹¶ç嬿¯ä¸ªäºä»¶æ¯å¦åçã
è¿æ ·ç好å¤éå¸¸ææ¾ï¼ **I/O å¤è·¯å¤ç¨ææ¯ç使ç¨è®© Redis ä¸éè¦é¢å¤å建å¤ä½ççº¿ç¨æ¥çå¬å®¢æ·ç«¯ç大éè¿æ¥ï¼éä½äºèµæºçæ¶è**ï¼å NIO ä¸ç `Selector` ç»ä»¶å¾åï¼ã
å¦å¤ï¼ Redis æå¡å¨æ¯ä¸ä¸ªäºä»¶é©±å¨ç¨åºï¼æå¡å¨éè¦å¤ç两类äºä»¶ï¼
- **æä»¶äºä»¶(file event)** ï¼ç¨äºå¤ç Redis æå¡å¨å客æ·ç«¯ä¹é´çç½ç» IOã
- **æ¶é´äºä»¶(time eveat)** ï¼Redis æå¡å¨ä¸çä¸äºæä½ï¼æ¯å¦ serverCron 彿°ï¼éè¦å¨ç»å®çæ¶é´ç¹æ§è¡ï¼èæ¶é´äºä»¶å°±æ¯å¤çè¿ç±»å®æ¶æä½çã
æ¶é´äºä»¶ä¸éè¦å¤è±æ¶é´äºè§£ï¼æä»¬æ¥è§¦æå¤çè¿æ¯ **æä»¶äºä»¶**ï¼å®¢æ·ç«¯è¿è¡è¯»ååå
¥çæä½ï¼æ¶åä¸ç³»åç½ç»éä¿¡ï¼ã
ãRedis 设计ä¸å®ç°ãæä¸æ®µè¯æ¯å¦æ¯ä»ç»æä»¶äºä»¶çï¼æè§å¾å徿ºä¸éã
> Redis åºäº Reactor 模å¼å¼åäºèªå·±çç½ç»äºä»¶å¤çå¨ï¼è¿ä¸ªå¤çå¨è¢«ç§°ä¸ºæä»¶äºä»¶å¤çå¨ï¼file event handlerï¼ãæä»¶äºä»¶å¤çå¨ä½¿ç¨ I/O å¤è·¯å¤ç¨ï¼multiplexingï¼ç¨åºæ¥åæ¶çå¬å¤ä¸ªå¥æ¥åï¼å¹¶æ ¹æ®å¥æ¥åç®åæ§è¡ç任塿¥ä¸ºå¥æ¥åå
³èä¸åçäºä»¶å¤çå¨ã
>
> å½è¢«çå¬ç奿¥ååå¤å¥½æ§è¡è¿æ¥åºçï¼acceptï¼ã读åï¼readï¼ãåå
¥ï¼writeï¼ãå
³ éï¼closeï¼çæä½æ¶ï¼ä¸æä½ç¸å¯¹åºçæä»¶äºä»¶å°±ä¼äº§çï¼è¿æ¶æä»¶äºä»¶å¤çå¨å°±ä¼è°ç¨å¥æ¥åä¹åå
³è好çäºä»¶å¤ç卿¥å¤çè¿äºäºä»¶ã
>
> **è½ç¶æä»¶äºä»¶å¤çå¨ä»¥åçº¿ç¨æ¹å¼è¿è¡ï¼ä½éè¿ä½¿ç¨ I/O å¤è·¯å¤ç¨ç¨åºæ¥çå¬å¤ä¸ªå¥æ¥å**ï¼æä»¶äºä»¶å¤ç卿¢å®ç°äºé«æ§è½çç½ç»é信模åï¼åå¯ä»¥å¾å¥½å°ä¸ Redis æå¡å¨ä¸å
¶ä»åæ ·ä»¥åçº¿ç¨æ¹å¼è¿è¡ç模åè¿è¡å¯¹æ¥ï¼è¿ä¿æäº Redis å
é¨å线ç¨è®¾è®¡çç®åæ§ã
å¯ä»¥çåºï¼æä»¶äºä»¶å¤çå¨ï¼file event handlerï¼ä¸»è¦æ¯å
å« 4 个é¨åï¼
- å¤ä¸ª socketï¼å®¢æ·ç«¯è¿æ¥ï¼
- IO å¤è·¯å¤ç¨ç¨åºï¼æ¯æå¤ä¸ªå®¢æ·ç«¯è¿æ¥çå
³é®ï¼
- æä»¶äºä»¶åæ´¾å¨ï¼å° socket å
³èå°ç¸åºçäºä»¶å¤çå¨ï¼
- äºä»¶å¤çå¨ï¼è¿æ¥åºçå¤çå¨ãå½ä»¤è¯·æ±å¤çå¨ãå½ä»¤åå¤å¤çå¨ï¼

ç¸å
³é
读ï¼[Redis äºä»¶æºå¶è¯¦è§£](http://remcarpediem.net/article/1aa2da89/) ã
#### Redis6.0 ä¹å为ä»ä¹ä¸ä½¿ç¨å¤çº¿ç¨ï¼
è½ç¶è¯´ Redis æ¯åçº¿ç¨æ¨¡åï¼ä½æ¯ï¼å®é
ä¸ï¼**Redis å¨ 4.0 ä¹åççæ¬ä¸å°±å·²ç»å å
¥äºå¯¹å¤çº¿ç¨çæ¯æã**
ä¸è¿ï¼Redis 4.0 å¢å çå¤çº¿ç¨ä¸»è¦æ¯é对ä¸äºå¤§é®å¼å¯¹çå 餿ä½çå½ä»¤ï¼ä½¿ç¨è¿äºå½ä»¤å°±ä¼ä½¿ç¨ä¸»çº¿ç¨ä¹å¤çå
¶ä»çº¿ç¨æ¥â弿¥å¤çâã
为æ¤ï¼Redis 4.0 ä¹åæ°å¢äº`UNLINK`ï¼å¯ä»¥ç使¯ `DEL` ç弿¥çæ¬ï¼ã`FLUSHALL ASYNC`ï¼æ¸
ç©ºæ°æ®åºï¼ã`FLUSHDB ASYNC`ï¼æ¸
ç©ºæ°æ®åºï¼ç弿¥å½ä»¤ã

大ä½ä¸æ¥è¯´ï¼Redis 6.0 ä¹å主è¦è¿æ¯å线ç¨å¤çã
**é£ Redis6.0 ä¹å为ä»ä¹ä¸ä½¿ç¨å¤çº¿ç¨ï¼** æè§å¾ä¸»è¦åå æ 3 ç¹ï¼
- å线ç¨ç¼ç¨å®¹æå¹¶ä¸æ´å®¹æç»´æ¤ï¼
- Redis çæ§è½ç¶é¢ä¸å¨ CPU ï¼ä¸»è¦å¨å
ååç½ç»ï¼
- å¤çº¿ç¨å°±ä¼å卿»éã线ç¨ä¸ä¸æåæ¢çé®é¢ï¼çè³ä¼å½±åæ§è½ã
#### Redis6.0 ä¹å为ä½å¼å
¥äºå¤çº¿ç¨ï¼
**Redis6.0 å¼å
¥å¤çº¿ç¨ä¸»è¦æ¯ä¸ºäºæé«ç½ç» IO è¯»åæ§è½**ï¼å 为è¿ä¸ªç®æ¯ Redis ä¸çä¸ä¸ªæ§è½ç¶é¢ï¼Redis çç¶é¢ä¸»è¦åéäºå
ååç½ç»ï¼ã
è½ç¶ï¼Redis6.0 å¼å
¥äºå¤çº¿ç¨ï¼ä½æ¯ Redis çå¤çº¿ç¨åªæ¯å¨ç½ç»æ°æ®ç读åè¿ç±»èæ¶æä½ä¸ä½¿ç¨äºï¼æ§è¡å½ä»¤ä»ç¶æ¯å线ç¨é¡ºåºæ§è¡ãå æ¤ï¼ä½ ä¹ä¸éè¦æ
å¿çº¿ç¨å®å
¨é®é¢ã
Redis6.0 çå¤çº¿ç¨é»è®¤æ¯ç¦ç¨çï¼åªä½¿ç¨ä¸»çº¿ç¨ãå¦éå¼å¯éè¦ä¿®æ¹ redis é
ç½®æä»¶ `redis.conf` ï¼
```bash
io-threads-do-reads yes
```
å¼å¯å¤çº¿ç¨åï¼è¿éè¦è®¾ç½®çº¿ç¨æ°ï¼å¦åæ¯ä¸çæçãåæ ·éè¦ä¿®æ¹ redis é
ç½®æä»¶ `redis.conf` :
```bash
io-threads 4 #å®ç½å»ºè®®4æ ¸çæºå¨å»ºè®®è®¾ç½®ä¸º2æ3个线ç¨ï¼8æ ¸ç建议设置为6个线ç¨
```
æ¨èé
读ï¼
- [Redis 6.0 æ°ç¹æ§-å¤çº¿ç¨è¿ç¯ 13 é®ï¼](https://mp.weixin.qq.com/s/FZu3acwK6zrCBZQ_3HoUgw)
- [为ä»ä¹ Redis éæ©åçº¿ç¨æ¨¡å](https://draveness.me/whys-the-design-redis-single-thread/)
- [Redis å¤çº¿ç¨ç½ç»æ¨¡åå
¨é¢æç§](https://segmentfault.com/a/1190000039223696)
### Redis å
å管ç
#### Redis ç»ç¼åæ°æ®è®¾ç½®è¿ææ¶é´æå¥ç¨ï¼
ä¸è¬æ
åµä¸ï¼æä»¬è®¾ç½®ä¿åçç¼åæ°æ®çæ¶åé½ä¼è®¾ç½®ä¸ä¸ªè¿ææ¶é´ã为ä»ä¹å¢ï¼
å 为å
忝æéçï¼å¦æç¼åä¸çæææ°æ®é½æ¯ä¸ç´ä¿åçè¯ï¼ååéç´æ¥ Out of memoryã
Redis èªå¸¦äºç»ç¼åæ°æ®è®¾ç½®è¿ææ¶é´çåè½ï¼æ¯å¦ï¼
```bash
127.0.0.1:6379> exp key 60 # æ°æ®å¨ 60s åè¿æ
(integer) 1
127.0.0.1:6379> setex key 60 value # æ°æ®å¨ 60s åè¿æ (setex:[set] + [ex]pire)
OK
127.0.0.1:6379> ttl key # æ¥çæ°æ®è¿æå¤ä¹
è¿æ
(integer) 56
```
注æï¼**Redis ä¸é¤äºå符串类åæèªå·±ç¬æè®¾ç½®è¿ææ¶é´çå½ä»¤ `setex` å¤ï¼å
¶ä»æ¹æ³é½éè¦ä¾é `expire` å½ä»¤æ¥è®¾ç½®è¿ææ¶é´ ãå¦å¤ï¼ `persist` å½ä»¤å¯ä»¥ç§»é¤ä¸ä¸ªé®çè¿ææ¶é´ã**
**è¿ææ¶é´é¤äºæå©äºç¼è§£å
åçæ¶èï¼è¿æä»ä¹å
¶ä»ç¨ä¹ï¼**
å¾å¤æ¶åï¼æä»¬çä¸å¡åºæ¯å°±æ¯éè¦æä¸ªæ°æ®åªå¨æä¸æ¶é´æ®µå
åå¨ï¼æ¯å¦æä»¬ççä¿¡éªè¯ç å¯è½åªå¨ 1 åéå
ææï¼ç¨æ·ç»å½ç token å¯è½åªå¨ 1 天å
ææã
å¦æä½¿ç¨ä¼ ç»çæ°æ®åºæ¥å¤ççè¯ï¼ä¸è¬é½æ¯èªå·±å¤æè¿æï¼è¿æ ·æ´éº»ç¦å¹¶ä¸æ§è½è¦å·®å¾å¤ã
#### Redis æ¯å¦ä½å¤ææ°æ®æ¯å¦è¿æçå¢ï¼
Redis éè¿ä¸ä¸ªå«åè¿æåå
¸ï¼å¯ä»¥ç使¯ hash è¡¨ï¼æ¥ä¿åæ°æ®è¿æçæ¶é´ãè¿æåå
¸ç鮿å Redis æ°æ®åºä¸çæä¸ª key(é®)ï¼è¿æåå
¸ç弿¯ä¸ä¸ª long long ç±»åçæ´æ°ï¼è¿ä¸ªæ´æ°ä¿åäº key ææåçæ°æ®åºé®çè¿ææ¶é´ï¼æ¯«ç§ç²¾åº¦ç UNIX æ¶é´æ³ï¼ã

è¿æåå
¸æ¯åå¨å¨ redisDb è¿ä¸ªç»æéçï¼
```c
typedef struct redisDb {
...
dict *dict; //æ°æ®åºé®ç©ºé´,ä¿åçæ°æ®åºä¸ææé®å¼å¯¹
dict *expires // è¿æåå
¸,ä¿åçé®çè¿ææ¶é´
...
} redisDb;
```
#### è¿æçæ°æ®çå é¤çç¥äºè§£ä¹ï¼
妿åè®¾ä½ è®¾ç½®äºä¸æ¹ key åªè½åæ´» 1 åéï¼é£ä¹ 1 åéåï¼Redis æ¯æä¹å¯¹è¿æ¹ key è¿è¡å é¤çå¢ï¼
常ç¨çè¿ææ°æ®çå é¤çç¥å°±ä¸¤ä¸ªï¼éè¦ï¼èªå·±é ç¼åè½®åçæ¶åéè¦æ ¼å¤èèçä¸è¥¿ï¼ï¼
1. **æ°æ§å é¤** ï¼åªä¼å¨ååº key çæ¶åæå¯¹æ°æ®è¿è¡è¿ææ£æ¥ãè¿æ ·å¯¹ CPU æå好ï¼ä½æ¯å¯è½ä¼é æå¤ªå¤è¿æ key 没æè¢«å é¤ã
2. **宿å é¤** ï¼ æ¯é䏿®µæ¶é´æ½å䏿¹ key æ§è¡å é¤è¿æ key æä½ãå¹¶ä¸ï¼Redis åºå±ä¼éè¿éå¶å 餿使§è¡çæ¶é¿åé¢çæ¥åå°å 餿ä½å¯¹ CPU æ¶é´çå½±åã
宿å é¤å¯¹å
åæ´å åå¥½ï¼æ°æ§å é¤å¯¹ CPU æ´å å好ã两è
åæåç§ï¼æä»¥ Redis éç¨çæ¯ **宿å é¤+æ°æ§/ææ±å¼å é¤** ã
使¯ï¼ä»
ä»
éè¿ç» key è®¾ç½®è¿ææ¶é´è¿æ¯æé®é¢çãå ä¸ºè¿æ¯å¯è½åå¨å®æå é¤åæ°æ§å 餿¼æäºå¾å¤è¿æ key çæ
åµãè¿æ ·å°±å¯¼è´å¤§éè¿æ key å 积å¨å
åéï¼ç¶åå°± Out of memory äºã
æä¹è§£å³è¿ä¸ªé®é¢å¢ï¼çæ¡å°±æ¯ï¼**Redis å
åæ·æ±°æºå¶ã**
#### Redis å
åæ·æ±°æºå¶äºè§£ä¹ï¼
> ç¸å
³é®é¢ï¼MySQL éæ 2000w æ°æ®ï¼Redis ä¸åªå 20w çæ°æ®ï¼å¦ä½ä¿è¯ Redis ä¸çæ°æ®é½æ¯çç¹æ°æ®?
Redis æä¾ 6 ç§æ°æ®æ·æ±°çç¥ï¼
1. **volatile-lruï¼least recently usedï¼**ï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸æéæè¿æå°ä½¿ç¨çæ°æ®æ·æ±°
2. **volatile-ttl**ï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸æéå°è¦è¿æçæ°æ®æ·æ±°
3. **volatile-random**ï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸ä»»æéæ©æ°æ®æ·æ±°
4. **allkeys-lruï¼least recently usedï¼**ï¼å½å
åä¸è¶³ä»¥å®¹çº³æ°åå
¥æ°æ®æ¶ï¼å¨é®ç©ºé´ä¸ï¼ç§»é¤æè¿æå°ä½¿ç¨ç keyï¼è¿ä¸ªæ¯æå¸¸ç¨çï¼
5. **allkeys-random**ï¼ä»æ°æ®éï¼server.db[i].dictï¼ä¸ä»»æéæ©æ°æ®æ·æ±°
6. **no-eviction**ï¼ç¦æ¢é©±éæ°æ®ï¼ä¹å°±æ¯è¯´å½å
åä¸è¶³ä»¥å®¹çº³æ°åå
¥æ°æ®æ¶ï¼æ°åå
¥æä½ä¼æ¥éãè¿ä¸ªåºè¯¥æ²¡äººä½¿ç¨å§ï¼
4.0 çæ¬åå¢å 以ä¸ä¸¤ç§ï¼
7. **volatile-lfuï¼least frequently usedï¼**ï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸æéæä¸ç»å¸¸ä½¿ç¨çæ°æ®æ·æ±°
8. **allkeys-lfuï¼least frequently usedï¼**ï¼å½å
åä¸è¶³ä»¥å®¹çº³æ°åå
¥æ°æ®æ¶ï¼å¨é®ç©ºé´ä¸ï¼ç§»é¤æä¸ç»å¸¸ä½¿ç¨ç key
### Redis æä¹
åæºå¶
#### æä¹ä¿è¯ Redis ææä¹ååé坿°æ®å¯ä»¥è¿è¡æ¢å¤ï¼
å¾å¤æ¶åæä»¬éè¦æä¹
åæ°æ®ä¹å°±æ¯å°å
åä¸çæ°æ®åå
¥å°ç¡¬çéé¢ï¼å¤§é¨ååå æ¯ä¸ºäºä¹åéç¨æ°æ®ï¼æ¯å¦é坿ºå¨ãæºå¨æ
éä¹åæ¢å¤æ°æ®ï¼ï¼æè
æ¯ä¸ºäºé²æ¢ç³»ç»æ
éèå°æ°æ®å¤ä»½å°ä¸ä¸ªè¿ç¨ä½ç½®ã
Redis ä¸åäº Memcached çå¾éè¦ä¸ç¹å°±æ¯ï¼Redis æ¯ææä¹
åï¼è䏿¯æä¸¤ç§ä¸åçæä¹
åæä½ã**Redis çä¸ç§æä¹
åæ¹å¼å«å¿«ç
§ï¼snapshottingï¼RDBï¼ï¼å¦ä¸ç§æ¹å¼æ¯åªè¿½å æä»¶ï¼append-only file, AOFï¼**ãè¿ä¸¤ç§æ¹æ³åæåç§ï¼ä¸é¢æä¼è¯¦ç»è¿ä¸¤ç§æä¹
åæ¹æ³æ¯ä»ä¹ï¼æä¹ç¨ï¼å¦ä½éæ©éåèªå·±çæä¹
åæ¹æ³ã
#### ä»ä¹æ¯ RDB æä¹
åï¼
Redis å¯ä»¥éè¿å建快ç
§æ¥è·å¾åå¨å¨å
åéé¢çæ°æ®å¨æä¸ªæ¶é´ç¹ä¸ç坿¬ãRedis å建快ç
§ä¹åï¼å¯ä»¥å¯¹å¿«ç
§è¿è¡å¤ä»½ï¼å¯ä»¥å°å¿«ç
§å¤å¶å°å
¶ä»æå¡å¨ä»èå建å
·æç¸åæ°æ®çæå¡å¨å¯æ¬ï¼Redis 主ä»ç»æï¼ä¸»è¦ç¨æ¥æé« Redis æ§è½ï¼ï¼è¿å¯ä»¥å°å¿«ç
§çå¨åå°ä»¥ä¾¿é坿å¡å¨çæ¶å使ç¨ã
å¿«ç
§æä¹
忝 Redis é»è®¤éç¨çæä¹
åæ¹å¼ï¼å¨ `redis.conf` é
ç½®æä»¶ä¸é»è®¤ææ¤ä¸é
ç½®ï¼
```clojure
save 900 1 #å¨900ç§(15åé)ä¹åï¼å¦æè³å°æ1个keyåçååï¼Rediså°±ä¼èªå¨è§¦åbgsaveå½ä»¤å建快ç
§ã
save 300 10 #å¨300ç§(5åé)ä¹åï¼å¦æè³å°æ10个keyåçååï¼Rediså°±ä¼èªå¨è§¦åbgsaveå½ä»¤å建快ç
§ã
save 60 10000 #å¨60ç§(1åé)ä¹åï¼å¦æè³å°æ10000个keyåçååï¼Rediså°±ä¼èªå¨è§¦åbgsaveå½ä»¤å建快ç
§ã
```
#### RDB å建快ç
§æ¶ä¼é»å¡ä¸»çº¿ç¨åï¼
Redis æä¾äºä¸¤ä¸ªå½ä»¤æ¥çæ RDB å¿«ç
§æä»¶ï¼
- `save` : ä¸»çº¿ç¨æ§è¡ï¼ä¼é»å¡ä¸»çº¿ç¨ï¼
- `bgsave` : åçº¿ç¨æ§è¡ï¼ä¸ä¼é»å¡ä¸»çº¿ç¨ï¼é»è®¤é项ã
#### ä»ä¹æ¯ AOF æä¹
åï¼
ä¸å¿«ç
§æä¹
åç¸æ¯ï¼AOF æä¹
åç宿¶æ§æ´å¥½ï¼å æ¤å·²æä¸ºä¸»æµçæä¹
åæ¹æ¡ãé»è®¤æ
åµä¸ Redis 没æå¼å¯ AOFï¼append only fileï¼æ¹å¼çæä¹
åï¼å¯ä»¥éè¿ appendonly åæ°å¼å¯ï¼
```clojure
appendonly yes
```
å¼å¯ AOF æä¹
å忝æ§è¡ä¸æ¡ä¼æ´æ¹ Redis ä¸çæ°æ®çå½ä»¤ï¼Redis å°±ä¼å°è¯¥å½ä»¤åå
¥å°å
åç¼å `server.aof_buf` ä¸ï¼ç¶ååæ ¹æ® `appendfsync` é
ç½®æ¥å³å®ä½æ¶å°å
¶åæ¥å°ç¡¬çä¸ç AOF æä»¶ã
AOF æä»¶çä¿åä½ç½®å RDB æä»¶çä½ç½®ç¸åï¼é½æ¯éè¿ dir åæ°è®¾ç½®çï¼é»è®¤çæä»¶åæ¯ `appendonly.aof`ã
å¨ Redis çé
ç½®æä»¶ä¸åå¨ä¸ç§ä¸åç AOF æä¹
åæ¹å¼ï¼å®ä»¬å嫿¯ï¼
```clojure
appendfsync always #æ¯æ¬¡ææ°æ®ä¿®æ¹åçæ¶é½ä¼åå
¥AOFæä»¶,è¿æ ·ä¼ä¸¥ééä½Redisçé度
appendfsync everysec #æ¯ç§é忥䏿¬¡ï¼æ¾å¼å°å°å¤ä¸ªåå½ä»¤åæ¥å°ç¡¬ç
appendfsync no #让æä½ç³»ç»å³å®ä½æ¶è¿è¡åæ¥
```
为äºå
¼é¡¾æ°æ®ååå
¥æ§è½ï¼ç¨æ·å¯ä»¥èè `appendfsync everysec` é项 ï¼è®© Redis æ¯ç§åæ¥ä¸æ¬¡ AOF æä»¶ï¼Redis æ§è½å 乿²¡åå°ä»»ä½å½±åãèä¸è¿æ ·å³ä½¿åºç°ç³»ç»å´©æºï¼ç¨æ·æå¤åªä¼ä¸¢å¤±ä¸ç§ä¹å
产ççæ°æ®ãå½ç¡¬çå¿äºæ§è¡åå
¥æä½çæ¶åï¼Redis è¿ä¼ä¼é
çæ¾æ
¢èªå·±çé度以便éåºç¡¬ççæå¤§åå
¥é度ã
**ç¸å
³ issue** ï¼
- [Redis ç AOF æ¹å¼ #783](https://github.com/Snailclimb/JavaGuide/issues/783)
- [Redis AOF éåæè¿°ä¸åç¡® #1439](https://github.com/Snailclimb/JavaGuide/issues/1439)
#### AOF æ¥å¿æ¯å¦ä½å®ç°çï¼
å
³ç³»åæ°æ®åºï¼å¦ MySQLï¼é叏齿¯æ§è¡å½ä»¤ä¹åè®°å½æ¥å¿ï¼æ¹ä¾¿æ
鿢å¤ï¼ï¼è Redis AOF æä¹
åæºå¶æ¯å¨æ§è¡å®å½ä»¤ä¹ååè®°å½æ¥å¿ã

**为ä»ä¹æ¯å¨æ§è¡å®å½ä»¤ä¹åè®°å½æ¥å¿å¢ï¼**
- é¿å
é¢å¤çæ£æ¥å¼éï¼AOF è®°å½æ¥å¿ä¸ä¼å¯¹å½ä»¤è¿è¡è¯æ³æ£æ¥ï¼
- å¨å½ä»¤æ§è¡å®ä¹ååè®°å½ï¼ä¸ä¼é»å¡å½åçå½ä»¤æ§è¡ã
è¿æ ·ä¹å¸¦æ¥äºé£é©ï¼æå¨åé¢ä»ç» AOF æä¹
åçæ¶å乿å°è¿ï¼ï¼
- 妿忧è¡å®å½ä»¤ Redis 就宿ºä¼å¯¼è´å¯¹åºçä¿®æ¹ä¸¢å¤±ï¼
- å¯è½ä¼é»å¡åç»å
¶ä»å½ä»¤çæ§è¡ï¼AOF è®°å½æ¥å¿æ¯å¨ Redis 主线ç¨ä¸è¿è¡çï¼ã
#### AOF éåäºè§£åï¼
AOF éåå¯ä»¥äº§çä¸ä¸ªæ°ç AOF æä»¶ï¼è¿ä¸ªæ°ç AOF æä»¶ååæç AOF æä»¶æä¿åçæ°æ®åºç¶æä¸æ ·ï¼ä½ä½ç§¯æ´å°ã
AOF é忝ä¸ä¸ªææ§ä¹çååï¼è¯¥åè½æ¯éè¿è¯»åæ°æ®åºä¸çé®å¼å¯¹æ¥å®ç°çï¼ç¨åºæ é¡»å¯¹ç°æ AOF æä»¶è¿è¡ä»»ä½è¯»å
¥ãåææè
åå
¥æä½ã
卿§è¡ `BGREWRITEAOF` å½ä»¤æ¶ï¼Redis æå¡å¨ä¼ç»´æ¤ä¸ä¸ª AOF éåç¼å²åºï¼è¯¥ç¼å²åºä¼å¨åè¿ç¨åå»ºæ° AOF æä»¶æé´ï¼è®°å½æå¡å¨æ§è¡çææåå½ä»¤ãå½åè¿ç¨å®æåå»ºæ° AOF æä»¶çå·¥ä½ä¹åï¼æå¡å¨ä¼å°éåç¼å²åºä¸çææå
容追å å°æ° AOF æä»¶çæ«å°¾ï¼ä½¿å¾æ°ç AOF æä»¶ä¿åçæ°æ®åºç¶æä¸ç°æçæ°æ®åºç¶æä¸è´ãæåï¼æå¡å¨ç¨æ°ç AOF æä»¶æ¿æ¢æ§ç AOF æä»¶ï¼ä»¥æ¤æ¥å®æ AOF æä»¶éåæä½ã
#### Redis 4.0 å¯¹äºæä¹
åæºå¶åäºä»ä¹ä¼åï¼
Redis 4.0 å¼å§æ¯æ RDB å AOF çæ··åæä¹
åï¼é»è®¤å
³éï¼å¯ä»¥éè¿é
置项 `aof-use-rdb-preamble` å¼å¯ï¼ã
å¦æææ··åæä¹
åæå¼ï¼AOF éåçæ¶åå°±ç´æ¥æ RDB çå
容åå° AOF æä»¶å¼å¤´ãè¿æ ·åç好夿¯å¯ä»¥ç»å RDB å AOF çä¼ç¹, å¿«éå è½½åæ¶é¿å
丢失è¿å¤çæ°æ®ãå½ç¶ç¼ºç¹ä¹æ¯æçï¼ AOF éé¢ç RDB é¨åæ¯åç¼©æ ¼å¼ä¸åæ¯ AOF æ ¼å¼ï¼å¯è¯»æ§è¾å·®ã
宿¹ææ¡£å°åï¼https://redis.io/topics/persistence

### Redis äºå¡
#### å¦ä½ä½¿ç¨ Redis äºå¡ï¼
Redis å¯ä»¥éè¿ **`MULTI`ï¼`EXEC`ï¼`DISCARD` å `WATCH`** çå½ä»¤æ¥å®ç°äºå¡(transaction)åè½ã
```bash
> MULTI
OK
> SET USER "Guideå¥"
QUEUED
> GET USER
QUEUED
> EXEC
1) OK
2) "Guideå¥"
```
ä½¿ç¨ [`MULTI`](https://redis.io/commands/multi) å½ä»¤åå¯ä»¥è¾å
¥å¤ä¸ªå½ä»¤ãRedis ä¸ä¼ç«å³æ§è¡è¿äºå½ä»¤ï¼èæ¯å°å®ä»¬æ¾å°éåï¼å½è°ç¨äº [`EXEC`](https://redis.io/commands/exec) å½ä»¤å°æ§è¡ææå½ä»¤ã
è¿ä¸ªè¿ç¨æ¯è¿æ ·çï¼
1. å¼å§äºå¡ï¼`MULTI`ï¼ã
2. å½ä»¤å
¥é(æ¹éæä½ Redis çå½ä»¤ï¼å
è¿å
åºï¼FIFOï¼çé¡ºåºæ§è¡)ã
3. æ§è¡äºå¡(`EXEC`)ã
ä½ ä¹å¯ä»¥éè¿ [`DISCARD`](https://redis.io/commands/discard) å½ä»¤åæ¶ä¸ä¸ªäºå¡ï¼å®ä¼æ¸
空äºå¡éåä¸ä¿åçææå½ä»¤ã
```bash
> MULTI
OK
> SET USER "Guideå¥"
QUEUED
> GET USER
QUEUED
> DISCARD
OK
```
[`WATCH`](https://redis.io/commands/watch) å½ä»¤ç¨äºç嬿å®çé®ï¼å½è°ç¨ `EXEC` å½ä»¤æ§è¡äºå¡æ¶ï¼å¦æä¸ä¸ªè¢« `WATCH` å½ä»¤çè§çé®è¢«ä¿®æ¹çè¯ï¼æ´ä¸ªäºå¡é½ä¸ä¼æ§è¡ï¼ç´æ¥è¿å失败ã
```bash
> WATCH USER
OK
> MULTI
> SET USER "Guideå¥"
OK
> GET USER
Guideå¥
> EXEC
ERR EXEC without MULTI
```
Redis å®ç½ç¸å
³ä»ç» [https://redis.io/topics/transactions](https://redis.io/topics/transactions) å¦ä¸ï¼

#### Redis æ¯æååæ§åï¼
Redis çäºå¡åæä»¬å¹³æ¶çè§£çå
³ç³»åæ°æ®åºçäºå¡ä¸åãæä»¬ç¥éäºå¡å
·æåå¤§ç¹æ§ï¼ **1. ååæ§**ï¼**2. é离æ§**ï¼**3. æä¹
æ§**ï¼**4. ä¸è´æ§**ã
1. **ååæ§ï¼Atomicityï¼ï¼** äºå¡æ¯æå°çæ§è¡åä½ï¼ä¸å
许åå²ãäºå¡çååæ§ç¡®ä¿å¨ä½è¦ä¹å
¨é¨å®æï¼è¦ä¹å®å
¨ä¸èµ·ä½ç¨ï¼
2. **é离æ§ï¼Isolationï¼ï¼** å¹¶åè®¿é®æ°æ®åºæ¶ï¼ä¸ä¸ªç¨æ·çäºå¡ä¸è¢«å
¶ä»äºå¡æå¹²æ°ï¼åå¹¶åäºå¡ä¹é´æ°æ®åºæ¯ç¬ç«çï¼
3. **æä¹
æ§ï¼Durabilityï¼ï¼** ä¸ä¸ªäºå¡è¢«æäº¤ä¹åãå®å¯¹æ°æ®åºä¸æ°æ®çæ¹åæ¯æä¹
çï¼å³ä½¿æ°æ®åºåçæ
éä¹ä¸åºè¯¥å¯¹å
¶æä»»ä½å½±åã
4. **ä¸è´æ§ï¼Consistencyï¼ï¼** æ§è¡äºå¡ååï¼æ°æ®ä¿æä¸è´ï¼å¤ä¸ªäºå¡å¯¹åä¸ä¸ªæ°æ®è¯»åçç»ææ¯ç¸åçï¼
Redis äºå¡å¨è¿è¡é误çæ
åµä¸ï¼é¤äºæ§è¡è¿ç¨ä¸åºç°é误çå½ä»¤å¤ï¼å
¶ä»å½ä»¤é½è½æ£å¸¸æ§è¡ãå¹¶ä¸ï¼Redis æ¯ä¸æ¯æåæ»ï¼roll backï¼æä½çãå æ¤ï¼Redis äºå¡å
¶å®æ¯ä¸æ»¡è¶³ååæ§çï¼èä¸ä¸æ»¡è¶³æä¹
æ§ï¼ã
Redis å®ç½ä¹è§£éäºèªå·±ä¸ºå¥ä¸æ¯æåæ»ãç®åæ¥è¯´å°±æ¯ Redis å¼åè
们è§å¾æ²¡å¿
è¦æ¯æåæ»ï¼è¿æ ·æ´ç®å便æ·å¹¶ä¸æ§è½æ´å¥½ãRedis å¼åè
è§å¾å³ä½¿å½ä»¤æ§è¡é误ä¹åºè¯¥å¨å¼åè¿ç¨ä¸å°±è¢«åç°è䏿¯ç产è¿ç¨ä¸ã

ä½ å¯ä»¥å° Redis ä¸çäºå¡å°±ç解为 ï¼**Redis äºå¡æä¾äºä¸ç§å°å¤ä¸ªå½ä»¤è¯·æ±æå
çåè½ãç¶åï¼åæé¡ºåºæ§è¡æå
çææå½ä»¤ï¼å¹¶ä¸ä¸ä¼è¢«ä¸éææã**
é¤äºä¸æ»¡è¶³ååæ§ä¹å¤ï¼äºå¡ä¸çæ¯æ¡å½ä»¤é½ä¼ä¸ Redis æå¡å¨è¿è¡ç½ç»äº¤äºï¼è¿æ¯æ¯è¾æµªè´¹èµæºçè¡ä¸ºãææä¸æ¬¡æ¹éæ§è¡å¤ä¸ªå½ä»¤å°±å¯ä»¥äºï¼è¿ç§æä½å®å¨æ¯ç䏿ã
å æ¤ï¼Redis äºå¡æ¯ä¸å»ºè®®å¨æ¥å¸¸å¼åä¸ä½¿ç¨çã
**ç¸å
³ issue** :
- [issue452: å
³äº Redis äºå¡ä¸æ»¡è¶³ååæ§çé®é¢](https://github.com/Snailclimb/JavaGuide/issues/452) ã
- [Issue491:å
³äº redis 没æäºå¡åæ»ï¼](https://github.com/Snailclimb/JavaGuide/issues/491)
#### å¦ä½è§£å³ Redis äºå¡ç缺é·ï¼
Redis ä» 2.6 çæ¬å¼å§æ¯ææ§è¡ Lua èæ¬ï¼å®çåè½åäºå¡é常类似ãæä»¬å¯ä»¥å©ç¨ Lua èæ¬æ¥æ¹éæ§è¡å¤æ¡ Redis å½ä»¤ï¼è¿äº Redis å½ä»¤ä¼è¢«æäº¤å° Redis æå¡å¨ä¸æ¬¡æ§æ§è¡å®æï¼å¤§å¹
åå°äºç½ç»å¼éã
䏿®µ Lua èæ¬å¯ä»¥è§ä½ä¸æ¡å½ä»¤æ§è¡ï¼ä¸æ®µ Lua èæ¬æ§è¡è¿ç¨ä¸ä¸ä¼æå
¶ä»èæ¬æ Redis å½ä»¤åæ¶æ§è¡ï¼ä¿è¯äºæä½ä¸ä¼è¢«å
¶ä»æä»¤æå
¥æææ°ã
妿 Lua èæ¬è¿è¡æ¶åºéå¹¶ä¸éç»æï¼åºéä¹åçå½ä»¤æ¯ä¸ä¼è¢«æ§è¡çãå¹¶ä¸ï¼åºéä¹åæ§è¡çå½ä»¤æ¯æ æ³è¢«æ¤éçãå æ¤ï¼ä¸¥æ ¼æ¥è¯´ï¼éè¿ Lua èæ¬æ¥æ¹éæ§è¡ Redis å½ä»¤ä¹æ¯ä¸æ»¡è¶³ååæ§çã
å¦å¤ï¼Redis 7.0 æ°å¢äº [Redis functions](https://redis.io/docs/manual/programmability/functions-intro/) ç¹æ§ï¼ä½ å¯ä»¥å° Redis functions ç使¯æ¯ Lua æ´å¼ºå¤§çèæ¬ã
### Redis æ§è½ä¼å
#### Redis bigkey
###### ä»ä¹æ¯ bigkeyï¼
ç®åæ¥è¯´ï¼å¦æä¸ä¸ª key 对åºç value æå ç¨çå
忝è¾å¤§ï¼é£è¿ä¸ª key å°±å¯ä»¥ç使¯ bigkeyãå
·ä½å¤å¤§æç®å¤§å¢ï¼æä¸ä¸ªä¸æ¯ç¹å«ç²¾ç¡®çåèæ åï¼string ç±»åç value è¶
è¿ 10 kbï¼å¤åç±»åç value å
å«çå
ç´ è¶
è¿ 5000 个ï¼å¯¹äºå¤åç±»åç value æ¥è¯´ï¼ä¸ä¸å®å
å«çå
ç´ è¶å¤ï¼å ç¨çå
åå°±è¶å¤ï¼ã
###### bigkey æä»ä¹å±å®³ï¼
é¤äºä¼æ¶èæ´å¤çå
å空é´ï¼bigkey 对æ§è½ä¹ä¼ææ¯è¾å¤§çå½±åã
å æ¤ï¼æä»¬åºè¯¥å°½éé¿å
åå
¥ bigkeyï¼
###### å¦ä½åç° bigkeyï¼
**1ãä½¿ç¨ Redis èªå¸¦ç `--bigkeys` åæ°æ¥æ¥æ¾ã**
```bash
# redis-cli -p 6379 --bigkeys
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).
[00.00%] Biggest string found so far '"ballcat:oauth:refresh_auth:f6cdb384-9a9d-4f2f-af01-dc3f28057c20"' with 4437 bytes
[00.00%] Biggest list found so far '"my-list"' with 17 items
-------- summary -------
Sampled 5 keys in the keyspace!
Total key length in bytes is 264 (avg len 52.80)
Biggest list found '"my-list"' has 17 items
Biggest string found '"ballcat:oauth:refresh_auth:f6cdb384-9a9d-4f2f-af01-dc3f28057c20"' has 4437 bytes
1 lists with 17 items (20.00% of keys, avg size 17.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
4 strings with 4831 bytes (80.00% of keys, avg size 1207.75)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00
```
ä»è¿ä¸ªå½ä»¤çè¿è¡ç»æï¼æä»¬å¯ä»¥çåºï¼è¿ä¸ªå½ä»¤ä¼æ«æ(Scan) Redis ä¸çææ key ï¼ä¼å¯¹ Redis çæ§è½æä¸ç¹å½±åãå¹¶ä¸ï¼è¿ç§æ¹å¼åªè½æ¾åºæ¯ç§æ°æ®ç»æ top 1 bigkeyï¼å ç¨å
åæå¤§ç string æ°æ®ç±»åï¼å
å«å
ç´ æå¤çå¤åæ°æ®ç±»åï¼ã
**2ãåæ RDB æä»¶**
éè¿åæ RDB æä»¶æ¥æ¾åº big keyãè¿ç§æ¹æ¡çåææ¯ä½ ç Redis éç¨çæ¯ RDB æä¹
åã
ç½ä¸æç°æç代ç /å·¥å
·å¯ä»¥ç´æ¥æ¿æ¥ä½¿ç¨ï¼
- [redis-rdb-tools](https://github.com/sripathikrishnan/redis-rdb-tools) ï¼Python è¯è¨åçç¨æ¥åæ Redis ç RDB å¿«ç
§æä»¶ç¨çå·¥å
·
- [rdb_bigkeys](https://github.com/weiyanwei412/rdb_bigkeys) : Go è¯è¨åçç¨æ¥åæ Redis ç RDB å¿«ç
§æä»¶ç¨çå·¥å
·ï¼æ§è½æ´å¥½ã
#### 大é key éä¸è¿æé®é¢
æå¨ä¸é¢æå°è¿ï¼å¯¹äºè¿æ keyï¼Redis éç¨çæ¯ **宿å é¤+æ°æ§/ææ±å¼å é¤** çç¥ã
宿å 餿§è¡è¿ç¨ä¸ï¼å¦æçªç¶éå°å¤§éè¿æ key çè¯ï¼å®¢æ·ç«¯è¯·æ±å¿
é¡»çå¾
宿æ¸
çè¿æ key ä»»å¡çº¿ç¨æ§è¡å®æï¼å 为è¿ä¸ªè¿ä¸ªå®æä»»å¡çº¿ç¨æ¯å¨ Redis 主线ç¨ä¸æ§è¡çãè¿å°±å¯¼è´å®¢æ·ç«¯è¯·æ±æ²¡åæ³è¢«åæ¶å¤çï¼ååºéåº¦ä¼æ¯è¾æ
¢ã
å¦ä½è§£å³å¢ï¼ä¸é¢æ¯ä¸¤ç§å¸¸è§çæ¹æ³ï¼
1. ç» key è®¾ç½®éæºè¿ææ¶é´ã
2. å¼å¯ lazy-freeï¼æ°æ§å é¤/å»¶è¿éæ¾ï¼ ãlazy-free ç¹æ§æ¯ Redis 4.0 å¼å§å¼å
¥çï¼æçæ¯è®© Redis éç¨å¼æ¥æ¹å¼å»¶è¿éæ¾ key 使ç¨çå
åï¼å°è¯¥æä½äº¤ç»åç¬çå线ç¨å¤çï¼é¿å
é»å¡ä¸»çº¿ç¨ã
个人建议ä¸ç®¡æ¯å¦å¼å¯ lazy-freeï¼æä»¬é½å°½éç» key è®¾ç½®éæºè¿ææ¶é´ã
### Redis ç产é®é¢
#### ç¼åç©¿é
###### ä»ä¹æ¯ç¼åç©¿éï¼
ç¼åç©¿é说ç®åç¹å°±æ¯å¤§é请æ±ç key æ ¹æ¬ä¸åå¨äºç¼åä¸ï¼å¯¼è´è¯·æ±ç´æ¥å°äºæ°æ®åºä¸ï¼æ ¹æ¬æ²¡æç»è¿ç¼åè¿ä¸å±ã举个ä¾åï¼æä¸ªé»å®¢æ
æå¶é æä»¬ç¼åä¸ä¸åå¨ç key å起大é请æ±ï¼å¯¼è´å¤§é请æ±è½å°æ°æ®åºã
###### ç¼åç©¿éæ
åµçå¤çæµç¨æ¯ææ ·çï¼
å¦ä¸å¾æç¤ºï¼ç¨æ·çè¯·æ±æç»é½è¦è·å°æ°æ®åºä¸æ¥è¯¢ä¸éã

###### æåªäºè§£å³åæ³ï¼
æåºæ¬çå°±æ¯é¦å
åå¥½åæ°æ ¡éªï¼ä¸äºä¸åæ³çåæ°è¯·æ±ç´æ¥æåºå¼å¸¸ä¿¡æ¯è¿åç»å®¢æ·ç«¯ãæ¯å¦æ¥è¯¢çæ°æ®åº id ä¸è½å°äº 0ãä¼ å
¥çé®ç®±æ ¼å¼ä¸å¯¹çæ¶åç´æ¥è¿åéè¯¯æ¶æ¯ç»å®¢æ·ç«¯ççã
**1ï¼ç¼åæ æ key**
妿ç¼ååæ°æ®åºé½æ¥ä¸å°æä¸ª key çæ°æ®å°±åä¸ä¸ªå° Redis ä¸å»å¹¶è®¾ç½®è¿ææ¶é´ï¼å
·ä½å½ä»¤å¦ä¸ï¼ `SET key value EX 10086` ãè¿ç§æ¹å¼å¯ä»¥è§£å³è¯·æ±ç key ååä¸é¢ç¹çæ
åµï¼å¦æé»å®¢æ¶ææ»å»ï¼æ¯æ¬¡æå»ºä¸åçè¯·æ± keyï¼ä¼å¯¼è´ Redis ä¸ç¼åå¤§éæ æç key ã徿æ¾ï¼è¿ç§æ¹æ¡å¹¶ä¸è½ä»æ ¹æ¬ä¸è§£å³æ¤é®é¢ã妿éè¦ç¨è¿ç§æ¹å¼æ¥è§£å³ç©¿éé®é¢çè¯ï¼å°½éå°æ æç key çè¿ææ¶é´è®¾ç½®çä¸ç¹æ¯å¦ 1 åéã
å¦å¤ï¼è¿éå¤è¯´ä¸å´ï¼ä¸è¬æ
åµä¸æä»¬æ¯è¿æ ·è®¾è®¡ key çï¼ `表å:åå:主é®å:主é®å¼` ã
å¦æç¨ Java 代ç å±ç¤ºçè¯ï¼å·®ä¸å¤æ¯ä¸é¢è¿æ ·çï¼
```java
public Object getObjectInclNullById(Integer id) {
// ä»ç¼åä¸è·åæ°æ®
Object cacheValue = cache.get(id);
// ç¼å为空
if (cacheValue == null) {
// 仿°æ®åºä¸è·å
Object storageValue = storage.get(key);
// ç¼å空对象
cache.set(key, storageValue);
// 妿å卿°æ®ä¸ºç©ºï¼éè¦è®¾ç½®ä¸ä¸ªè¿ææ¶é´(300ç§)
if (storageValue == null) {
// å¿
é¡»è®¾ç½®è¿ææ¶é´ï¼å¦åæè¢«æ»å»çé£é©
cache.expire(key, 60 * 5);
}
return storageValue;
}
return cacheValue;
}
```
**2ï¼å¸éè¿æ»¤å¨**
å¸éè¿æ»¤å¨æ¯ä¸ä¸ªé常ç¥å¥çæ°æ®ç»æï¼éè¿å®æä»¬å¯ä»¥é常æ¹ä¾¿å°å¤æä¸ä¸ªç»å®æ°æ®æ¯å¦åå¨äºæµ·éæ°æ®ä¸ãæä»¬éè¦çå°±æ¯å¤æ key æ¯å¦åæ³ï¼ææ²¡ææè§å¸éè¿æ»¤å¨å°±æ¯æä»¬æ³è¦æ¾çé£ä¸ªâ人âã
å
·ä½æ¯è¿æ ·åçï¼æææå¯è½åå¨ç请æ±çå¼é½åæ¾å¨å¸éè¿æ»¤å¨ä¸ï¼å½ç¨æ·è¯·æ±è¿æ¥ï¼å
å¤æç¨æ·åæ¥ç请æ±ç弿¯å¦åå¨äºå¸éè¿æ»¤å¨ä¸ãä¸åå¨çè¯ï¼ç´æ¥è¿å请æ±åæ°é误信æ¯ç»å®¢æ·ç«¯ï¼åå¨çè¯æä¼èµ°ä¸é¢çæµç¨ã
å å
¥å¸éè¿æ»¤å¨ä¹åçç¼åå¤çæµç¨å¾å¦ä¸ã

使¯ï¼éè¦æ³¨æçæ¯å¸éè¿æ»¤å¨å¯è½ä¼åå¨è¯¯å¤çæ
åµãæ»ç»æ¥è¯´å°±æ¯ï¼ **å¸éè¿æ»¤å¨è¯´æä¸ªå
ç´ åå¨ï¼å°æ¦çä¼è¯¯å¤ãå¸éè¿æ»¤å¨è¯´æä¸ªå
ç´ ä¸å¨ï¼é£ä¹è¿ä¸ªå
ç´ ä¸å®ä¸å¨ã**
_为ä»ä¹ä¼åºç°è¯¯å¤çæ
åµå¢? æä»¬è¿è¦ä»å¸éè¿æ»¤å¨çåçæ¥è¯´ï¼_
æä»¬å
æ¥çä¸ä¸ï¼**å½ä¸ä¸ªå
ç´ å å
¥å¸éè¿æ»¤å¨ä¸çæ¶åï¼ä¼è¿è¡åªäºæä½ï¼**
1. 使ç¨å¸éè¿æ»¤å¨ä¸çåå¸å½æ°å¯¹å
ç´ å¼è¿è¡è®¡ç®ï¼å¾å°åå¸å¼ï¼æå 个åå¸å½æ°å¾å°å 个åå¸å¼ï¼ã
2. æ ¹æ®å¾å°çåå¸å¼ï¼å¨ä½æ°ç»ä¸æå¯¹åºä¸æ çå¼ç½®ä¸º 1ã
æä»¬åæ¥çä¸ä¸ï¼**彿们éè¦å¤æä¸ä¸ªå
ç´ æ¯å¦åå¨äºå¸éè¿æ»¤å¨çæ¶åï¼ä¼è¿è¡åªäºæä½ï¼**
1. 对ç»å®å
ç´ åæ¬¡è¿è¡ç¸åçåå¸è®¡ç®ï¼
2. å¾å°å¼ä¹å夿使°ç»ä¸çæ¯ä¸ªå
ç´ æ¯å¦é½ä¸º 1ï¼å¦æå¼é½ä¸º 1ï¼é£ä¹è¯´æè¿ä¸ªå¼å¨å¸éè¿æ»¤å¨ä¸ï¼å¦æåå¨ä¸ä¸ªå¼ä¸ä¸º 1ï¼è¯´æè¯¥å
ç´ ä¸å¨å¸éè¿æ»¤å¨ä¸ã
ç¶åï¼ä¸å®ä¼åºç°è¿æ ·ä¸ç§æ
åµï¼**ä¸åçå符串å¯è½åå¸åºæ¥çä½ç½®ç¸åã** ï¼å¯ä»¥éå½å¢å 使°ç»å¤§å°æè
è°æ´æä»¬çåå¸å½æ°æ¥é使¦çï¼
æ´å¤å
³äºå¸éè¿æ»¤å¨çå
容å¯ä»¥çæçè¿ç¯ååï¼[ãä¸äºè§£å¸éè¿æ»¤å¨ï¼ä¸æç»ä½ æ´çææç½ç½ï¼ã](https://javaguide.cn/cs-basics/data-structure/bloom-filter/) ï¼å¼ºçæ¨èï¼ä¸ªäººæè§ç½ä¸åºè¯¥æ¾ä¸å°æ»ç»çè¿ä¹ææç½ç½çæç« äºã
#### ç¼åéªå´©
###### ä»ä¹æ¯ç¼åéªå´©ï¼
æåç°ç¼åéªå´©è¿ååèµ·çæç¹ææï¼ååã
å®é
ä¸ï¼ç¼åéªå´©æè¿°çå°±æ¯è¿æ ·ä¸ä¸ªç®åçåºæ¯ï¼**ç¼åå¨å䏿¶é´å¤§é¢ç§¯ç失æï¼åé¢ç请æ±é½ç´æ¥è½å°äºæ°æ®åºä¸ï¼é ææ°æ®åºçæ¶é´å
æ¿å大é请æ±ã** è¿å°±å¥½æ¯éªå´©ä¸æ ·ï¼æ§æ¯ææ½ä¹å¿ï¼æ°æ®åºçåå坿³èç¥ï¼å¯è½ç´æ¥å°±è¢«è¿ä¹å¤è¯·æ±å¼å®æºäºã
举个ä¾åï¼ç³»ç»çç¼å模ååºäºé®é¢æ¯å¦å®æºå¯¼è´ä¸å¯ç¨ãé æç³»ç»çææè®¿é®ï¼é½è¦èµ°æ°æ®åºã
è¿æä¸ç§ç¼åéªå´©çåºæ¯æ¯ï¼**æä¸äºè¢«å¤§éè®¿é®æ°æ®ï¼çç¹ç¼åï¼å¨æä¸æ¶å»å¤§é¢ç§¯å¤±æï¼å¯¼è´å¯¹åºç请æ±ç´æ¥è½å°äºæ°æ®åºä¸ã** è¿æ ·çæ
åµï¼æä¸é¢å ç§è§£å³åæ³ï¼
举个ä¾å ï¼ç§æå¼å§ 12 ä¸ªå°æ¶ä¹åï¼æä»¬ç»ä¸åæ¾äºä¸æ¹ååå° Redis ä¸ï¼è®¾ç½®çç¼åè¿ææ¶é´ä¹æ¯ 12 ä¸ªå°æ¶ï¼é£ä¹ç§æå¼å§çæ¶åï¼è¿äºç§æçååç访é®ç´æ¥å°±å¤±æäºã导è´çæ
åµå°±æ¯ï¼ç¸åºç请æ±ç´æ¥å°±è½å°äºæ°æ®åºä¸ï¼å°±åéªå´©ä¸æ ·å¯æã
###### æåªäºè§£å³åæ³ï¼
**é对 Redis æå¡ä¸å¯ç¨çæ
åµï¼**
1. éç¨ Redis é群ï¼é¿å
åæºåºç°é®é¢æ´ä¸ªç¼åæå¡é½æ²¡åæ³ä½¿ç¨ã
2. éæµï¼é¿å
åæ¶å¤ç大éç请æ±ã
**é对çç¹ç¼å失æçæ
åµï¼**
1. 设置ä¸åçå¤±ææ¶é´æ¯å¦éæºè®¾ç½®ç¼åçå¤±ææ¶é´ã
2. ç¼åæ°¸ä¸å¤±æã
#### å¦ä½ä¿è¯ç¼ååæ°æ®åºæ°æ®çä¸è´æ§ï¼
ç»è¯´çè¯å¯ä»¥æ¯å¾å¤ï¼ä½æ¯æè§å¾å
¶å®æ²¡å¤ªå¤§å¿
è¦ï¼å°å£° BBï¼å¾å¤è§£å³æ¹æ¡æä¹æ²¡å¤ªå¼æç½ï¼ãæä¸ªäººè§å¾å¼å
¥ç¼åä¹åï¼å¦æä¸ºäºçæ¶é´çä¸ä¸è´æ§é®é¢ï¼éæ©è®©ç³»ç»è®¾è®¡å徿´å 夿çè¯ï¼å®å
¨æ²¡å¿
è¦ã
ä¸é¢åç¬å¯¹ **Cache Aside Patternï¼æè·¯ç¼å模å¼ï¼** æ¥èèã
Cache Aside Pattern ä¸éå°åè¯·æ±æ¯è¿æ ·çï¼æ´æ° DBï¼ç¶åç´æ¥å é¤ cache ã
å¦ææ´æ°æ°æ®åºæåï¼èå é¤ç¼åè¿ä¸æ¥å¤±è´¥çæ
åµçè¯ï¼ç®åè¯´ä¸¤ä¸ªè§£å³æ¹æ¡ï¼
1. **ç¼åå¤±ææ¶é´åçï¼ä¸æ¨èï¼æ²»æ 䏿²»æ¬ï¼** ï¼æä»¬è®©ç¼åæ°æ®çè¿ææ¶é´åçï¼è¿æ ·çè¯ç¼åå°±ä¼ä»æ°æ®åºä¸å è½½æ°æ®ãå¦å¤ï¼è¿ç§è§£å³åæ³å¯¹äºå
æä½ç¼ååæä½æ°æ®åºçåºæ¯ä¸éç¨ã
2. **å¢å cache æ´æ°éè¯æºå¶ï¼å¸¸ç¨ï¼**ï¼ å¦æ cache æå¡å½åä¸å¯ç¨å¯¼è´ç¼åå é¤å¤±è´¥çè¯ï¼æä»¬å°±é䏿®µæ¶é´è¿è¡éè¯ï¼éè¯æ¬¡æ°å¯ä»¥èªå·±å®ã妿夿¬¡éè¯è¿æ¯å¤±è´¥çè¯ï¼æä»¬å¯ä»¥æå½åæ´æ°å¤±è´¥ç key åå
¥éåä¸ï¼çç¼åæå¡å¯ç¨ä¹åï¼åå°ç¼åä¸å¯¹åºç key å é¤å³å¯ã
ç¸å
³æç« æ¨èï¼[ç¼ååæ°æ®åºä¸è´æ§é®é¢ï¼çè¿ç¯å°±å¤äº - æ°´æ»´ä¸é¶å¼¹](https://mp.weixin.qq.com/s?__biz=MzIyOTYxNDI5OA==&mid=2247487312&idx=1&sn=fa19566f5729d6598155b5c676eee62d&chksm=e8beb8e5dfc931f3e35655da9da0b61c79f2843101c130cf38996446975014f958a6481aacf1&scene=178&cur_album_id=1699766580538032128#rd)
------
# 5. å¸¸ç¨æ¡æ¶
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
## 5.1 Spring
### Spring åºç¡
#### ä»ä¹æ¯ Spring æ¡æ¶?
Spring æ¯ä¸æ¬¾å¼æºçè½»é级 Java å¼åæ¡æ¶ï¼æ¨å¨æé«å¼å人åçå¼åæç以åç³»ç»çå¯ç»´æ¤æ§ã
æä»¬ä¸è¬è¯´ Spring æ¡æ¶æç齿¯ Spring Frameworkï¼å®æ¯å¾å¤æ¨¡åçéåï¼ä½¿ç¨è¿äºæ¨¡åå¯ä»¥å¾æ¹ä¾¿å°å婿们è¿è¡å¼åï¼æ¯å¦è¯´ Spring æ¯æ IoCï¼Inverse of Control:æ§å¶åè½¬ï¼ å AOP(Aspect-Oriented Programming:é¢ååé¢ç¼ç¨)ãå¯ä»¥å¾æ¹ä¾¿å°å¯¹æ°æ®åºè¿è¡è®¿é®ãå¯ä»¥å¾æ¹ä¾¿å°éæç¬¬ä¸æ¹ç»ä»¶ï¼çµåé®ä»¶ï¼ä»»å¡ï¼è°åº¦ï¼ç¼åççï¼ã对åå
æµè¯æ¯ææ¯è¾å¥½ãæ¯æ RESTful Java åºç¨ç¨åºçå¼åã

Spring ææ ¸å¿çææ³å°±æ¯ä¸éæ°é è½®åï¼å¼ç®±å³ç¨ï¼æé«å¼åæçã
Spring ç¿»è¯è¿æ¥å°±æ¯æ¥å¤©çææï¼å¯è§å
¶ç®æ å使å½å°±æ¯ä¸º Java ç¨åºåå¸¦æ¥æ¥å¤©åï¼æå¨ï¼
ð¤ 夿ä¸å´ ï¼ **è¯è¨çæµè¡é常éè¦ä¸ä¸ªææçº§çåºç¨ï¼Spring å°±æ¯ Java çæçä¸ä¸ªææçº§çåºç¨æ¡æ¶ã**
Spring æä¾çæ ¸å¿åè½ä¸»è¦æ¯ IoC å AOPãå¦ä¹ Spring ï¼ä¸å®è¦æ IoC å AOP çæ ¸å¿ææ³ææï¼
- Spring å®ç½ï¼
- Github å°åï¼ https://github.com/spring-projects/spring-framework
#### Spring å
å«ç模åæåªäºï¼
**Spring4.x çæ¬** ï¼

**Spring5.x çæ¬** ï¼

Spring5.x çæ¬ä¸ Web 模åç Portlet ç»ä»¶å·²ç»è¢«åºå¼æï¼åæ¶å¢å äºç¨äºå¼æ¥ååºå¼å¤çç WebFlux ç»ä»¶ã
Spring å个模åçä¾èµå
³ç³»å¦ä¸ï¼

###### Core Container
Spring æ¡æ¶çæ ¸å¿æ¨¡åï¼ä¹å¯ä»¥è¯´æ¯åºç¡æ¨¡åï¼ä¸»è¦æä¾ IoC ä¾èµæ³¨å
¥åè½çæ¯æãSpring å
¶ä»ææçåè½åºæ¬é½éè¦ä¾èµäºè¯¥æ¨¡åï¼æä»¬ä»ä¸é¢é£å¼ Spring å个模åçä¾èµå
³ç³»å¾å°±å¯ä»¥çåºæ¥ã
- **spring-core** ï¼Spring æ¡æ¶åºæ¬çæ ¸å¿å·¥å
፱ȋ
- **spring-beans** ï¼æä¾å¯¹ bean çå建ãé
ç½®å管ççåè½çæ¯æã
- **spring-context** ï¼æä¾å¯¹å½é
åãäºä»¶ä¼ æãèµæºå è½½çåè½çæ¯æã
- **spring-expression** ï¼æä¾å¯¹è¡¨è¾¾å¼è¯è¨ï¼Spring Expression Languageï¼ SpEL çæ¯æï¼åªä¾èµäº core 模åï¼ä¸ä¾èµäºå
¶ä»æ¨¡åï¼å¯ä»¥åç¬ä½¿ç¨ã
###### AOP
- **spring-aspects** ï¼è¯¥æ¨¡åä¸ºä¸ AspectJ ç鿿便¯æã
- **spring-aop** ï¼æä¾äºé¢ååé¢çç¼ç¨å®ç°ã
- **spring-instrument** ï¼æä¾äºä¸º JVM æ·»å 代çï¼agentï¼çåè½ã å
·ä½æ¥è®²ï¼å®ä¸º Tomcat æä¾äºä¸ä¸ªç»å
¥ä»£çï¼è½å¤ä¸º Tomcat ä¼ éç±»æ ä»¶ï¼å°±åè¿äºæä»¶æ¯è¢«ç±»å è½½å¨å è½½ç䏿 ·ã没æçè§£ä¹æ²¡å
³ç³»ï¼è¿ä¸ªæ¨¡åç使ç¨åºæ¯é常æéã
###### Data Access/Integration
- **spring-jdbc** ï¼æä¾äºå¯¹æ°æ®åºè®¿é®çæ½è±¡ JDBCãä¸åçæ°æ®åºé½æèªå·±ç¬ç«ç API ç¨äºæä½æ°æ®åºï¼è Java ç¨åºåªéè¦å JDBC API 交äºï¼è¿æ ·å°±å±è½äºæ°æ®åºçå½±åã
- **spring-tx** ï¼æä¾å¯¹äºå¡çæ¯æã
- **spring-orm** ï¼ æä¾å¯¹ HibernateãJPA ãiBatis ç ORM æ¡æ¶çæ¯æã
- **spring-oxm** ï¼æä¾ä¸ä¸ªæ½è±¡å±æ¯æ OXM(Object-to-XML-Mapping)ï¼ä¾å¦ï¼JAXBãCastorãXMLBeansãJiBX å XStream çã
- **spring-jms** : æ¶æ¯æå¡ãèª Spring Framework 4.1 以åï¼å®è¿æä¾äºå¯¹ spring-messaging 模åçç»§æ¿ã
###### Spring Web
- **spring-web** ï¼å¯¹ Web åè½çå®ç°æä¾ä¸äºæåºç¡çæ¯æã
- **spring-webmvc** ï¼ æä¾å¯¹ Spring MVC çå®ç°ã
- **spring-websocket** ï¼ æä¾äºå¯¹ WebSocket çæ¯æï¼WebSocket å¯ä»¥è®©å®¢æ·ç«¯åæå¡ç«¯è¿è¡ååéä¿¡ã
- **spring-webflux** ï¼æä¾å¯¹ WebFlux çæ¯æãWebFlux æ¯ Spring Framework 5.0 ä¸å¼å
¥çæ°çååºå¼æ¡æ¶ãä¸ Spring MVC ä¸åï¼å®ä¸éè¦ Servlet APIï¼æ¯å®å
¨å¼æ¥ã
###### Messaging
**spring-messaging** æ¯ä» Spring4.0 å¼å§æ°å å
¥çä¸ä¸ªæ¨¡åï¼ä¸»è¦èè´£æ¯ä¸º Spring æ¡æ¶éæä¸äºåºç¡çæ¥æä¼ éåºç¨ã
###### Spring Test
Spring å¢éæå¡æµè¯é©±å¨å¼åï¼TDDï¼ãæäºæ§å¶å转 (IoC)ç帮å©ï¼åå
æµè¯åéææµè¯å徿´ç®åã
Spring çæµè¯æ¨¡å对 JUnitï¼åå
æµè¯æ¡æ¶ï¼ãTestNGï¼ç±»ä¼¼ JUnitï¼ãMockitoï¼ä¸»è¦ç¨æ¥ Mock 对象ï¼ãPowerMockï¼è§£å³ Mockito çé®é¢æ¯å¦æ æ³æ¨¡æ final, staticï¼ private æ¹æ³ï¼çç常ç¨çæµè¯æ¡æ¶æ¯æç齿¯è¾å¥½ã
#### Spring,Spring MVC,Spring Boot ä¹é´ä»ä¹å
³ç³»?
å¾å¤äººå¯¹ Spring,Spring MVC,Spring Boot è¿ä¸è
å»å»å䏿¸
æ¥ï¼è¿éç®åä»ç»ä¸ä¸è¿ä¸è
ï¼å
¶å®å¾ç®åï¼æ²¡æä»ä¹é«æ·±çä¸è¥¿ã
Spring å
å«äºå¤ä¸ªåè½æ¨¡åï¼ä¸é¢ååæé«è¿ï¼ï¼å
¶ä¸æéè¦çæ¯ Spring-Coreï¼ä¸»è¦æä¾ IoC ä¾èµæ³¨å
¥åè½çæ¯æï¼ æ¨¡åï¼ Spring ä¸çå
¶ä»æ¨¡åï¼æ¯å¦ Spring MVCï¼çåè½å®ç°åºæ¬é½éè¦ä¾èµäºè¯¥æ¨¡åã
ä¸å¾å¯¹åºçæ¯ Spring4.x çæ¬ãç®åææ°ç 5.x çæ¬ä¸ Web 模åç Portlet ç»ä»¶å·²ç»è¢«åºå¼æï¼åæ¶å¢å äºç¨äºå¼æ¥ååºå¼å¤çç WebFlux ç»ä»¶ã

Spring MVC æ¯ Spring ä¸çä¸ä¸ªå¾éè¦ç模åï¼ä¸»è¦èµäº Spring å¿«éæå»º MVC æ¶æç Web ç¨åºçè½åãMVC æ¯æ¨¡å(Model)ãè§å¾(View)ãæ§å¶å¨(Controller)çç®åï¼å
¶æ ¸å¿ææ³æ¯éè¿å°ä¸å¡é»è¾ãæ°æ®ãæ¾ç¤ºå离æ¥ç»ç»ä»£ç ã

ä½¿ç¨ Spring è¿è¡å¼ååç§é
ç½®è¿äºéº»ç¦æ¯å¦å¼å¯æäº Spring ç¹æ§æ¶ï¼éè¦ç¨ XML æ Java è¿è¡æ¾å¼é
ç½®ãäºæ¯ï¼Spring Boot è¯çäºï¼
Spring æ¨å¨ç®å J2EE ä¼ä¸åºç¨ç¨åºå¼åãSpring Boot æ¨å¨ç®å Spring å¼åï¼åå°é
ç½®æä»¶ï¼å¼ç®±å³ç¨ï¼ï¼ã
Spring Boot åªæ¯ç®åäºé
ç½®ï¼å¦æä½ éè¦æå»º MVC æ¶æç Web ç¨åºï¼ä½ è¿æ¯éè¦ä½¿ç¨ Spring MVC ä½ä¸º MVC æ¡æ¶ï¼åªæ¯è¯´ Spring Boot å¸®ä½ ç®åäº Spring MVC çå¾å¤é
ç½®ï¼çæ£åå°å¼ç®±å³ç¨ï¼
### Spring IoC
#### è°è°èªå·±å¯¹äº Spring IoC çäºè§£
**IoCï¼Inverse of Control:æ§å¶å转ï¼** æ¯ä¸ç§è®¾è®¡ææ³ï¼è䏿¯ä¸ä¸ªå
·ä½çææ¯å®ç°ãIoC çææ³å°±æ¯å°åæ¬å¨ç¨åºä¸æå¨åå»ºå¯¹è±¡çæ§å¶æï¼äº¤ç± Spring æ¡æ¶æ¥ç®¡çãä¸è¿ï¼ IoC å¹¶é Spring ç¹æï¼å¨å
¶ä»è¯è¨ä¸ä¹æåºç¨ã
**为ä»ä¹å«æ§å¶å转ï¼**
- **æ§å¶** ï¼æçæ¯å¯¹è±¡å建ï¼å®ä¾åã管çï¼çæå
- **å转** ï¼æ§å¶æäº¤ç»å¤é¨ç¯å¢ï¼Spring æ¡æ¶ãIoC 容å¨ï¼

å°å¯¹è±¡ä¹é´çç¸äºä¾èµå
³ç³»äº¤ç» IoC 容卿¥ç®¡çï¼å¹¶ç± IoC 容å¨å®æå¯¹è±¡ç注å
¥ãè¿æ ·å¯ä»¥å¾å¤§ç¨åº¦ä¸ç®ååºç¨çå¼åï¼æåºç¨ä»å¤æçä¾èµå
³ç³»ä¸è§£æ¾åºæ¥ã IoC 容å¨å°±åæ¯ä¸ä¸ªå·¥å䏿 ·ï¼å½æä»¬éè¦å建ä¸ä¸ªå¯¹è±¡çæ¶åï¼åªéè¦é
置好é
ç½®æä»¶/注解å³å¯ï¼å®å
¨ä¸ç¨èè对象æ¯å¦ä½è¢«åå»ºåºæ¥çã
å¨å®é
项ç®ä¸ä¸ä¸ª Service ç±»å¯è½ä¾èµäºå¾å¤å
¶ä»çç±»ï¼å妿们éè¦å®ä¾åè¿ä¸ª Serviceï¼ä½ å¯è½è¦æ¯æ¬¡é½è¦ææ¸
è¿ä¸ª Service ææåºå±ç±»çæé 彿°ï¼è¿å¯è½ä¼æäººé¼ç¯ã妿å©ç¨ IoC çè¯ï¼ä½ åªéè¦é
置好ï¼ç¶åå¨éè¦çå°æ¹å¼ç¨å°±è¡äºï¼è¿å¤§å¤§å¢å äºé¡¹ç®çå¯ç»´æ¤æ§ä¸éä½äºå¼åé¾åº¦ã
å¨ Spring ä¸ï¼ IoC 容卿¯ Spring ç¨æ¥å®ç° IoC çè½½ä½ï¼ IoC 容å¨å®é
ä¸å°±æ¯ä¸ª Mapï¼keyï¼valueï¼ï¼Map ä¸åæ¾çæ¯åç§å¯¹è±¡ã
Spring æ¶ä»£æä»¬ä¸è¬éè¿ XML æä»¶æ¥é
ç½® Beanï¼åæ¥å¼å人åè§å¾ XML æä»¶æ¥é
ç½®ä¸å¤ªå¥½ï¼äºæ¯ SpringBoot 注解é
置就æ
¢æ
¢å¼å§æµè¡èµ·æ¥ã
ç¸å
³é
读ï¼
- [IoC æºç é
读](https://javadoop.com/post/spring-ioc)
- [é¢è¯è¢«é®äºå ç¾éç IoC å AOP ï¼è¿å¨å»å»æä¸æ¸
æ¥ï¼](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486938&idx=1&sn=c99ef0233f39a5ffc1b98c81e02dfcd4&chksm=cea24211f9d5cb07fa901183ba4d96187820713a72387788408040822ffb2ed575d28e953ce7&token=1736772241&lang=zh_CN#rd)
#### ä»ä¹æ¯ Spring Beanï¼
ç®åæ¥è¯´ï¼Bean 代æçå°±æ¯é£äºè¢« IoC å®¹å¨æç®¡çç对象ã
æä»¬éè¦åè¯ IoC 容å¨å¸®å©æä»¬ç®¡çåªäºå¯¹è±¡ï¼è¿ä¸ªæ¯éè¿é
ç½®å
æ°æ®æ¥å®ä¹çãé
ç½®å
æ°æ®å¯ä»¥æ¯ XML æä»¶ã注解æè
Java é
置类ã
```xml
```
ä¸å¾ç®åå°å±ç¤ºäº IoC 容å¨å¦ä½ä½¿ç¨é
ç½®å
æ°æ®æ¥ç®¡ç对象ã

`org.springframework.beans`å `org.springframework.context` è¿ä¸¤ä¸ªå
æ¯ IoC å®ç°çåºç¡ï¼å¦ææ³è¦ç ç©¶ IoC ç¸å
³çæºç çè¯ï¼å¯ä»¥å»çç
#### å°ä¸ä¸ªç±»å£°æä¸º Bean çæ³¨è§£æåªäº?
- `@Component` ï¼éç¨ç注解ï¼å¯æ 注任æç±»ä¸º `Spring` ç»ä»¶ã妿ä¸ä¸ª Bean ä¸ç¥éå±äºåªä¸ªå±ï¼å¯ä»¥ä½¿ç¨`@Component` æ³¨è§£æ æ³¨ã
- `@Repository` : å¯¹åºæä¹
å±å³ Dao å±ï¼ä¸»è¦ç¨äºæ°æ®åºç¸å
³æä½ã
- `@Service` : å¯¹åºæå¡å±ï¼ä¸»è¦æ¶åä¸äºå¤æçé»è¾ï¼éè¦ç¨å° Dao å±ã
- `@Controller` : å¯¹åº Spring MVC æ§å¶å±ï¼ä¸»è¦ç¨æ·æ¥åç¨æ·è¯·æ±å¹¶è°ç¨ Service å±è¿åæ°æ®ç»å端页é¢ã
#### @Component å @Bean çåºå«æ¯ä»ä¹ï¼
- `@Component` 注解ä½ç¨äºç±»ï¼è`@Bean`注解ä½ç¨äºæ¹æ³ã
- `@Component`é常æ¯éè¿ç±»è·¯å¾æ«ææ¥èªå¨ä¾¦æµä»¥åèªå¨è£
é
å° Spring 容å¨ä¸ï¼æä»¬å¯ä»¥ä½¿ç¨ `@ComponentScan` 注解å®ä¹è¦æ«æçè·¯å¾ä»ä¸æ¾åºæ è¯äºéè¦è£
é
çç±»èªå¨è£
é
å° Spring ç bean 容å¨ä¸ï¼ã`@Bean` 注解éå¸¸æ¯æä»¬å¨æ æè¯¥æ³¨è§£çæ¹æ³ä¸å®ä¹äº§çè¿ä¸ª bean,`@Bean`åè¯äº Spring è¿æ¯æä¸ªç±»çå®ä¾ï¼å½æéè¦ç¨å®çæ¶åè¿ç»æã
- `@Bean` æ³¨è§£æ¯ `@Component` 注解çèªå®ä¹æ§æ´å¼ºï¼èä¸å¾å¤å°æ¹æä»¬åªè½éè¿ `@Bean` æ³¨è§£æ¥æ³¨å beanãæ¯å¦å½æä»¬å¼ç¨ç¬¬ä¸æ¹åºä¸çç±»éè¦è£
é
å° `Spring`容卿¶ï¼ååªè½éè¿ `@Bean`æ¥å®ç°ã
`@Bean`注解使ç¨ç¤ºä¾ï¼
```java
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
```
ä¸é¢ç代ç ç¸å½äºä¸é¢ç xml é
ç½®
```xml
```
ä¸é¢è¿ä¸ªä¾åæ¯éè¿ `@Component` æ æ³å®ç°çã
```java
@Bean
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}
```
#### 注å
¥ Bean çæ³¨è§£æåªäºï¼
Spring å
ç½®ç `@Autowired` 以å JDK å
ç½®ç `@Resource` å `@Inject` é½å¯ä»¥ç¨äºæ³¨å
¥ Beanã
| Annotaion | Package | Source |
| ------------ | ---------------------------------- | ------------ |
| `@Autowired` | `org.springframework.bean.factory` | Spring 2.5+ |
| `@Resource` | `javax.annotation` | Java JSR-250 |
| `@Inject` | `javax.inject` | Java JSR-330 |
`@Autowired` å`@Resource`使ç¨çæ¯è¾å¤ä¸äºã
#### @Autowired å @Resource çåºå«æ¯ä»ä¹ï¼
`Autowired` å±äº Spring å
ç½®çæ³¨è§£ï¼é»è®¤ç注å
¥æ¹å¼ä¸º`byType`ï¼æ ¹æ®ç±»åè¿è¡å¹é
ï¼ï¼ä¹å°±æ¯è¯´ä¼ä¼å
æ ¹æ®æ¥å£ç±»åå»å¹é
并注å
¥ Bean ï¼æ¥å£çå®ç°ç±»ï¼ã
**è¿ä¼æä»ä¹é®é¢å¢ï¼** å½ä¸ä¸ªæ¥å£åå¨å¤ä¸ªå®ç°ç±»çè¯ï¼`byType`è¿ç§æ¹å¼å°±æ æ³æ£ç¡®æ³¨å
¥å¯¹è±¡äºï¼å 为è¿ä¸ªæ¶å Spring ä¼åæ¶æ¾å°å¤ä¸ªæ»¡è¶³æ¡ä»¶çéæ©ï¼é»è®¤æ
åµä¸å®èªå·±ä¸ç¥ééæ©åªä¸ä¸ªã
è¿ç§æ
åµä¸ï¼æ³¨å
¥æ¹å¼ä¼å为 `byName`ï¼æ ¹æ®åç§°è¿è¡å¹é
ï¼ï¼è¿ä¸ªåç§°é常就æ¯ç±»åï¼é¦åæ¯å°åï¼ãå°±æ¯å¦è¯´ä¸é¢ä»£ç ä¸ç `smsService` å°±æ¯æè¿éæè¯´çåç§°ï¼è¿æ ·åºè¯¥æ¯è¾å¥½çè§£äºå§ã
```java
// smsService å°±æ¯æä»¬ä¸é¢æè¯´çåç§°
@Autowired
private SmsService smsService;
```
举个ä¾åï¼`SmsService` æ¥å£æä¸¤ä¸ªå®ç°ç±»: `SmsServiceImpl1`å `SmsServiceImpl2`ï¼ä¸å®ä»¬é½å·²ç»è¢« Spring å®¹å¨æç®¡çã
```java
// æ¥éï¼byName å byType 齿 æ³å¹é
å° bean
@Autowired
private SmsService smsService;
// æ£ç¡®æ³¨å
¥ SmsServiceImpl1 对象对åºç bean
@Autowired
private SmsService smsServiceImpl1;
// æ£ç¡®æ³¨å
¥ SmsServiceImpl1 对象对åºç bean
// smsServiceImpl1 å°±æ¯æä»¬ä¸é¢æè¯´çåç§°
@Autowired
@Qualifier(value = "smsServiceImpl1")
private SmsService smsService;
```
æä»¬è¿æ¯å»ºè®®éè¿ `@Qualifier` æ³¨è§£æ¥æ¾ç¤ºæå®åç§°è䏿¯ä¾èµåéçåç§°ã
`@Resource`å±äº JDK æä¾ç注解ï¼é»è®¤æ³¨å
¥æ¹å¼ä¸º `byName`ãå¦ææ æ³éè¿åç§°å¹é
å°å¯¹åºç Bean çè¯ï¼æ³¨å
¥æ¹å¼ä¼å为`byType`ã
`@Resource` æä¸¤ä¸ªæ¯è¾éè¦ä¸æ¥å¸¸å¼å常ç¨ç屿§ï¼`name`ï¼åç§°ï¼ã`type`ï¼ç±»åï¼ã
```java
public @interface Resource {
String name() default "";
Class> type() default Object.class;
}
```
妿ä»
æå® `name` 屿§å注å
¥æ¹å¼ä¸º`byName`ï¼å¦æä»
æå®`type`屿§å注å
¥æ¹å¼ä¸º`byType`ï¼å¦æåæ¶æå®`name` å`type`屿§ï¼ä¸å»ºè®®è¿ä¹åï¼å注å
¥æ¹å¼ä¸º`byType`+`byName`ã
```java
// æ¥éï¼byName å byType 齿 æ³å¹é
å° bean
@Resource
private SmsService smsService;
// æ£ç¡®æ³¨å
¥ SmsServiceImpl1 对象对åºç bean
@Resource
private SmsService smsServiceImpl1;
// æ£ç¡®æ³¨å
¥ SmsServiceImpl1 对象对åºç beanï¼æ¯è¾æ¨èè¿ç§æ¹å¼ï¼
@Resource(name = "smsServiceImpl1")
private SmsService smsService;
```
ç®åæ»ç»ä¸ä¸ï¼
- `@Autowired` æ¯ Spring æä¾ç注解ï¼`@Resource` æ¯ JDK æä¾ç注解ã
- `Autowired` é»è®¤ç注å
¥æ¹å¼ä¸º`byType`ï¼æ ¹æ®ç±»åè¿è¡å¹é
ï¼ï¼`@Resource`é»è®¤æ³¨å
¥æ¹å¼ä¸º `byName`ï¼æ ¹æ®åç§°è¿è¡å¹é
ï¼ã
- å½ä¸ä¸ªæ¥å£åå¨å¤ä¸ªå®ç°ç±»çæ
åµä¸ï¼`@Autowired` å`@Resource`é½éè¦éè¿åç§°æè½æ£ç¡®å¹é
å°å¯¹åºç Beanã`Autowired` å¯ä»¥éè¿ `@Qualifier` æ³¨è§£æ¥æ¾ç¤ºæå®åç§°ï¼`@Resource`å¯ä»¥éè¿ `name` 屿§æ¥æ¾ç¤ºæå®åç§°ã
#### Bean çä½ç¨åæåªäº?
Spring ä¸ Bean çä½ç¨åé常æä¸é¢å ç§ï¼
- **singleton** : IoC 容å¨ä¸åªæå¯ä¸ç bean å®ä¾ãSpring ä¸ç bean é»è®¤é½æ¯åä¾çï¼æ¯å¯¹åä¾è®¾è®¡æ¨¡å¼çåºç¨ã
- **prototype** : æ¯æ¬¡è·åé½ä¼å建ä¸ä¸ªæ°ç bean å®ä¾ãä¹å°±æ¯è¯´ï¼è¿ç» `getBean()` 两次ï¼å¾å°çæ¯ä¸åç Bean å®ä¾ã
- **request** ï¼ä»
Web åºç¨å¯ç¨ï¼: æ¯ä¸æ¬¡ HTTP 请æ±é½ä¼äº§çä¸ä¸ªæ°ç beanï¼è¯·æ± beanï¼ï¼è¯¥ bean ä»
å¨å½å HTTP request å
ææã
- **session** ï¼ä»
Web åºç¨å¯ç¨ï¼ : æ¯ä¸æ¬¡æ¥èªæ° session ç HTTP 请æ±é½ä¼äº§çä¸ä¸ªæ°ç beanï¼ä¼è¯ beanï¼ï¼è¯¥ bean ä»
å¨å½å HTTP session å
ææã
- **application/global-session** ï¼ä»
Web åºç¨å¯ç¨ï¼ï¼ æ¯ä¸ª Web åºç¨å¨å¯å¨æ¶å建ä¸ä¸ª Beanï¼åºç¨ Beanï¼ï¼ï¼è¯¥ bean ä»
å¨å½ååºç¨å¯å¨æ¶é´å
ææã
- **websocket** ï¼ä»
Web åºç¨å¯ç¨ï¼ï¼æ¯ä¸æ¬¡ WebSocket ä¼è¯äº§çä¸ä¸ªæ°ç beanã
**å¦ä½é
ç½® bean çä½ç¨åå¢ï¼**
xml æ¹å¼ï¼
```xml
```
注解æ¹å¼ï¼
```java
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public Person personPrototype() {
return new Person();
}
```
#### åä¾ Bean ç线ç¨å®å
¨é®é¢äºè§£åï¼
大é¨åæ¶åæä»¬å¹¶æ²¡æå¨é¡¹ç®ä¸ä½¿ç¨å¤çº¿ç¨ï¼æä»¥å¾å°æäººä¼å
³æ³¨è¿ä¸ªé®é¢ãåä¾ Bean åå¨çº¿ç¨é®é¢ï¼ä¸»è¦æ¯å 为å½å¤ä¸ªçº¿ç¨æä½åä¸ä¸ªå¯¹è±¡çæ¶åæ¯åå¨èµæºç«äºçã
常è§çæä¸¤ç§è§£å³åæ³ï¼
1. å¨ Bean ä¸å°½éé¿å
å®ä¹å¯åçæååéã
2. å¨ç±»ä¸å®ä¹ä¸ä¸ª `ThreadLocal` æååéï¼å°éè¦çå¯åæååéä¿åå¨ `ThreadLocal` ä¸ï¼æ¨èçä¸ç§æ¹å¼ï¼ã
ä¸è¿ï¼å¤§é¨å Bean å®é
齿¯æ ç¶æï¼æ²¡æå®ä¾åéï¼çï¼æ¯å¦ DaoãServiceï¼ï¼è¿ç§æ
åµä¸ï¼ Bean æ¯çº¿ç¨å®å
¨çã
#### Bean ççå½å¨æäºè§£ä¹?
> ä¸é¢çå
容æ´çèªï¼ ï¼é¤äºè¿ç¯æç« ï¼åæ¨èä¸ç¯å¾ä¸éçæç« ï¼ ã
- Bean 容卿¾å°é
ç½®æä»¶ä¸ Spring Bean çå®ä¹ã
- Bean 容å¨å©ç¨ Java Reflection API å建ä¸ä¸ª Bean çå®ä¾ã
- 妿æ¶åå°ä¸äºå±æ§å¼ å©ç¨ `set()`æ¹æ³è®¾ç½®ä¸äºå±æ§å¼ã
- 妿 Bean å®ç°äº `BeanNameAware` æ¥å£ï¼è°ç¨ `setBeanName()`æ¹æ³ï¼ä¼ å
¥ Bean çååã
- 妿 Bean å®ç°äº `BeanClassLoaderAware` æ¥å£ï¼è°ç¨ `setBeanClassLoader()`æ¹æ³ï¼ä¼ å
¥ `ClassLoader`对象çå®ä¾ã
- 妿 Bean å®ç°äº `BeanFactoryAware` æ¥å£ï¼è°ç¨ `setBeanFactory()`æ¹æ³ï¼ä¼ å
¥ `BeanFactory`对象çå®ä¾ã
- ä¸ä¸é¢ç类似ï¼å¦æå®ç°äºå
¶ä» `*.Aware`æ¥å£ï¼å°±è°ç¨ç¸åºçæ¹æ³ã
- 妿æåå è½½è¿ä¸ª Bean ç Spring 容å¨ç¸å
³ç `BeanPostProcessor` å¯¹è±¡ï¼æ§è¡`postProcessBeforeInitialization()` æ¹æ³
- 妿 Bean å®ç°äº`InitializingBean`æ¥å£ï¼æ§è¡`afterPropertiesSet()`æ¹æ³ã
- 妿 Bean å¨é
ç½®æä»¶ä¸çå®ä¹å
å« init-method 屿§ï¼æ§è¡æå®çæ¹æ³ã
- 妿æåå è½½è¿ä¸ª Bean ç Spring 容å¨ç¸å
³ç `BeanPostProcessor` å¯¹è±¡ï¼æ§è¡`postProcessAfterInitialization()` æ¹æ³
- å½è¦éæ¯ Bean çæ¶åï¼å¦æ Bean å®ç°äº `DisposableBean` æ¥å£ï¼æ§è¡ `destroy()` æ¹æ³ã
- å½è¦éæ¯ Bean çæ¶åï¼å¦æ Bean å¨é
ç½®æä»¶ä¸çå®ä¹å
å« destroy-method 屿§ï¼æ§è¡æå®çæ¹æ³ã
å¾ç¤ºï¼

ä¸ä¹æ¯è¾ç±»ä¼¼çä¸æçæ¬:

### Spring AoP
#### è°è°èªå·±å¯¹äº AOP çäºè§£
AOP(Aspect-Oriented Programming:é¢ååé¢ç¼ç¨)è½å¤å°é£äºä¸ä¸å¡æ å
³ï¼å´ä¸ºä¸å¡æ¨¡åæå
±åè°ç¨çé»è¾æè´£ä»»ï¼ä¾å¦äºå¡å¤çãæ¥å¿ç®¡çãæéæ§å¶çï¼å°è£
èµ·æ¥ï¼ä¾¿äºåå°ç³»ç»çéå¤ä»£ç ï¼é使¨¡åé´çè¦å度ï¼å¹¶æå©äºæªæ¥ç坿屿§åå¯ç»´æ¤æ§ã
Spring AOP å°±æ¯åºäºå¨æä»£ççï¼å¦æè¦ä»£çç对象ï¼å®ç°äºæä¸ªæ¥å£ï¼é£ä¹ Spring AOP ä¼ä½¿ç¨ **JDK Proxy**ï¼å»å建代ç对象ï¼èå¯¹äºæ²¡æå®ç°æ¥å£ç对象ï¼å°±æ æ³ä½¿ç¨ JDK Proxy å»è¿è¡ä»£çäºï¼è¿æ¶å Spring AOP ä¼ä½¿ç¨ **Cglib** çæä¸ä¸ªè¢«ä»£ç对象çåç±»æ¥ä½ä¸ºä»£çï¼å¦ä¸å¾æç¤ºï¼

å½ç¶ä½ ä¹å¯ä»¥ä½¿ç¨ **AspectJ** ï¼Spring AOP å·²ç»éæäº AspectJ ï¼AspectJ åºè¯¥ç®ç䏿¯ Java çæç³»ç»ä¸æå®æ´ç AOP æ¡æ¶äºã
AOP åé¢ç¼ç¨è®¾è®¡å°çä¸äºä¸ä¸æ¯è¯ï¼
| æ¯è¯ | å«ä¹ |
| :---------------- | :----------------------------------------------------------: |
| ç®æ (Target) | 被éç¥ç对象 |
| 代ç(Proxy) | åç®æ 对象åºç¨éç¥ä¹åå建ç代ç对象 |
| è¿æ¥ç¹(JoinPoint) | ç®æ 对象çæå±ç±»ä¸ï¼å®ä¹çæææ¹æ³åä¸ºè¿æ¥ç¹ |
| åå
¥ç¹(Pointcut) | 被å颿¦æª / å¢å¼ºçè¿æ¥ç¹ï¼åå
¥ç¹ä¸å®æ¯è¿æ¥ç¹ï¼è¿æ¥ç¹ä¸ä¸å®æ¯åå
¥ç¹ï¼ |
| éç¥(Advice) | å¢å¼ºçé»è¾ / 代ç ï¼ä¹å³æ¦æªå°ç®æ 对象çè¿æ¥ç¹ä¹åè¦åçäºæ
|
| åé¢(Aspect) | åå
¥ç¹(Pointcut)+éç¥(Advice) |
| Weaving(ç»å
¥) | å°éç¥åºç¨å°ç®æ 对象ï¼è¿èçæä»£ç对象çè¿ç¨å¨ä½ |
#### Spring AOP å AspectJ AOP æä»ä¹åºå«ï¼
**Spring AOP å±äºè¿è¡æ¶å¢å¼ºï¼è AspectJ æ¯ç¼è¯æ¶å¢å¼ºã** Spring AOP åºäºä»£ç(Proxying)ï¼è AspectJ åºäºåèç æä½(Bytecode Manipulation)ã
Spring AOP å·²ç»éæäº AspectJ ï¼AspectJ åºè¯¥ç®ç䏿¯ Java çæç³»ç»ä¸æå®æ´ç AOP æ¡æ¶äºãAspectJ ç¸æ¯äº Spring AOP åè½æ´å 强大ï¼ä½æ¯ Spring AOP ç¸å¯¹æ¥è¯´æ´ç®åï¼
妿æä»¬çå颿¯è¾å°ï¼é£ä¹ä¸¤è
æ§è½å·®å¼ä¸å¤§ã使¯ï¼å½åé¢å¤ªå¤çè¯ï¼æå¥½éæ© AspectJ ï¼å®æ¯ Spring AOP å¿«å¾å¤ã
#### AspectJ å®ä¹çéç¥ç±»åæåªäºï¼
- **Before**ï¼åç½®éç¥ï¼ï¼ç®æ å¯¹è±¡çæ¹æ³è°ç¨ä¹å触å
- **After** ï¼åç½®éç¥ï¼ï¼ç®æ å¯¹è±¡çæ¹æ³è°ç¨ä¹å触å
- **AfterReturning**ï¼è¿åéç¥ï¼ï¼ç®æ å¯¹è±¡çæ¹æ³è°ç¨å®æï¼å¨è¿åç»æå¼ä¹å触å
- **AfterThrowing**ï¼å¼å¸¸éç¥ï¼ ï¼ç®æ å¯¹è±¡çæ¹æ³è¿è¡ä¸æåº / 触åå¼å¸¸å触åãAfterReturning å AfterThrowing 两è
äºæ¥ãå¦ææ¹æ³è°ç¨æåæ å¼å¸¸ï¼å伿è¿åå¼ï¼å¦ææ¹æ³æåºäºå¼å¸¸ï¼åä¸ä¼æè¿åå¼ã
- **Around**ï¼ ï¼ç¯ç»éç¥ï¼ç¼ç¨å¼æ§å¶ç®æ å¯¹è±¡çæ¹æ³è°ç¨ãç¯ç»éç¥æ¯ææéç¥ç±»åä¸å¯æä½è崿大çä¸ç§ï¼å 为å®å¯ä»¥ç´æ¥æ¿å°ç®æ 对象ï¼ä»¥åè¦æ§è¡çæ¹æ³ï¼æä»¥ç¯ç»éç¥å¯ä»¥ä»»æçå¨ç®æ å¯¹è±¡çæ¹æ³è°ç¨ååæäºï¼çè³ä¸è°ç¨ç®æ å¯¹è±¡çæ¹æ³
#### å¤ä¸ªåé¢çæ§è¡é¡ºåºå¦ä½æ§å¶ï¼
1ãé常使ç¨`@Order` æ³¨è§£ç´æ¥å®ä¹åé¢é¡ºåº
```java
// å¼è¶å°ä¼å
级è¶é«
@Order(3)
@Component
@Aspect
public class LoggingAspect implements Ordered {
```
**2ãå®ç°`Ordered` æ¥å£éå `getOrder` æ¹æ³ã**
```java
@Component
@Aspect
public class LoggingAspect implements Ordered {
// ....
@Override
public int getOrder() {
// è¿åå¼è¶å°ä¼å
级è¶é«
return 1;
}
}
```
### Spring MVC
#### 说说èªå·±å¯¹äº Spring MVC äºè§£?
MVC æ¯æ¨¡å(Model)ãè§å¾(View)ãæ§å¶å¨(Controller)çç®åï¼å
¶æ ¸å¿ææ³æ¯éè¿å°ä¸å¡é»è¾ãæ°æ®ãæ¾ç¤ºå离æ¥ç»ç»ä»£ç ã

ç½ä¸æå¾å¤äººè¯´ MVC 䏿¯è®¾è®¡æ¨¡å¼ï¼åªæ¯è½¯ä»¶è®¾è®¡è§èï¼æä¸ªäººæ´å¾åäº MVC åæ ·æ¯ä¼å¤è®¾è®¡æ¨¡å¼ä¸çä¸ç§ã**[java-design-patterns](https://github.com/iluwatar/java-design-patterns)** 项ç®ä¸å°±æå
³äº MVC çç¸å
³ä»ç»ã

æ³è¦çæ£çè§£ Spring MVCï¼æä»¬å
æ¥çç Model 1 å Model 2 è¿ä¸¤ä¸ªæ²¡æ Spring MVC çæ¶ä»£ã
**Model 1 æ¶ä»£**
å¾å¤å¦ Java å端æ¯è¾æçæåå¯è½å¹¶æ²¡ææ¥è§¦è¿ Model 1 æ¶ä»£ä¸ç JavaWeb åºç¨å¼åãå¨ Model1 模å¼ä¸ï¼æ´ä¸ª Web åºç¨å ä¹å
¨é¨ç¨ JSP 页é¢ç»æï¼åªç¨å°éç JavaBean æ¥å¤çæ°æ®åºè¿æ¥ã访é®çæä½ã
è¿ä¸ªæ¨¡å¼ä¸ JSP 峿¯æ§å¶å±ï¼Controllerï¼åæ¯è¡¨ç°å±ï¼Viewï¼ãæ¾èæè§ï¼è¿ç§æ¨¡å¼åå¨å¾å¤é®é¢ãæ¯å¦æ§å¶é»è¾å表ç°é»è¾æ··æå¨ä¸èµ·ï¼å¯¼è´ä»£ç éç¨çæä½ï¼åæ¯å¦å端åå端ç¸äºä¾èµï¼é¾ä»¥è¿è¡æµè¯ç»´æ¤å¹¶ä¸å¼åæçæä½ã

**Model 2 æ¶ä»£**
å¦è¿ Servlet å¹¶åè¿ç¸å
³ Demo çæååºè¯¥äºè§£âJava Bean(Model)+ JSPï¼Viewï¼+Servletï¼Controllerï¼ âè¿ç§å¼å模å¼ï¼è¿å°±æ¯æ©æç JavaWeb MVC å¼å模å¼ã
- Model:ç³»ç»æ¶åçæ°æ®ï¼ä¹å°±æ¯ dao å beanã
- Viewï¼å±ç¤ºæ¨¡åä¸çæ°æ®ï¼åªæ¯ç¨æ¥å±ç¤ºã
- Controllerï¼å¤çç¨æ·è¯·æ±é½åéç» ï¼è¿åæ°æ®ç» JSP å¹¶å±ç¤ºç»ç¨æ·ã

Model2 模å¼ä¸è¿åå¨å¾å¤é®é¢ï¼Model2 çæ½è±¡åå°è£
ç¨åº¦è¿è¿è¿ä¸å¤ï¼ä½¿ç¨ Model2 è¿è¡å¼åæ¶ä¸å¯é¿å
å°ä¼éå¤é è½®åï¼è¿å°±å¤§å¤§éä½äºç¨åºçå¯ç»´æ¤æ§åå¤ç¨æ§ã
äºæ¯ï¼å¾å¤ JavaWeb å¼åç¸å
³ç MVC æ¡æ¶åºè¿èçæ¯å¦ Struts2ï¼ä½æ¯ Struts2 æ¯è¾ç¬¨éã
**Spring MVC æ¶ä»£**
éç Spring è½»é级å¼åæ¡æ¶çæµè¡ï¼Spring çæååºç°äº Spring MVC æ¡æ¶ï¼ Spring MVC æ¯å½åæä¼ç§ç MVC æ¡æ¶ãç¸æ¯äº Struts2 ï¼ Spring MVC ä½¿ç¨æ´å ç®ååæ¹ä¾¿ï¼å¼åæçæ´é«ï¼å¹¶ä¸ Spring MVC è¿è¡é度æ´å¿«ã
MVC æ¯ä¸ç§è®¾è®¡æ¨¡å¼ï¼Spring MVC æ¯ä¸æ¬¾å¾ä¼ç§ç MVC æ¡æ¶ãSpring MVC å¯ä»¥å¸®å©æä»¬è¿è¡æ´ç®æ´ç Web å±çå¼åï¼å¹¶ä¸å®å¤©çä¸ Spring æ¡æ¶éæãSpring MVC 䏿们ä¸è¬æå端项ç®å为 Service å±ï¼å¤çä¸å¡ï¼ãDao å±ï¼æ°æ®åºæä½ï¼ãEntity å±ï¼å®ä½ç±»ï¼ãController å±(æ§å¶å±ï¼è¿åæ°æ®ç»åå°é¡µé¢)ã
#### Spring MVC çæ ¸å¿ç»ä»¶æåªäºï¼
è®°ä½äºä¸é¢è¿äºç»ä»¶ï¼ä¹å°±è®°ä½äº SpringMVC çå·¥ä½åçã
- **`DispatcherServlet`** ï¼**æ ¸å¿çä¸å¤®å¤çå¨**ï¼è´è´£æ¥æ¶è¯·æ±ãååï¼å¹¶ç»äºå®¢æ·ç«¯ååºã
- **`HandlerMapping`** ï¼**å¤ç卿 å°å¨**ï¼æ ¹æ® uri å»å¹é
æ¥æ¾è½å¤çç `Handler` ï¼å¹¶ä¼å°è¯·æ±æ¶åå°çæ¦æªå¨å `Handler` ä¸èµ·å°è£
ã
- **`HandlerAdapter`** ï¼**å¤çå¨éé
å¨**ï¼æ ¹æ® `HandlerMapping` æ¾å°ç `Handler` ï¼éé
æ§è¡å¯¹åºç `Handler`ï¼
- **`Handler`** ï¼**请æ±å¤çå¨**ï¼å¤çå®é
请æ±çå¤çå¨ã
- **`ViewResolver`** ï¼**è§å¾è§£æå¨**ï¼æ ¹æ® `Handler` è¿åçé»è¾è§å¾ / è§å¾ï¼è§£æå¹¶æ¸²æçæ£çè§å¾ï¼å¹¶ä¼ éç» `DispatcherServlet` ååºå®¢æ·ç«¯
#### SpringMVC å·¥ä½åçäºè§£å?
**Spring MVC åçå¦ä¸å¾æç¤ºï¼**
> SpringMVC å·¥ä½åççå¾è§£ææ²¡æèªå·±ç»ï¼ç´æ¥å¾çäºå¨ç½ä¸æ¾äºä¸ä¸ªé常æ¸
æ°ç´è§çï¼ååºå¤ä¸æã

**æµç¨è¯´æï¼éè¦ï¼ï¼**
1. 客æ·ç«¯ï¼æµè§å¨ï¼åé请æ±ï¼ `DispatcherServlet`æ¦æªè¯·æ±ã
2. `DispatcherServlet` æ ¹æ®è¯·æ±ä¿¡æ¯è°ç¨ `HandlerMapping` ã`HandlerMapping` æ ¹æ® uri å»å¹é
æ¥æ¾è½å¤çç `Handler`ï¼ä¹å°±æ¯æä»¬å¹³å¸¸è¯´ç `Controller` æ§å¶å¨ï¼ ï¼å¹¶ä¼å°è¯·æ±æ¶åå°çæ¦æªå¨å `Handler` ä¸èµ·å°è£
ã
3. `DispatcherServlet` è°ç¨ `HandlerAdapter`éé
æ§è¡ `Handler` ã
4. `Handler` å®æå¯¹ç¨æ·è¯·æ±çå¤çåï¼ä¼è¿åä¸ä¸ª `ModelAndView` 对象ç»`DispatcherServlet`ï¼`ModelAndView` 顾åæä¹ï¼å
å«äºæ°æ®æ¨¡å以åç¸åºçè§å¾çä¿¡æ¯ã`Model` æ¯è¿åçæ°æ®å¯¹è±¡ï¼`View` æ¯ä¸ªé»è¾ä¸ç `View`ã
5. `ViewResolver` 伿 ¹æ®é»è¾ `View` æ¥æ¾å®é
ç `View`ã
6. `DispaterServlet` æè¿åç `Model` ä¼ ç» `View`ï¼è§å¾æ¸²æï¼ã
7. æ `View` è¿åç»è¯·æ±è
ï¼æµè§å¨ï¼
#### ç»ä¸å¼å¸¸å¤çæä¹åï¼
æ¨èä½¿ç¨æ³¨è§£çæ¹å¼ç»ä¸å¼å¸¸å¤çï¼å
·ä½ä¼ä½¿ç¨å° `@ControllerAdvice` + `@ExceptionHandler` è¿ä¸¤ä¸ªæ³¨è§£ ã
```java
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(BaseException.class)
public ResponseEntity> handleAppException(BaseException ex, HttpServletRequest request) {
//......
}
@ExceptionHandler(value = ResourceNotFoundException.class)
public ResponseEntity handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest request) {
//......
}
}
```
è¿ç§å¼å¸¸å¤çæ¹å¼ä¸ï¼ä¼ç»æææè
æå®ç `Controller` ç»å
¥å¼å¸¸å¤ççé»è¾ï¼AOPï¼ï¼å½ `Controller` ä¸çæ¹æ³æåºå¼å¸¸çæ¶åï¼ç±è¢«`@ExceptionHandler` æ³¨è§£ä¿®é¥°çæ¹æ³è¿è¡å¤çã
`ExceptionHandlerMethodResolver` ä¸ `getMappedMethod` æ¹æ³å³å®äºå¼å¸¸å
·ä½è¢«åªä¸ªè¢« `@ExceptionHandler` æ³¨è§£ä¿®é¥°çæ¹æ³å¤çå¼å¸¸ã
```java
@Nullable
private Method getMappedMethod(Class extends Throwable> exceptionType) {
List> matches = new ArrayList<>();
//æ¾å°å¯ä»¥å¤ççææå¼å¸¸ä¿¡æ¯ãmappedMethods ä¸åæ¾äºå¼å¸¸åå¤çå¼å¸¸çæ¹æ³ç对åºå
³ç³»
for (Class extends Throwable> mappedException : this.mappedMethods.keySet()) {
if (mappedException.isAssignableFrom(exceptionType)) {
matches.add(mappedException);
}
}
// ä¸ä¸ºç©ºè¯´æææ¹æ³å¤çå¼å¸¸
if (!matches.isEmpty()) {
// æç
§å¹é
ç¨åº¦ä»å°å°å¤§æåº
matches.sort(new ExceptionDepthComparator(exceptionType));
// è¿åå¤çå¼å¸¸çæ¹æ³
return this.mappedMethods.get(matches.get(0));
}
else {
return null;
}
}
```
仿ºä»£ç çåºï¼ **`getMappedMethod()`ä¼é¦å
æ¾å°å¯ä»¥å¹é
å¤çå¼å¸¸çæææ¹æ³ä¿¡æ¯ï¼ç¶å对å
¶è¿è¡ä»å°å°å¤§çæåºï¼æååæå°çé£ä¸ä¸ªå¹é
çæ¹æ³(å³å¹é
度æé«çé£ä¸ª)ã**
### Spring æ¡æ¶ä¸ç¨å°äºåªäºè®¾è®¡æ¨¡å¼ï¼
å
³äºä¸é¢è¿äºè®¾è®¡æ¨¡å¼ç详ç»ä»ç»ï¼å¯ä»¥çæåç [Spring ä¸ç设计模å¼è¯¦è§£](https://javaguide.cn/system-design/framework/spring/spring-design-patterns-summary.html) è¿ç¯æç« ã
- **å·¥å设计模å¼** : Spring 使ç¨å·¥å模å¼éè¿ `BeanFactory`ã`ApplicationContext` å建 bean 对象ã
- **代ç设计模å¼** : Spring AOP åè½çå®ç°ã
- **åä¾è®¾è®¡æ¨¡å¼** : Spring ä¸ç Bean é»è®¤é½æ¯åä¾çã
- **æ¨¡æ¿æ¹æ³æ¨¡å¼** : Spring ä¸ `jdbcTemplate`ã`hibernateTemplate` ç以 Template ç»å°¾çå¯¹æ°æ®åºæä½çç±»ï¼å®ä»¬å°±ä½¿ç¨å°äºæ¨¡æ¿æ¨¡å¼ã
- **å
è£
å¨è®¾è®¡æ¨¡å¼** : æä»¬ç项ç®éè¦è¿æ¥å¤ä¸ªæ°æ®åºï¼èä¸ä¸åç客æ·å¨æ¯æ¬¡è®¿é®ä¸æ ¹æ®éè¦ä¼å»è®¿é®ä¸åçæ°æ®åºãè¿ç§æ¨¡å¼è®©æä»¬å¯ä»¥æ ¹æ®å®¢æ·çéæ±è½å¤å¨æåæ¢ä¸åçæ°æ®æºã
- **è§å¯è
模å¼:** Spring äºä»¶é©±å¨æ¨¡åå°±æ¯è§å¯è
模å¼å¾ç»å
¸çä¸ä¸ªåºç¨ã
- **éé
卿¨¡å¼** : Spring AOP çå¢å¼ºæéç¥(Advice)使ç¨å°äºéé
卿¨¡å¼ãspring MVC ä¸ä¹æ¯ç¨å°äºéé
卿¨¡å¼éé
`Controller`ã
- ......
### Spring äºå¡
å
³äº Spring äºå¡ç详ç»ä»ç»ï¼å¯ä»¥çæåç [Spring äºå¡è¯¦è§£](https://javaguide.cn/system-design/framework/spring/spring-transaction.html) è¿ç¯æç« ã
#### Spring 管çäºå¡çæ¹å¼æå ç§ï¼
- **ç¼ç¨å¼äºå¡** ï¼ å¨ä»£ç ä¸ç¡¬ç¼ç (䏿¨è使ç¨) : éè¿ `TransactionTemplate`æè
`TransactionManager` æå¨ç®¡çäºå¡ï¼å®é
åºç¨ä¸å¾å°ä½¿ç¨ï¼ä½æ¯å¯¹äºä½ çè§£ Spring äºå¡ç®¡çåçæå¸®å©ã
- **声æå¼äºå¡** ï¼ å¨ XML é
ç½®æä»¶ä¸é
ç½®æè
ç´æ¥åºäºæ³¨è§£ï¼æ¨è使ç¨ï¼ : å®é
æ¯éè¿ AOP å®ç°ï¼åºäº`@Transactional` çå
¨æ³¨è§£æ¹å¼ä½¿ç¨æå¤ï¼
#### Spring äºå¡ä¸åªå ç§äºå¡ä¼ æè¡ä¸º?
**äºå¡ä¼ æè¡ä¸ºæ¯ä¸ºäºè§£å³ä¸å¡å±æ¹æ³ä¹é´äºç¸è°ç¨çäºå¡é®é¢**ã
å½äºå¡æ¹æ³è¢«å¦ä¸ä¸ªäºå¡æ¹æ³è°ç¨æ¶ï¼å¿
é¡»æå®äºå¡åºè¯¥å¦ä½ä¼ æãä¾å¦ï¼æ¹æ³å¯è½ç»§ç»å¨ç°æäºå¡ä¸è¿è¡ï¼ä¹å¯è½å¼å¯ä¸ä¸ªæ°äºå¡ï¼å¹¶å¨èªå·±çäºå¡ä¸è¿è¡ã
æ£ç¡®çäºå¡ä¼ æè¡ä¸ºå¯è½çå¼å¦ä¸:
**1.`TransactionDefinition.PROPAGATION_REQUIRED`**
使ç¨çæå¤çä¸ä¸ªäºå¡ä¼ æè¡ä¸ºï¼æä»¬å¹³æ¶ç»å¸¸ä½¿ç¨ç`@Transactional`注解é»è®¤ä½¿ç¨å°±æ¯è¿ä¸ªäºå¡ä¼ æè¡ä¸ºã妿å½ååå¨äºå¡ï¼åå å
¥è¯¥äºå¡ï¼å¦æå½å没æäºå¡ï¼åå建ä¸ä¸ªæ°çäºå¡ã
**`2.TransactionDefinition.PROPAGATION_REQUIRES_NEW`**
å建ä¸ä¸ªæ°çäºå¡ï¼å¦æå½ååå¨äºå¡ï¼åæå½åäºå¡æèµ·ãä¹å°±æ¯è¯´ä¸ç®¡å¤é¨æ¹æ³æ¯å¦å¼å¯äºå¡ï¼`Propagation.REQUIRES_NEW`修饰çå
鍿¹æ³ä¼æ°å¼å¯èªå·±çäºå¡ï¼ä¸å¼å¯çäºå¡ç¸äºç¬ç«ï¼äºä¸å¹²æ°ã
**3.`TransactionDefinition.PROPAGATION_NESTED`**
妿å½ååå¨äºå¡ï¼åå建ä¸ä¸ªäºå¡ä½ä¸ºå½åäºå¡çåµå¥äºå¡æ¥è¿è¡ï¼å¦æå½å没æäºå¡ï¼å该åå¼çä»·äº`TransactionDefinition.PROPAGATION_REQUIRED`ã
**4.`TransactionDefinition.PROPAGATION_MANDATORY`**
妿å½ååå¨äºå¡ï¼åå å
¥è¯¥äºå¡ï¼å¦æå½å没æäºå¡ï¼åæåºå¼å¸¸ãï¼mandatoryï¼å¼ºå¶æ§ï¼
è¿ä¸ªä½¿ç¨çå¾å°ã
è¥æ¯é误çé
ç½®ä»¥ä¸ 3 ç§äºå¡ä¼ æè¡ä¸ºï¼äºå¡å°ä¸ä¼åçåæ»ï¼
- **`TransactionDefinition.PROPAGATION_SUPPORTS`**: 妿å½ååå¨äºå¡ï¼åå å
¥è¯¥äºå¡ï¼å¦æå½å没æäºå¡ï¼å以éäºå¡çæ¹å¼ç»§ç»è¿è¡ã
- **`TransactionDefinition.PROPAGATION_NOT_SUPPORTED`**: 以éäºå¡æ¹å¼è¿è¡ï¼å¦æå½ååå¨äºå¡ï¼åæå½åäºå¡æèµ·ã
- **`TransactionDefinition.PROPAGATION_NEVER`**: 以éäºå¡æ¹å¼è¿è¡ï¼å¦æå½ååå¨äºå¡ï¼åæåºå¼å¸¸ã
#### Spring äºå¡ä¸çéç¦»çº§å«æåªå ç§?
åäºå¡ä¼ æè¡ä¸ºè¿å䏿 ·ï¼ä¸ºäºæ¹ä¾¿ä½¿ç¨ï¼Spring ä¹ç¸åºå°å®ä¹äºä¸ä¸ªæä¸¾ç±»ï¼`Isolation`
```java
public enum Isolation {
DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
private final int value;
Isolation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
```
ä¸é¢æä¾æ¬¡å¯¹æ¯ä¸ç§äºå¡é离级å«è¿è¡ä»ç»ï¼
- **`TransactionDefinition.ISOLATION_DEFAULT`** :使ç¨åç«¯æ°æ®åºé»è®¤çé离级å«ï¼MySQL é»è®¤éç¨ç `REPEATABLE_READ` éç¦»çº§å« Oracle é»è®¤éç¨ç `READ_COMMITTED` é离级å«.
- **`TransactionDefinition.ISOLATION_READ_UNCOMMITTED`** :æä½çé离级å«ï¼ä½¿ç¨è¿ä¸ªé离级å«å¾å°ï¼å 为å®å
许读åå°æªæäº¤çæ°æ®åæ´ï¼**å¯è½ä¼å¯¼è´è读ã幻读æä¸å¯éå¤è¯»**
- **`TransactionDefinition.ISOLATION_READ_COMMITTED`** : å
许读åå¹¶åäºå¡å·²ç»æäº¤çæ°æ®ï¼**å¯ä»¥é»æ¢è读ï¼ä½æ¯å¹»è¯»æä¸å¯éå¤è¯»ä»æå¯è½åç**
- **`TransactionDefinition.ISOLATION_REPEATABLE_READ`** : 对åä¸å段ç夿¬¡è¯»åç»æé½æ¯ä¸è´çï¼é¤éæ°æ®æ¯è¢«æ¬èº«äºå¡èªå·±æä¿®æ¹ï¼**å¯ä»¥é»æ¢è读åä¸å¯éå¤è¯»ï¼ä½å¹»è¯»ä»æå¯è½åçã**
- **`TransactionDefinition.ISOLATION_SERIALIZABLE`** : æé«çé离级å«ï¼å®å
¨æä» ACID çé离级å«ãææçäºå¡ä¾æ¬¡é个æ§è¡ï¼è¿æ ·äºå¡ä¹é´å°±å®å
¨ä¸å¯è½äº§çå¹²æ°ï¼ä¹å°±æ¯è¯´ï¼**该级å«å¯ä»¥é²æ¢è读ãä¸å¯éå¤è¯»ä»¥å幻读**ã使¯è¿å°ä¸¥éå½±åç¨åºçæ§è½ãé常æ
åµä¸ä¹ä¸ä¼ç¨å°è¯¥çº§å«ã
#### @Transactional(rollbackFor = Exception.class)注解äºè§£åï¼
`Exception` å为è¿è¡æ¶å¼å¸¸ `RuntimeException` åéè¿è¡æ¶å¼å¸¸ãäºå¡ç®¡ç对äºä¼ä¸åºç¨æ¥è¯´æ¯è³å
³éè¦çï¼å³ä½¿åºç°å¼å¸¸æ
åµï¼å®ä¹å¯ä»¥ä¿è¯æ°æ®çä¸è´æ§ã
å½ `@Transactional` 注解ä½ç¨äºç±»ä¸æ¶ï¼è¯¥ç±»çææ public æ¹æ³å°é½å
·æè¯¥ç±»åçäºå¡å±æ§ï¼åæ¶ï¼æä»¬ä¹å¯ä»¥å¨æ¹æ³çº§å«ä½¿ç¨è¯¥æ 注æ¥è¦ç类级å«çå®ä¹ãå¦æç±»æè
æ¹æ³å äºè¿ä¸ªæ³¨è§£ï¼é£ä¹è¿ä¸ªç±»éé¢çæ¹æ³æåºå¼å¸¸ï¼å°±ä¼åæ»ï¼æ°æ®åºéé¢çæ°æ®ä¹ä¼åæ»ã
å¨ `@Transactional` 注解ä¸å¦æä¸é
ç½®`rollbackFor`屿§,é£ä¹äºå¡åªä¼å¨éå°`RuntimeException`çæ¶åæä¼åæ»ï¼å ä¸ `rollbackFor=Exception.class`,å¯ä»¥è®©äºå¡å¨éå°éè¿è¡æ¶å¼å¸¸æ¶ä¹åæ»ã
### Spring Data JPA
JPA éè¦çæ¯å®æï¼è¿éä»
对å°é¨åç¥è¯ç¹è¿è¡æ»ç»ã
#### å¦ä½ä½¿ç¨ JPA 卿°æ®åºä¸éæä¹
åä¸ä¸ªå段ï¼
å妿们æä¸é¢ä¸ä¸ªç±»ï¼
```java
@Entity(name="USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private Long id;
@Column(name="USER_NAME")
private String userName;
@Column(name="PASSWORD")
private String password;
private String secrect;
}
```
妿æä»¬æ³è®©`secrect` è¿ä¸ªå段ä¸è¢«æä¹
åï¼ä¹å°±æ¯ä¸è¢«æ°æ®åºå卿ä¹åï¼æä»¬å¯ä»¥éç¨ä¸é¢å ç§æ¹æ³ï¼
```java
static String transient1; // not persistent because of static
final String transient2 = "Satish"; // not persistent because of final
transient String transient3; // not persistent because of transient
@Transient
String transient4; // not persistent because of @Transient
```
ä¸è¬ä½¿ç¨åé¢ä¸¤ç§æ¹å¼æ¯è¾å¤ï¼æä¸ªäººä½¿ç¨æ³¨è§£çæ¹å¼æ¯è¾å¤ã
#### JPA ç审计åè½æ¯åä»ä¹çï¼æä»ä¹ç¨ï¼
审计åè½ä¸»è¦æ¯å¸®å©æä»¬è®°å½æ°æ®åºæä½çå
·ä½è¡ä¸ºæ¯å¦ææ¡è®°å½æ¯è°å建çãä»ä¹æ¶é´å建çãæåä¿®æ¹äººæ¯è°ãæåä¿®æ¹æ¶é´æ¯ä»ä¹æ¶åã
```java
@Data
@AllArgsConstructor
@NoArgsConstructor
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public abstract class AbstractAuditBase {
@CreatedDate
@Column(updatable = false)
@JsonIgnore
private Instant createdAt;
@LastModifiedDate
@JsonIgnore
private Instant updatedAt;
@CreatedBy
@Column(updatable = false)
@JsonIgnore
private String createdBy;
@LastModifiedBy
@JsonIgnore
private String updatedBy;
}
```
- `@CreatedDate`: è¡¨ç¤ºè¯¥åæ®µä¸ºå建æ¶é´å段ï¼å¨è¿ä¸ªå®ä½è¢« insert çæ¶åï¼ä¼è®¾ç½®å¼
- `@CreatedBy` :è¡¨ç¤ºè¯¥åæ®µä¸ºå建人ï¼å¨è¿ä¸ªå®ä½è¢« insert çæ¶åï¼ä¼è®¾ç½®å¼
`@LastModifiedDate`ã`@LastModifiedBy`åçã
#### å®ä½ä¹é´çå
³èå
³ç³»æ³¨è§£æåªäºï¼
- `@OneToOne` : ä¸å¯¹ä¸ã
- `@ManyToMany` ï¼å¤å¯¹å¤ã
- `@OneToMany` : ä¸å¯¹å¤ã
- `@ManyToOne` ï¼å¤å¯¹ä¸ã
å©ç¨ `@ManyToOne` å `@OneToMany` ä¹å¯ä»¥è¡¨è¾¾å¤å¯¹å¤çå
³èå
³ç³»ã
### Spring Security
Spring Security éè¦çæ¯å®æï¼è¿éä»
对å°é¨åç¥è¯ç¹è¿è¡æ»ç»ã
#### æåªäºæ§å¶è¯·æ±è®¿é®æéçæ¹æ³ï¼

- `permitAll()` ï¼æ æ¡ä»¶å
许任ä½å½¢å¼è®¿é®ï¼ä¸ç®¡ä½ ç»å½è¿æ¯æ²¡æç»å½ã
- `anonymous()` ï¼å
许å¿å访é®ï¼ä¹å°±æ¯æ²¡æç»å½æå¯ä»¥è®¿é®ã
- `denyAll()` ï¼æ æ¡ä»¶å³ç»ä»»ä½å½¢å¼ç访é®ã
- `authenticated()`ï¼åªå
许已认è¯çç¨æ·è®¿é®ã
- `fullyAuthenticated()` ï¼åªå
许已ç»ç»å½æè
éè¿ remember-me ç»å½çç¨æ·è®¿é®ã
- `hasRole(String)` : åªå
许æå®çè§è²è®¿é®ã
- `hasAnyRole(String)` : æå®ä¸ä¸ªæè
å¤ä¸ªè§è²ï¼æ»¡è¶³å
¶ä¸çç¨æ·å³å¯è®¿é®ã
- `hasAuthority(String)` ï¼åªå
许å
·ææå®æéçç¨æ·è®¿é®
- `hasAnyAuthority(String)` ï¼æå®ä¸ä¸ªæè
å¤ä¸ªæéï¼æ»¡è¶³å
¶ä¸çç¨æ·å³å¯è®¿é®ã
- `hasIpAddress(String)` : åªå
许æå® ip çç¨æ·è®¿é®ã
#### hasRole å hasAuthority æåºå«åï¼
å¯ä»¥ççæ¾å¥çè¿ç¯æç« ï¼[Spring Security ä¸ç hasRole å hasAuthority æåºå«åï¼](https://mp.weixin.qq.com/s/GTNOa2k9_n_H0w24upClRw)ï¼ä»ç»çæ¯è¾è¯¦ç»ã
#### å¦ä½å¯¹å¯ç è¿è¡å å¯ï¼
妿æä»¬éè¦ä¿åå¯ç è¿ç±»æææ°æ®å°æ°æ®åºçè¯ï¼éè¦å
å å¯åä¿åã
Spring Security æä¾äºå¤ç§å å¯ç®æ³çå®ç°ï¼å¼ç®±å³ç¨ï¼é常æ¹ä¾¿ãè¿äºå å¯ç®æ³å®ç°ç±»çç¶ç±»æ¯ `PasswordEncoder` ï¼å¦æä½ æ³è¦èªå·±å®ç°ä¸ä¸ªå å¯ç®æ³çè¯ï¼ä¹éè¦ç»§æ¿ `PasswordEncoder`ã
`PasswordEncoder` æ¥å£ä¸å
±ä¹å°± 3 个å¿
é¡»å®ç°çæ¹æ³ã
```java
public interface PasswordEncoder {
// å å¯ä¹å°±æ¯å¯¹åå§å¯ç è¿è¡ç¼ç
String encode(CharSequence var1);
// æ¯å¯¹åå§å¯ç åæ°æ®åºä¸ä¿åçå¯ç
boolean matches(CharSequence var1, String var2);
// 夿å å¯å¯ç æ¯å¦éè¦å次è¿è¡å å¯ï¼é»è®¤è¿å false
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}
```

宿¹æ¨è使ç¨åºäº bcrypt 强åå¸å½æ°çå å¯ç®æ³å®ç°ç±»ã
#### å¦ä½ä¼é
æ´æ¢ç³»ç»ä½¿ç¨çå å¯ç®æ³ï¼
妿æä»¬å¨å¼åè¿ç¨ä¸ï¼çªç¶åç°ç°æçå å¯ç®æ³æ æ³æ»¡è¶³æä»¬çéæ±ï¼éè¦æ´æ¢æå¦å¤ä¸ä¸ªå å¯ç®æ³ï¼è¿ä¸ªæ¶ååºè¯¥æä¹åå¢ï¼
æ¨èçåæ³æ¯éè¿ `DelegatingPasswordEncoder` å
¼å®¹å¤ç§ä¸åçå¯ç å 坿¹æ¡ï¼ä»¥éåºä¸åçä¸å¡éæ±ã
ä»ååä¹è½çåºæ¥ï¼`DelegatingPasswordEncoder` å
¶å®å°±æ¯ä¸ä¸ªä»£çç±»ï¼å¹¶éæ¯ä¸ç§å
¨æ°çå å¯ç®æ³ï¼å®åçäºæ
å°±æ¯ä»£çä¸é¢æå°çå å¯ç®æ³å®ç°ç±»ãå¨ Spring Security 5.0 ä¹åï¼é»è®¤å°±æ¯åºäº `DelegatingPasswordEncoder` è¿è¡å¯ç å å¯çã
------
## 5.2 SpringBootï¼ä»è´¹ï¼
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
**Spring Boot** ç¸å
³çé¢è¯é¢ä¸ºæç[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)ï¼ç¹å»é¾æ¥å³å¯æ¥ç详ç»ä»ç»ä»¥åå å
¥æ¹æ³ï¼ä¸å±å
容ï¼å·²ç»æ´çå°äº[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)ï¼ç¹å»é¾æ¥å³å¯æ¥ç详ç»ä»ç»ä»¥åè·åæ¹æ³ï¼ä¸ã
[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7) çé¨åå
容å±ç¤ºå¦ä¸ï¼ä½ å¯ä»¥å°å
¶ç使¯ [JavaGuide](https://javaguide.cn/) çè¡¥å
å®åï¼ä¸¤è
å¯ä»¥é
å使ç¨ã

[ãJava é¢è¯æåã](https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7)åªæ¯æçå
é¨ä¼å¤èµæä¸çä¸ä¸ªï¼æçè¿æå¾å¤å
¶ä»ä¼è´¨èµææ¯å¦[ä¸å±ä¸æ ](https://javaguide.cn/zhuanlan/)ãJava ç¼ç¨è§é¢ãPDF èµæã

æè¿å å¹´ï¼å¸é¢ä¸æè¶æ¥è¶å¤çâææ¯å¤§ä½¬âå¼å§åå¹è®ç/è®ç»è¥ï¼å¨è¾æåä¸ä¸çå¦è´¹ï¼å´å¹¶æ²¡æä»ä¹å¹²è´§ï¼å纯çå°±æ¯å²éèã
为äºå¸®å©æ´å¤åå¦åå¤ Java é¢è¯ä»¥åå¦ä¹ Java ï¼æå建äºä¸ä¸ªçº¯ç²¹ç[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)ãè½ç¶æ¶è´¹åªæå¹è®ç/è®ç»è¥çç¾åä¹ä¸ï¼ä½æ¯[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)éçå
å®¹è´¨éæ´é«ï¼æä¾çæå¡ä¹æ´å
¨é¢ã
欢è¿åå¤ Java é¢è¯ä»¥åå¦ä¹ Java çåå¦å å
¥æç[ç¥è¯æç](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)ï¼å¹²è´§é常å¤ï¼å¦ä¹ æ°å´éå¸¸å¥½ï¼æ¶è´¹è½ç¶æ¯ç½èä»·ï¼ä½æçéçå
容æè®¸æ¯ä½ åå ä¸ä¸çå¹è®çè´¨éè¿è¦é«ã

ä¸é¢æ¯æçæä¾çé¨åæå¡ï¼ç¹å»ä¸æ¹å¾çå³å¯è·åç¥è¯æçç详ç»ä»ç»ï¼ï¼
ææèªå·±çååï¼ä¸å²éèï¼ç¨å¿åå
容ï¼çå¿å¸æå¸®å©å°ä½ ï¼
å¦æä½ æå
´è¶£çè¯ï¼ä¸å¦¨è± 3 åéå·¦å³ççæçç详ç»ä»ç»ï¼ [JavaGuide ç¥è¯æç详ç»ä»ç»](https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc)ï¼ææ«æä¼æ å¸ï¼ã

------
## 5.3 MyBatis
> [JavaGuide](https://javaguide.cn/) ï¼ãJavaå¦ä¹ +é¢è¯æåãä¸ä»½æ¶µç大é¨å Java ç¨åºåæéè¦ææ¡çæ ¸å¿ç¥è¯ãåå¤ Java é¢è¯ï¼é¦é JavaGuideï¼
### #{} å \${} çåºå«æ¯ä»ä¹ï¼
注ï¼è¿é颿¯é¢è¯å®é¢è¯æåäºçã
çï¼
- `${}`æ¯ Properties æä»¶ä¸çåéå ä½ç¬¦ï¼å®å¯ä»¥ç¨äºæ ç¾å±æ§å¼å sql å
é¨ï¼å±äºéæææ¬æ¿æ¢ï¼æ¯å¦\${driver}ä¼è¢«éææ¿æ¢ä¸º`com.mysql.jdbc. Driver`ã
- `#{}`æ¯ sql çåæ°å ä½ç¬¦ï¼MyBatis ä¼å° sql ä¸ç`#{}`æ¿æ¢ä¸º? å·ï¼å¨ sql æ§è¡åä¼ä½¿ç¨ PreparedStatement çåæ°è®¾ç½®æ¹æ³ï¼æåºç» sql ç? å·å ä½ç¬¦è®¾ç½®åæ°å¼ï¼æ¯å¦ ps.setInt(0, parameterValue)ï¼`#{item.name}` çå弿¹å¼ä¸ºä½¿ç¨åå°ä»åæ°å¯¹è±¡ä¸è·å item 对象ç name 屿§å¼ï¼ç¸å½äº `param.getItem().getName()`ã
### xml æ å°æä»¶ä¸ï¼é¤äºå¸¸è§ç selectãinsertãupdateãdelete æ ç¾ä¹å¤ï¼è¿æåªäºæ ç¾ï¼
注ï¼è¿é颿¯äº¬ä¸é¢è¯å®é¢è¯ææ¶é®çã
çï¼è¿æå¾å¤å
¶ä»çæ ç¾ï¼ `` ã `` ã `` ã `` ã `` ï¼å ä¸å¨æ sql ç 9 个æ ç¾ï¼ `trim|where|set|foreach|if|choose|when|otherwise|bind` çï¼å
¶ä¸ `` 为 sql çæ®µæ ç¾ï¼éè¿ `` æ ç¾å¼å
¥ sql çæ®µï¼ `` ä¸ºä¸æ¯æèªå¢ç主é®çæçç¥æ ç¾ã
### Dao æ¥å£çå·¥ä½åçæ¯ä»ä¹ï¼Dao æ¥å£éçæ¹æ³ï¼åæ°ä¸åæ¶ï¼æ¹æ³è½éè½½åï¼
注ï¼è¿éé¢ä¹æ¯äº¬ä¸é¢è¯å®é¢è¯æè¢«é®çã
çï¼æä½³å®è·µä¸ï¼é常ä¸ä¸ª xml æ å°æä»¶ï¼é½ä¼åä¸ä¸ª Dao æ¥å£ä¸ä¹å¯¹åºãDao æ¥å£å°±æ¯äººä»¬å¸¸è¯´ç `Mapper` æ¥å£ï¼æ¥å£çå
¨éåï¼å°±æ¯æ å°æä»¶ä¸ç namespace çå¼ï¼æ¥å£çæ¹æ³åï¼å°±æ¯æ å°æä»¶ä¸ `MappedStatement` ç id å¼ï¼æ¥å£æ¹æ³å
çåæ°ï¼å°±æ¯ä¼ éç» sql çåæ°ã `Mapper` æ¥å£æ¯æ²¡æå®ç°ç±»çï¼å½è°ç¨æ¥å£æ¹æ³æ¶ï¼æ¥å£å
¨éå+æ¹æ³åæ¼æ¥å符串ä½ä¸º key å¼ï¼å¯å¯ä¸å®ä½ä¸ä¸ª `MappedStatement` ï¼ä¸¾ä¾ï¼ `com.mybatis3.mappers. StudentDao.findStudentById` ï¼å¯ä»¥å¯ä¸æ¾å° namespace 为 `com.mybatis3.mappers. StudentDao` ä¸é¢ `id = findStudentById` ç `MappedStatement` ãå¨ MyBatis ä¸ï¼æ¯ä¸ä¸ª `