1.javaԴ?源码???Ķ????
2.如何快速读懂项目源码javaWeb
3.OpenJDK17-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
4.javaå¦ä¹ å¿å¾
5.Java并发必会,深入剖析Semaphore源码
javaԴ????Ķ????
学会在idea(eclipse)中阅读、调试源码,源码是阅读体java程序员必不可少的一项技能。在idea中配完环境后,源码默认其实也是阅读体早起打卡红包源码能够对jdk的源码进行debug调试的。但是源码无法在源码中添加自己的注释,无法添加自己的阅读体理解。如果干瞪眼看的源码话,可能过段时间,阅读体就忘记了。源码下面就介绍下,阅读体如何在jdk源码中为所欲为,源码像在我们自己的阅读体代码中一样写注释、调代码:
打开idea,源码选择Project->File->Project Structure->SDKs->Sourcepath,初始状态如下图 :
打开本地jdk安装路径,本处为E:\java\jdk8,将此路径下的src.zip压缩包解压到自定义的指定文件夹(可以在电脑磁盘任意位置),本处解压到同目录的jdk_source文件夹下,如下图:
继续在步骤1中的图像旋转源码设置页面中操作,将E:\java\jdk8\src.zip通过右侧的减号将其移除;并通过右侧的加号,将解压文件夹E:\java\jdk8\jdk_source导入进来;点击apply,再点击OK。导入结果见下图:
这时,再重新打开jdk的源码类,我们就可以在源java文件中,添加自己的注释了。
一定注意:添加注释时,一定不要新加一行写注释。最好在一行代码的后面,使用//进行注释。否则行号和真正的jre中编译后的代码行号对应不上,如果对源码debug时,会出现代码运行和行号不匹配的情况
如何快速读懂项目源码javaWeb
一:学会如何读一个JavaWeb项目源代码 步骤:表结构->web.xml->mvc->db->spring
ioc->log-> 代码
1、先了解项目数据库的表结构,这个方面是最容易忘记 的,有时候我们只顾着看每一个方法是怎么进行的,却没
有去了解数据库之间的主外键关联。其实如果先了解数据 库表结构,再去看一个方法的电子签证源码实现会更加容易。
2、然后需要过一遍web.xml,知道项目中用到了什么拦
截器,监听器,过滤器,拥有哪些配置文件。如果是拦截 器,一般负责过滤请求,进行AOP 等;如果是监 可能是定时任务,初始化任务;配置文件有如使用了 spring
后的读取mvc 相关,db 相关,service 相关,aop 相关的文件。
3、查看拦截器,监听器代码,知道拦截了什么请求,这
个类完成了怎样的工作。有的人就是因为缺少了这一步, 自己写了一个action,spring源码转化配置文件也没有写错,但是却怎么
调试也无法进入这个action,直到别人告诉他,请求被拦
4、接下来,看配置文件,首先一定是mvc相关的,如 springmvc
中,要请求哪些请求是静态资源,使用了哪些 view 策略,controller 注解放在哪个包下等。 然后是db 相关配置文件,看使用了什么数据库,使用了
什么orm框架,是否开启了二级缓存,使用哪种产品作 为二级缓存,事务管理的处理,需要扫描的实体类放在什 么位置。最后是spring 核心的ioc
功能相关的配置文件, 知道接口与具体类的魔法触摸源码注入大致是怎样的。当然还有一些如 apectj 置文件,也是在这个步骤中完成
5、log
相关文件,日志的各个级别是如何处理的,在哪些 地方使用了log 记录日志
6、从上面几点后知道了整个开源项目的整体框架,阅读 每个方法就不再那么难了。
7、当然如果有项目配套的开发文档也是要阅读的。
OpenJDK-JVM 源码阅读 - ZGC - 并发标记 | 京东物流技术团队
ZGC简介:
ZGC是Java垃圾回收器的前沿技术,支持低延迟、大容量堆、染色指针、读屏障等特性,自JDK起作为试验特性,JDK起支持Windows,JDK正式投入生产使用。在JDK中已实现分代收集,预计不久将发布,性能将更优秀。
ZGC特征:
1. 低延迟
2. 大容量堆
3. 染色指针
4. 读屏障
并发标记过程:
ZGC并发标记主要分为三个阶段:初始标记、并发标记/重映射、重分配。本篇主要分析并发标记/重映射部分源代码。
入口与并发标记:
整个ZGC源码入口是ZDriver::gc函数,其中concurrent()是一个宏定义。并发标记函数是concurrent_mark。
并发标记流程:
从ZHeap::heap()进入mark函数,使用任务框架执行任务逻辑在ZMarkTask里,具体执行函数是work。工作逻辑循环从标记条带中取出数据,直到取完或时间到。此循环即为ZGC三色标记主循环。之后进入drain函数,从栈中取出指针进行标记,直到栈排空。标记过程包括从栈取数据,标记和递归标记。
标记与迭代:
标记过程涉及对象迭代遍历。标记流程中,ZGC通过map存储对象地址的finalizable和inc_live信息。map大小约为堆中对象对齐大小的二分之一。接着通过oop_iterate函数对对象中的指针进行迭代,使用ZMarkBarrierOopClosure作为读屏障,实现了指针自愈和防止漏标。
读屏障细节:
ZMarkBarrierOopClosure函数在标记非静态成员变量的指针时触发读屏障。慢路径处理和指针自愈是核心逻辑,慢路径标记指针,快速路径通过cas操作修复坏指针,并重新标记。
重映射过程:
读屏障触发标记后,对象被推入栈中,下次标记循环时取出。ZGC并发标记流程至此结束。
问题回顾:
本文解答了ZGC如何标记指针、三色标记过程、如何防止漏标、指针自愈和并发重映射过程的问题。
扩展思考:
ZGC在指针上标记,当回收某个region时,如何得知对象是否存活?答案需要结合标记阶段和重分配阶段的代码。
结束语:
本文深入分析了ZGC并发标记的源码细节,对您有启发或帮助的话,请多多点赞支持。作者:京东物流 刘家存,来源:京东云开发者社区 自猿其说 Tech。转载请注明来源。
javaå¦ä¹ å¿å¾
Javaå¦ä¹ å¿å¾
å¼è¨
软件å¼åä¹è·¯æ¯å 满èæ£ä¸ææä¹è·¯,ä¹æ¯å 满å¸æä¹è·¯ãJavaå¦ä¹ ä¹æ¯å¦æ¤ï¼æ²¡ææ·å¾å¯èµ°ã梦æ³åã天é¾å «é¨ãä¸è竹ä¸æ ·è¢«æ å´åééç顶èè½»æ¾è·å¾ä¸ç²åååï¼æ¯å¾ä¸ç°å®çãæ¯å¤©ä»°å¤©å¤§å«"天ç¥åï¼è¯·èµç»æä¸æ¬èµè±å®å ¸å§"ï¼æ®ä¸ç¥å³ä½¿ä½ è·å¾äºèµè±å®å ¸ï¼é¤äºåèªå®«å ¶èº«ä¹è¦å¤ï¼ä½ ä¹ä¸ä¸å®æå¾äº"ä¸æ¹ä¸è´¥"ï¼åæ¯æ"西æ¹å¤±è´¥"çå çé«ä¸ç¹ã
"ä¸èµ°å¼¯è·¯ï¼å°±æ¯æ·å¾"ï¼ä½ç»è¯´çä¸æ éçã
1ï¼å¦ä½å¦ä¹ ç¨åºè®¾è®¡ï¼
Javaæ¯ä¸ç§å¹³å°ï¼ä¹æ¯ä¸ç§ç¨åºè®¾è®¡è¯è¨ï¼å¦ä½å¦å¥½ç¨åºè®¾è®¡ä¸ä» ä» éç¨äºJavaï¼å¯¹C++çå ¶ä»ç¨åºè®¾è®¡è¯è¨ä¹ä¸æ ·ç®¡ç¨ãæç¼ç¨é«æ认为ï¼Javaä¹å¥½Cä¹å¥½æ²¡ä»ä¹åå«ï¼æ¿æ¥å°±ç¨ã为ä»ä¹ä»ä»¬è½è¾¾å°å¦æ¤å¢çï¼ææ³æ¯å 为ç¼ç¨è¯è¨ä¹é´æå ±éä¹å¤ï¼é¢ä¼äºç¼ç¨çç²¾é«ï¼èªç¶è½å¤åå°ä¸éç¾éãå¦ä½å¦ä¹ ç¨åºè®¾è®¡çæå½ç¶ä¹æ许å¤å ±éçå°æ¹ã
1.1ãå¹å »å ´è¶£
å ´è¶£æ¯è½å¤è®©ä½ åæä¸å»çå¨åãå¦æåªæ¯æåç¨åºä½ä¸ºè°ççæ段çè¯ï¼ä½ ä¼æ´»çå¾ç´¯ï¼ä¹å¤ªå¯¹ä¸èµ·èªå·±äºãå¤å ³å¿ä¸äºè¡ä¸è¶£äºï¼å¤æ³æ³çè¨ãä¸æ¯æå¡å¤©å¤©åç½æ¥æ¢¦ï¼ä½äººè¦æ¯æ²¡æäºæ¢¦æ³ï¼ä½ è§å¾æå³éåï¼å¯è½å许å¤æ·±å³æ¬å°åæ°ä¸æ ·ï¼ææ麻å°ï¼ååå夫è¶ï¼ææè´¢ç¥ç·ï¼æ¯ä¸ªæå°±æå ä¸åå ä¸çè³æ´å¤çè¿å¸ï¼å空å¤åºä¸ª"é£å©é¶å±"ãä½ è®¤ä¸ºï¼è¿æ ·æå³éåï¼æ空å¤å°ä¸äºç¨åºå论å转转ï¼ä½ ä¼åç°ï¼ä»ä»¬å ¶å®å¾ä¹è§å¹½é»ï¼æ¶ä¸æ¶ä¼ååºæºæ §çç«è±ã
1.2ãæ éç¨åºè®¾è®¡è¯è¨
ç·æå ¥éè¡ï¼å¥³æå«ééãåå¦è éæ©ç¨åºè®¾è®¡è¯è¨éè¦è°¨æ å¯¹å¾ ã软件å¼åä¸ä» ä» æ¯ææ¡ä¸é¨ç¼ç¨è¯è¨äºäºï¼å®è¿éè¦å ¶ä»å¾å¤æ¹é¢çèæ¯ç¥è¯ã软件å¼åä¹ä¸ä» ä» å±éäºæå 个é¢åï¼èæ¯å·²ç»æ¸éå°äºåè¡åä¸å ä¹æ¯ä¸ä¸ªè§è½ã
å¦æä½ å¯¹ç¡¬ä»¶æ¯è¾æå ´è¶£ï¼ä½ å¯ä»¥å¦ä¹ Cè¯è¨/æ±ç¼è¯è¨ï¼è¿å ¥ç¡¬ä»¶å¼åé¢åãå¦æä½ å¯¹çµä¿¡çè¡ä¸ç¥è¯åç½ç»æ¯è¾çæï¼ä½ å¯ä»¥å¨C/C++çä¹ä¸å¤è±æ¶é´ï¼ä»¥æè¿å ¥çµä¿¡è½¯ä»¶å¼åé¢åãå¦æä½ å¯¹æä½ç³»ç»æ¯è¾çæï¼ä½ å¯ä»¥å¦ä¹ C/Linuxçç,为Linuxå æ ¸å¼å/驱å¨ç¨åºå¼å/åµå ¥å¼å¼åæåºç¡ã
å¦æä½ æ³ä»å ¥å°åºç¨èå´æ广æ³çåºç¨è½¯ä»¶å¼åï¼å æ¬çµååå¡çµåæ¿å¡ç³»ç»ï¼çè¯ï¼ä½ å¯ä»¥éæ©J2EEæ.NETï¼çè³LAMPç»åãæ¯ä¸ªé¢åè¦æ±çèæ¯ç¥è¯ä¸ä¸æ ·ãååºç¨è½¯ä»¶éè¦å¯¹æ°æ®åºçå¾çæãæ»ä¹ï¼ä½ éè¦æ ¹æ®èªå·±çç¹ç¹æ¥éæ©åéä½ çç¼ç¨è¯è¨ã
1.3ãè¦èè¸å®å°,å¿«é¤å¼çå¦ä¹ ä¸å¯å
å å享ä¸ä¸ªæ äºã
æä¸ä¸ªå°æåï¼ä»å¾å欢ç 究çç©å¦ï¼å¾æ³ç¥éé£äºè´è¶å¦ä½ä»è¹å£³éåºæ¥ï¼åæè´è¶ä¾¿ä¼é£ãæä¸æ¬¡ï¼ä»èµ°å°èåä¸é¢çè§ä¸ä¸ªè¹ï¼ä¾¿åäºå家ï¼ç¶åççï¼è¿äºå 天以åï¼è¿ä¸ªè¹åºäºä¸æ¡è£çï¼çè§éé¢çè´è¶å¼å§æ£æï¼æ³æç ´è¹å£³é£åºæ¥ãè¿ä¸ªè¿ç¨è¾¾æ°å°æ¶ä¹ä¹ ï¼è´è¶å¨è¹éé¢å¾è¾è¦å°æ¼å½æ£æï¼æä¹ä¹æ²¡æ³åèµ°åºæ¥ãè¿ä¸ªå°å©ççççä¸å¿å¿ï¼å°±æ³ä¸å¦è®©æ帮帮å®å§ï¼ä¾¿éææ¿èµ·åªåå¨è¹ä¸åªå¼ï¼ä½¿è´è¶ç ´è¹èåºãä½è´è¶åºæ¥ä»¥åï¼å ä¸ºç¿ èä¸å¤åï¼åå¾å¾èè¿ï¼é£ä¸èµ·æ¥ã
è¿ä¸ªæ äºç»æ们çå¯ç¤ºæ¯ï¼æ¬²éåä¸è¾¾ã
æµ®èºæ¯ç°ä»£äººææ®éçå¿æï¼è½æªè°ï¼ä¹è®¸æ¯è´«ç©·è½åäºè¿ä¹å¤å¹´çç¼æ ï¼å°±åå½å¹´ç大è·è¿ä¸æ ·ï¼é½æ³å¤§æ¥è·¨å ¥***主ä¹ç¤¾ä¼ãç°å¨çè½¯ä»¶å ¬å¸ã客æ·ãæ¿åºãå¦æ ¡ãå¹è®æºæççå°å¤å¼¥æ¼«çæµ®èºä¹æ°ãå°±æ¿ææ¯è¾çæç大è¿å¤§å·¥ITèä¸å¹è®æ¥è¯´å§ï¼å± ç¶æ广å宣称"å¤å¹´ç计ç®æºèä¸æè²ï¼è¾½å®çåä½³å¦æ ¡"ï¼æ®ä¸ç¥ä¸å½è®¡ç®æºåå±æå å¹´ï¼è½¯ä»¶åå±æå å¹´ï¼å± ç¶å»æ¥åçå¦çä¸å°ï¼ç®ç´æ¯èè§å¤©ä¸ç¨åºåãå¹è®åºæ¥çâç¨åºåâ大å¤ä¸ç¥éOO,OP为ä½ç©ï¼ç¤¾ä¼ç¯å¢å¦æ¯ï¼æ们ä¸è½æ¹åï¼åªè½æ¹åèªå·±,é¹å¸ä¸çå®å®ï¼å¼¥è¶³çè´µã许å¤åå¦è C++/Java没å¼å§å¦ï¼ç«é©¬ä½¿ç¨VC/JBuilder,ä¼ä½¿ç¨ VC/JBuilderå¼åä¸ä¸ªHello Worldç¨åºï¼å°±å¿ä¸è¿çåä¸ç宣åï¼"æä¼è½¯ä»¶å¼åäº"ï¼ç®åä¸ä¹å¤§è¨ä¸æå°åä¸"ç²¾éVC/Java"ãç»æå°è½¯ä»¶å ¬å¸é¢è¯æ¶è¦ä¹è¢«ä¸ä¸¤ä¸æåèµ°äºï¼è¦ä¹è¢«é©³çä½æ å®è¤ï¼æ å°èªå®¹ãå°å¤ç¢°å£ä¹åæç¥éæ§èµ·ãC++ç¼ç¨ææ³ããJavaç¼ç¨ææ³ãä»ç»é»ç ï¼æ©ç¥å¦æ¤ä½å¿ å½ååã
"ä½ ç°å¨è®²ç©¶ç®åæ¹ä¾¿ï¼ä½ 以åç路就é¿äº"ï¼å¥½è±¡ä¹æ¯ä½ç»ä¸çåæã
1.4ãå¤å®è·µ,å¿«å®è·µ
å½ç«¯æ·çã为å¦ä¸é¦ç¤ºåä¾ãä¸æç©·åå°ä¸å¯åå°çæ äºã
ä»åï¼åå·è¾¹å¢æ两个åå°ï¼ä¸ä¸ªè´«ç©·ï¼ä¸ä¸ªæé±ãä¸å¤©ï¼ç©·åå°å¯¹å¯åå°è¯´ï¼"ææç®å»åæµ·æå£ï¼ä½ çæä¹æ ·ï¼"å¯åå°è¯´ï¼"è¿é离åæµ·æå åéè¿ï¼ä½ é ä»ä¹å»å¢ï¼"ç©·åå°è¯´ï¼"æåªè¦ä¸ä¸ªæ°´éµï¼ä¸ä¸ªé¥ç¢å°±å¤äºã"å¯åå°ä¸ºé¾å°è¯´ï¼"å å¹´åæå°±æç®ä¹°æ¡è¹å»åæµ·ï¼å¯è³ä»æ²¡å»æï¼ä½ è¿æ¯å«å»å§ï¼" ä¸å¹´ä»¥åï¼å¯åå°è¿å¨ä¸ºç§èµè¹åªç¹é±ï¼ç©·åå°å´å·²ç»ä»åæµ·æå£åæ¥äºã
è¿ä¸ªæ äºå¯è§£è¯»ä¸ºï¼ä»»ä½äºæ ï¼ä¸æ¦èè好äºï¼å°±è¦é©¬ä¸ä¸è·¯ï¼ä¸è¦çå°åå¤å¨å ¨ä¹åï¼åå»å¹²äºæ ãåå¦äºæ åå¤èèå¨å ¨äºåä¸è·¯çè¯ï¼å«äººæææ·è¶³å ç»äºã软件å¼åæ¯ä¸é¨å·¥ç¨å¦ç§ï¼æ³¨éçå°±æ¯å®è·µï¼"ååå¨å£ä¸å¨æ"对软件å¼å人åæ¥è®²æ ¹æ¬å°±æ¯é误çï¼ä»ä»¬æå¡"å¨æè³ä¸"ï¼ä½å«å®³æï¼ä»ä»¬å¤§å¤æ¸©æå°é ï¼æ²¡ææ´åå¾åï¼è½ç¶ææ¶åè¬å¤´å¢é¢çä¸å¯"æ¯å°çè¨"æ ·ãæåè¾é«äººè®¤ä¸ºï¼å¦ä¹ ç¼ç¨çç§è¯æ¯ï¼ç¼ç¨ãç¼ç¨ãåç¼ç¨ï¼ç¬è 深表èµåãä¸ä» è¦å¤å®è·µï¼èä¸è¦å¿«å®è·µãæ们å¨ç书çæ¶åï¼ä¸è¦çå°ä½ å®å ¨ç解äºæå¨ææ²ä»£ç ï¼èæ¯åºè¯¥å¨ç书çåæ¶æ²ä»£ç ï¼ç¨åºè¿è¡çåç§æ åµå¯ä»¥è®©ä½ æ´å¿«æ´ç¢åºçææ¡ç¥è¯ç¹ã
1.5ãå¤åèç¨åºä»£ç
ç¨åºä»£ç æ¯è½¯ä»¶å¼åæéè¦çææä¹ä¸ï¼å ¶ä¸æ¸éäºç¨åºåçææ³ä¸çµéã许å¤äººè¢«ãä»åå¥ä¾ ä¼ ãä¸åç¾çç±æ æ äºæå¨,æ²å§çç»å±æ´æä¸ç§ç¼ºæ¾ç¾ã为ä»ä¹è¦ä»¥æ²å§ç»å°¾ï¼æ®è¯´æ¯å 为åãä»åå¥ä¾ ä¼ ãçç¨åºå失æèå®æäºè¿æ ·çç»å±ï¼ä»æèªå·±çæè§èå ¥å°æ¸¸æä¸ï¼å´è®©ä¼å¤çä»åè¿·æ¼è å¹æ¯ã
å¤å¤åè代ç ä¾åï¼å¯¹Javaèè¨æåèæç®[4.3],æAPIç±»çæºä»£ç (JDKå®è£ ç®å½ä¸çsrc.zipæ件)ï¼ä¹å¯ä»¥ç 究ä¸äºå¼æºç软件ææ¡æ¶ã
1.6ãå 强è±æé 读è½å
对å¦ä¹ ç¼ç¨æ¥è¯´ï¼ä¸è¦æ±è±è¯, ä½ä¸è½ä¸ç¹ä¸ä¼,ãæèµ·ç åJava APIææ¡£(åèæç®[4.4])è¿äºä¸è¥¿è¿æ¯è¦è½çæç,è¿ç带æµé½å¯ä»¥ï¼æè¾¹åå¼å¯ä¸ä¸ª"éå±±è¯é¸"ãçå¤äºå°±ä¼è¶æ¥è¶çç»ãå¨å¦Javaçåæ¶å¦ä¹ è±æï¼ä¸ç®åéå¤å¥½ãå¦å¤å¥½å¤è½¯ä»¶éè¦å°è±æç½ç«ä¸è½½ï¼ä½ è¦è½å¤æ¾å°å®ä»¬ï¼è¿äºæ¯æåºæ¬çè¦æ±ãè±è¯å¥½å¯¹ä½ å¦ä¹ æå¾å¤§ç帮å©ãå£è¯å¥½çè¯æ´ææºä¼è¿å ¥ç®¡çå±ï¼è¿èå¯ä»¥æ为å¥åç¨åºåç"å¨æç®"ã
1.7ãä¸ä¸å¾å·²æ请æå«äºº
ç¬è å¨Martixä¸Java论åçå¨çº¿è¾ 导系ç»ä¸è§£å³å¦çé®é¢æ¶åç°ï¼å¤§é¨åçé®é¢å¦çç¨åæèå°±å¯ä»¥è§£å³ã请æå«äººä¹åï¼ä½ åºè¯¥å åçå¦ä¸å 个é®é¢ã
ä½ æ¯å¦å¨googleä¸æç´¢äºé®é¢ç解å³åæ³ï¼
ä½ æ¯å¦æ¥çäºJava APIææ¡£ï¼
ä½ æ¯å¦æ¥æ¾è¿ç¸å ³ä¹¦ç±ï¼
ä½ æ¯å¦å代ç æµè¯è¿ï¼
å¦æåçé½æ¯"æ¯"çè¯ï¼èä¸è¿æ²¡ææ¾å°è§£å³åæ³ï¼åé®å«äººä¸è¿ãè¦ç¥éç¬ç«æèçè½åå¯¹ä½ å¾éè¦ãè¦ç¥éç¨åºåçæ¶é´æ¯å¾å®è´µçã
1.8ãå¤è¯»å¥½ä¹¦
书ä¸èªæé¢å¦çãæ¯å°çè¨æ¯ä¸ä¸ªé¥±è¯»ç¾¤ä¹¦ç人ãè½ç¶æ²¡æ读å®å¤§å¦ï¼ä½ä¹å²çæ¶åæ¯å°çè¨å°±å·²ç»è¯»å®äºææçç¾ç§å ¨ä¹¦ï¼æ以ä»ç²¾é天æãåå²ãå°çççåç±»å¦ç§ï¼å¯ä»¥è¯´æ¯å°?è¨ä¸ä» æ¯å½ä»ä¸çä¸éé±çé¦å¯ï¼èä¸ä¹å¯ä»¥ç§°å¾ä¸æ¯ç¥è¯çå·¨å¯ã
ç¬è å¨ç»å¦çä¸è¯¾çæ¶åç»å¸¸ä¼ç»ä»ä»¬æ¨è书ç±ï¼å°åæ¥å¦çå®å¨å¿æ å¯å¿å¼å§æ±æ¨ï¼"天åï¼è¿ä¹å¤ä¹¦å°ä»ä¹æ¶åæè½çå®äº"ï¼"å¦è½¯ä»¶å¼åï¼æè§ä¸äºè´¼è¹ "ãè¿æ¶åï¼æçåçä¸è¬æ¯ï¼"å«çæ¥ï¼ä»ä¹æ¶åå¸¦ä½ ä»¬å»ççæç书æ¿ï¼å°ç°å¨æ¯æè±å¨ææ¯ä¹¦ç±ä¸çé±å ï¼è¿å¨è½¯ä»¶å¼å人åä¹ä¸è¿åªè½å¤ç®æ¯ä¸çç "ï¼å¦çå½åºæåãï¼æ³¨ï¼è¿ä¸é¨åå¦çæ¯åå¦è½¯ä»¶å¼åçï¼
1.9ã使ç¨åéçå·¥å ·
工欲åå ¶äºå¿ å å©å ¶å¨ã软件å¼åå å«åç§åæ ·çæ´»å¨ï¼éæ±æ¶éåæã建ç«ç¨ä¾æ¨¡åã建ç«åæ设计模åãç¼ç¨å®ç°ãè°è¯ç¨åºãèªå¨åæµè¯ãæç»éæççï¼æ²¡æå·¥å ·å¸®å¿å¯ä»¥è¯´æ¯å¯¸æ¥é¾è¡ãå·¥å ·å¯ä»¥æé«å¼åæçï¼ä½¿è½¯ä»¶çè´¨éæ´é«BUGæ´å°ãç»å称æçæ¦å¨ãå°é£è±æå¶çå¯ä¼¤äººçå¢çå°±å¾é«äºï¼æ æèææï¼æä¸æ åå¿ä¸æåè¿æ ·çå¢çå ä¹ä¸å¯ä¼åã
2ï¼è½¯ä»¶å¼åå¦ä¹ 路线
两åå¤å¹´çå家ææ³ååä¹éï¼ä¸åº¸çææ³éå ¥éª¨é«ï¼æ¢ä¸åè¿ä¹ä¸ä¿å®å¹¶éä¸åº¸ä¹éï¼èæ¯æ¾å¯»å¦ä¹ 软件å¼åçæ£ç¡®è·¯çº¿ä¸è§å¾ã
ä»è½¯ä»¶å¼å人åçç涯è§åæ¥è®²ï¼æ们å¯ä»¥å¤§è´å为ä¸ä¸ªé¶æ®µï¼è½¯ä»¶å·¥ç¨å¸â软件设计å¸âæ¶æ设计å¸æ项ç®ç®¡çå¸ãä¸æ³å½å å¸ çå£«å µä¸æ¯å¥½å£«å µï¼ä¸æ³å½æ¶æ设计å¸æ项ç®ç®¡çå¸çç¨åºåä¹ä¸æ¯å¥½çç¨åºåãæ们åºè¯¥åªåå¾ä¸èµ°ã让æ们å æ´çä¸ä¸å¼ååºç¨è½¯ä»¶éè¦å¦ä¹ ç主è¦ææ¯ã
Aï¼åºç¡ç论ç¥è¯ï¼å¦æä½ç³»ç»ãç¼è¯åçãæ°æ®ç»æä¸ç®æ³ã计ç®æºåççï¼å®ä»¬å¹¶éä¸éè¦ãå¦ä¸æ³æ为计ç®æºç§å¦å®¶çè¯ï¼å¯ä»¥éå"ç¨å°çæ¶ååæ¥å¦"çååã
Bï¼ä¸é¨ç¼ç¨è¯è¨ï¼ç°å¨åºæ¬ä¸é½æ¯é¢å对象çè¯è¨ï¼Java/C++/C#ççãå¦æåWEBå¼åçè¯è¿è¦å¦ä¹ HTML/JavaScriptççã
Cï¼ä¸ç§æ¹æ³å¦æè 说ææ³ï¼ç°å¨åºæ¬é½æ¯é¢å对象ææ³ï¼OOA/OOD/设计模å¼ï¼ãç±æ¤èè¡ççåºäºç»ä»¶å¼åCBD/é¢åæ¹é¢ç¼ç¨AOPççã
Dï¼ä¸ç§å ³ç³»åæ°æ®åºï¼ORACLE/SqlServer/DB2/MySQLçç
Eï¼ä¸ç§æé«ç产ççIDEéæå¼åç¯å¢JBuilder/Eclipse/VS.NETçã
Fï¼ä¸ç§UMLå»ºæ¨¡å·¥å ·ï¼ç¨ROSE/VISIO/é¢ç¬è¿è¡å»ºæ¨¡ã
Gï¼ä¸ç§è½¯ä»¶è¿ç¨ï¼RUP/XP/CMMççï¼éè¿è½¯ä»¶è¿ç¨æ¥ç»ç»è½¯ä»¶å¼åçä¼å¤æ´»å¨ï¼ä½¿å¼åæµç¨ä¸ä¸åè§èåãå½ç¶è¿æå ¶ä»çä¸äºè½¯ä»¶å·¥ç¨ç¥è¯ã
Hï¼é¡¹ç®ç®¡çãä½ç³»ç»æãæ¡æ¶ç¥è¯ã
æ£ç¡®ç路线åºè¯¥æ¯ï¼BâCâEâFâGâHã
è¿éè¦è¡¥å å ç¹ï¼
1ï¼ï¼å¯¹äºAä¸Cè¦è¡¥å çæ¯ï¼æ们åºè¯¥å¨å®è·µä¸éæ¥é¢æç¼ç¨ç论ä¸ç¼ç¨ææ³ãæ°ææ¯è½ç¶ä¸ææ¶ç°ï¼æ´æ°é度令人ç¼è±çä¹±é¾éçè±ï¼ä½ä¸åä¸ç¦»å ¶å®ï¼ç¼ç¨ç论ä¸ç¼ç¨ææ³çååå´å¾æ ¢ãææ¡äºç¼ç¨ç论ä¸ç¼ç¨ææ³ä½ å°±ä¼ææ¨äºè§æ¥ä¹æãé¢å对象çææ³å¨ç®åæ¥è®²æ¯ç¸å½å ³é®çï¼æ¯å¼ºå¿ææ¯ä¹ä¸ï¼å¨ä¸é¢éè¦å¤æå ¥æ¶é´ï¼ç»ä½ çåæ¥ä¹ä¼è®©ä½ æåã
2ï¼ï¼å¯¹äºæ°æ®åºæ¥è¯´æ¯ç¬ç«å¦ä¹ çï¼è¿ä¸ªæ¶æºå°±ç±ä½ æ¥å³å®å§ã
3ï¼ï¼ç¼ç¨è¯è¨ä½ä¸ºå¦ä¹ 软件å¼åç主线ï¼èå ¶ä½çä½ä¸ºè¾ 线ã
4ï¼ï¼è½¯ä»¶å·¥ç¨å¸çéäºBãCãEãDï¼è½¯ä»¶è®¾è®¡å¸çéäºBãCãEãDãFï¼æ¶æ设计å¸çéäºCãFãHã
3ï¼å¦ä½å¦ä¹ Java?
3.1 Javaå¦ä¹ 路线
3.1.1 åºç¡è¯æ³åJavaåç
åºç¡è¯æ³åJavaåçæ¯å°åºï¼å°åºä¸ç¢é ï¼ç¹å¦æ²å°ä¸å»ºæ©å¤©å¤§å¦ï¼æ¯ç¸å½å±é©çãå¦ä¹ Javaä¹æ¯å¦æ¤ï¼å¿ é¡»è¦ææå®çåºç¡ï¼ä½ æè½å¨J2EEã J2MEé¢å游åæä½ãåå SCJPï¼SUNå ¬å¸è®¤è¯çJavaç¨åºåï¼èè¯ä¸å¤±ä¸ºä¸ä¸ªå¥½æ¹æ³ï¼åå ä¹ä¸æ¯ä¸ºäºå¯¹å¾èµ·ä½ 交ç大æ´èè¯è´¹ï¼ä½ ä¼æ´åªåå¦ä¹ ï¼åå ä¹äºæ¯SCJPèè¯è½å¤è®©ä½ æåºç¡æå¾å¾ç¢é ï¼å®è¦æ±ä½ è·JDKä¸æ ·çæJavaåºç¡ç¥è¯ï¼ä½æ¯ä½ åä¸ä¸è¦è®¤ä¸ºèè¿äºSCJPå°±æå¤äºä¸èµ·ï¼å°±è½å¤è·å¾è½¯ä»¶å ¬å¸çéçï¼å°±è½å¤è·åé«èªï¼è¿æ ·çæ³æ³ä¹æ¯å¾å±é©çãè·å¾"çæ£"çSCJPåªè½è¯æä½ çåºç¡è¿è¿å¾å»ï¼ä½ç¦»å®é å¼åè¿æå¾é¿çä¸æ®µè·¯è¦èµ°ã
3.1.2 OOææ³çé¢æ
ææ¡äºåºç¡è¯æ³åJavaç¨åºè¿è¡åçåï¼æ们就å¯ä»¥ç¨Javaè¯è¨å®ç°é¢å对象çææ³äºãé¢å对象ï¼æ¯ä¸ç§æ¹æ³å¦;æ¯ç¬ç«äºè¯è¨ä¹å¤çç¼ç¨ææ³;æ¯ CBDåºäºç»ä»¶å¼åçåºç¡;å±äºå¼ºå¿ææ¯ä¹ä¸ãå½ä»¥åå å·¥ä½éè¦è½¬å°å«çé¢å对象è¯è¨çæ¶åï¼ä½ ä¼æå°ç¹å«ççæ亲åï¼å¦èµ·æ¥åååæ°´è¿ä¹ç®åã
使ç¨é¢å对象çææ³è¿è¡å¼åçåºæ¬è¿ç¨æ¯ï¼
âè°æ¥æ¶ééæ±ã
â建ç«ç¨ä¾æ¨¡åã
âä»ç¨ä¾æ¨¡åä¸è¯å«åæç±»åç±»ä¸ç±»ä¹é´çéæå¨æå ³ç³»ï¼ä»è建ç«åæ模åã
âç»ååæ模åå°è®¾è®¡æ¨¡åã
âç¨å ·ä½çææ¯å»å®ç°ã
âæµè¯ãé¨ç½²ãæ»ç»ã
3.1.3 åºæ¬APIçå¦ä¹
è¿è¡è½¯ä»¶å¼åçæ¶åï¼å¹¶ä¸æ¯ä»ä¹åè½é½éè¦æ们å»å®ç°ï¼ä¹å°±æ¯ç»å ¸åè¨æ说ç"ä¸éè¦éæ°åæè½®å"ãæ们å¯ä»¥å©ç¨ç°æçç±»ãç»ä»¶ãæ¡æ¶æ¥æ建æ们çåºç¨ï¼å¦SUNå ¬å¸ç¼å好äºä¼å¤ç±»å®ç°ä¸äºåºå±åè½ï¼ä»¥åæ们ä¸è½½è¿æ¥çJARæ件ä¸å å«çç±»,æ们å¯ä»¥è°ç¨ç±»ä¸çæ¹æ³æ¥å®ææäºåè½æ继æ¿å®ãé£ä¹è¿äºç±»ä¸ç©¶ç«æä¾äºåªäºæ¹æ³ç»æ们使ç¨ï¼æ¹æ³çåæ°ä¸ªæ°åç±»åæ¯ï¼ç±»çæé å¨éä¸éè¦åæ°ï¼æ»ä¸å¯è½SUNå ¬å¸çå·¥ç¨å¸æå½é é¿éçè³é£æ´è¿æµ·æ¥åè¯ä½ ä»ç¼åç类该å¦ä½ä½¿ç¨å§ãä»ä»¬åªè½æä¾ææ¡£ç»æ们æ¥çï¼Java DOCææ¡£ï¼åèæç®4.4ï¼å°±æ¯è¿æ ·çææ¡£ï¼å®å¯ä»¥è¯´æ¯ç¨åºåä¸ç¨åºå交æµçææ¡£ã
åºæ¬APIæçæ¯å®ç°äºä¸äºåºå±åè½çç±»ï¼éç¨æ§è¾å¼ºçAPIï¼å¦å符串å¤ç/è¾å ¥è¾åºççãæ们åæå®æ为类åºãçæAPIçæ¹æ³ä¸æ¯å¤æ¥Java DOCææ¡£ï¼åèæç®4.4ï¼ï¼äºæ¯ä½¿ç¨JBuilder/EclipseçIDEç代ç æ示åè½ã
3.1.4 ç¹å®APIçå¦ä¹
Javaä»å ¥çé¢åå¾å¹¿æ³ï¼ä¸åçé¢åæä¸åçAPIï¼æ²¡æ人çæææçAPIï¼å¯¹ä¸è¬äººèè¨åªæ¯çæå·¥ä½ä¸è¦ç¨å°çAPIãå¦æä½ åçé¢å¼åï¼é£ä¹ä½ éè¦å¦ä¹ Swing/AWT/SWTçAPIï¼å¦æä½ è¿è¡ç½ç»æ¸¸æå¼åï¼ä½ éè¦æ·±å ¥äºè§£ç½ç»API/å¤åªä½API/2D3Dçï¼å¦æä½ åWEBå¼åï¼å°±éè¦çæServletçAPIå¦ãæ»ä¹ï¼éè¦æ ¹æ®å·¥ä½çéè¦æä½ çå ´è¶£åå±æ¹åå»éæ©å¦ä¹ ç¹å®çAPIã
3.1.5 å¼åå·¥å ·çç¨æ³
å¨å¦ä¹ åºç¡è¯æ³ä¸åºæ¬çé¢å对象æ¦å¿µæ¶ï¼ä»é»ç¼è¯è¨çç»ç¨åº¦çè§åº¦èèï¼æ们æ¨è使ç¨çå·¥å ·æ¯Editplus/JCreator+JDK,è¿æ¶åä¸è¦æ¥äºä¸æJBuilder/Eclipseçéæå¼åç¯å¢ï¼ä»¥å è¿äºå ³æ³¨IDEç强大åè½èåæ£å¯¹Javaææ¯æ¬èº«ç注æåãè¿äºè¿ä¸é¶æ®µä½ å°±å¯ä»¥å¼å§çæ IDEäºã
ç¨åºåæ¥å¸¸å·¥ä½å æ¬å¾å¤æ´»å¨ï¼ç¼è¾ãç¼è¯åæ建ãè°è¯ãåå æµè¯ãçæ¬æ§å¶ãç»´æ模åä¸ä»£ç åæ¥ãææ¡£çæ´æ°ççï¼å ä¹æ¯ä¸é¡¹æ´»å¨é½æä¸é¨çå·¥å ·ï¼å¦æç¬ç«ä½¿ç¨è¿äºå·¥å ·çè¯ï¼ä½ å°ä¼å¾çè¦ï¼ä½ éè¦å¨å æ»¡å·¥å ·çä»»å¡æ ä¸ä¸æçåæ¢ï¼æçå¾ä½ä¸ï¼ä¹å¾å®¹æåºéãå¨JBuilderã EclipseçIDEä¸å·²ç»èªå¨éæç¼è¾å¨ãç¼è¯å¨ãè°è¯å¨ãåå æµè¯å·¥å ·JUnitãèªå¨æå»ºå·¥å ·ANTãçæ¬æ§å¶å·¥å ·CVSãDOCææ¡£çæä¸æ´æ°ççï¼çè³å¯ä»¥æUMLå»ºæ¨¡å·¥å ·ä¹éæè¿å»ï¼åæä¾äºä¸°å¯çå导帮å©çææ¡æ¶ä»£ç ï¼è®©æ们çå¼ååå¾æ´è½»æ¾ãåºè¯¥è¯´IDEåå±çè¶å¿å°±æ¯éæ软件å¼åä¸è¦ç¨å°çå ä¹ææå·¥å ·ã
ä»å¼åæççè§åº¦èèï¼ä½¿ç¨IDEæ¯å¿ ç»ä¹è·¯ï¼ä¹æ¯ä»ä¸ä¸ªå¦çå°ä¸ä¸ªèä¸ç¨åºå转åçéç¨ç¢ã
Javaå¼å使ç¨çIDE主è¦æEclipseãJBuilderãJDeveloperãNetBeansçå ç§ï¼èEclipseãJBuilder å æçå¸åºä»½é¢æ¯æ大çãJBuilderå¨è¿å å¹´æ¥ä¸ç´æ¯Javaéæå¼åç¯å¢ä¸çé¸ä¸»ï¼å®æ¯ç±å¤åç¨åºåå°æ¬çBorlandå ¬å¸å¼åï¼å¨ç¡ç弥漫ç Java IDE大æä¸,ä»¥å ¶å¿«éççæ¬æ´æ°å»è´¥IBMçVisual Age for Javaçèæå°±ä¸çªä¼ä¸ãIBMå¨Visual Age for Javaä¸å·²ç»æ å©å¯å¾ä¹ä¸ï¼å¹²èå°ä¹è´¡ç®ç»å¼æºç¤¾åºï¼æ为Eclipseçå身ï¼çæè°"æ³æè±æåä¸æ"ãæµ´ç«éççEclipseä»¥å ¶å¼æ¾å¼çæ件æ©å±æºå¶ãå è´¹å¼æºè·å¾å¹¿å¤§ç¨åºåï¼å æ¬å ä¹ææç骨ç°çº§ç¨åºåï¼çéçï¼æå ·åå±æ½åã
3.1.6 å¦ä¹ 软件工ç¨
对å°å项ç®èè¨ï¼ä½ å¯è½è®¤ä¸ºè½¯ä»¶å·¥ç¨æ²¡å¤ªå¤§çå¿ è¦ãéç项ç®çå¤ææ§è¶æ¥è¶é«ï¼è½¯ä»¶å·¥ç¨çå¿ è¦æ§æä¼ä½ç°åºæ¥ãåè§"软件å¼åå¦ä¹ 路线"å°èã
3.2å¦ä¹ è¦ç¹
ç¡®ç«çå¦ä¹ 路线ä¹åï¼æ们è¿éè¦æ»ç»ä¸ä¸Javaçå¦ä¹ è¦ç¹ï¼è¿äºè¦ç¹å¨åæå¤å¤å°å°æå°è¿ï¼åªæ¯ç¬è è§å¾è¿äºå°æ¹ç¹å«è¦æ³¨ææ对å®ä»¬è¿è¡æ±æ»ï¼ä¸è¦å«æå©å©å¦å¦åã
3.2.1å¤æ¥APIææ¡£
å½ç¨åºåç¼å好æäºç±»ï¼è§å¾å¾ææå°±æ,æ³æå®è´¡ç®ç»åä½è¦é¾çåè¡ãè¿æ¶åä½ è¦ä½¿ç¨"Javadoc"å·¥å ·ï¼å å«å¨JDKä¸ï¼çææ åçJava DOCææ¡£,ä¾åè¡ä½¿ç¨ãJ2SE/J2EE/J2MEçDOCææ¡£æ¯ç¨åºåä¸ç¨åºå交æµçå·¥å ·ï¼å ä¹äººæä¸ä»½ï¼é¤äºèé¸ä¹å¤ãJ2SE DOCææ¡£å®æ¹ä¸è½½å°åï¼/j2se/1.5.0/download.jspï¼ä½ å¯ä»¥å°googleæç´¢CHMçæ¬ä¸è½½ãä¹å¯ä»¥å¨çº¿æ¥çï¼/j2se/1.5.0/docs/api/index.htmlã
å¯¹å¾ DOCææ¡£è¦åæ¯è¯å½ï¼æ©ä¸èµ·åºå¿µä¸éï¼åé¥ç¡è§å念ä¸éã
å½éè¦æ项åè½çæ¶åï¼ä½ åºè¯¥å æ¥ç¸åºçDOCææ¡£ççæ没æç°æçå®ç°ï¼æçè¯å°±ä¸å¿ å³ç¥è´¹å¿äºç´æ¥ç¨å°±å¯ä»¥äºï¼æ¾ä¸å°çæ¶åæèèèªå·±å®ç°ã使ç¨æ¥éª¤ä¸è¬å¦ä¸ï¼
âæ¾ç¹å®çå ï¼å ä¸è¬æ ¹æ®åè½ç»ç»ã
âæ¾éè¦ä½¿ç¨ç±»ï¼ç±»å½åè§èçè¯æ们ç±ç±»çååå¯çåºä¸äºã
âéæ©æé å¨ï¼å¤§å¤æ°ä½¿ç¨ç±»çæ¹å¼æ¯å建对象ã
âéæ©ä½ éè¦çæ¹æ³ã
3.2.2 æ¥ä¹¦/google->å代ç æµè¯->æ¥çæºä»£ç ->请æå«äºº
å½æ们éå°é®é¢çæ¶å该å¦ä½è§£å³ï¼
è¿æ¶åä¸è¦æ¥çé®å«äººï¼å¤ªç®åçé®é¢ï¼æ²¡ç»è¿æèçé®é¢ï¼å«äººä¼å æ¤èç§ä¸èµ·ä½ ãå¯ä»¥å æ¾æ¾ä¹¦ï¼å°googleä¸æä¸ä¸ççï¼ç»å¤§é¨åé®é¢åºæ¬å°±è§£å³äºãèå"æäºç±»/æ¹æ³å¦ä½ä½¿ç¨çé®é¢"ï¼DOCæ档就æ¯çæ¡ã对æäºç¥è¯ç¹æçææ¯ï¼å代ç æµè¯ä¸ä¸ï¼ä¼ç»ä½ çä¸æ·±å»çå°è±¡ãèæçé®é¢ï¼ä½ å¯è½éè¦ç´æ¥ç APIçæºä»£ç éªè¯ä½ çæ³æ³ãä¸ä¸å¾å·²æå»è¯·æå«äººã
3.2.3å¦ä¹ å¼æºè½¯ä»¶ç设计ææ³
Javaé¢åæ许å¤æºä»£ç å¼æ¾çå·¥å ·ãç»ä»¶ãæ¡æ¶ï¼JUnitãANTãTomcatãStrutsãSpringãJive论åãPetStoreå® ç©åºççå¤å¦çæ¯ãè¿äºå¯æ¯åè¾ç»æ们çä¸çç°å®åãå ¥å®å±±è空æå½ï¼ä½ å¿çåï¼å¯¹è¿äºå·¥å ·ãæ¡æ¶è¿è¡åæï¼é¢ä¼å ¶ä¸ç设计ææ³ï¼ææä¸æ¥è¯´ä¸å®ä½ ä¹è½åä¸ä¸ªXXXæ¡æ¶ä»ä¹çï¼é£å ä¸æãåæå¼æºè½¯ä»¶å ¶å®æ¯ä½ æé«ææ¯ãæé«å®æè½åç便æ·æ¹æ³ã
3.2.4 è§èçéè¦æ§
没æè§ç©ï¼ä¸ææ¹åãè¿éçè§èæ两å±å«ä¹ã第ä¸å±å«ä¹æ¯ææ¯è§èï¼å¤å°/docs/codeconv/ï¼ä¸æçä¹æï¼åï¼è¿è¦é®æå¨åªï¼è¯·åè3.2.2èã
3.2.5 ä¸å±éäºJava
å¾ä¸å¹¸ï¼å¾å¹¸è¿ï¼è¦å¦ä¹ çä¸è¥¿è¿æå¾å¤ãä¸å¹¸çæ¯å 为è¦å¦çä¸è¥¿å¤ªå¤ä¸å¤åï¼æ²¡æ¶é´éªèå©å®¶äººæ女æåï¼å¯¼è´èº«å¿ç²æ«ï¼ä¸¥éè çè³å¯¼è´æéçã幸è¿çæ¯å«äººè¦æ¢ä½ é¥ç¢ç»éæäºï¼ä»ä»¬æ她们éè¦ä»åºå¾å¤æè½è¾¾æå¿æ¿ã
Javaä¸è¦å¤ç«å°å»å¦ä¹ ï¼éè¦ç»¼åå¦ä¹ æ°æ®ç»æãOOPã软件工ç¨ãUMLãç½ç»ç¼ç¨ãæ°æ®åºææ¯çç¥è¯ï¼ç¨æ¨ªå纵åçæ¯è¾èæ³çæ¹å¼å»å¦ä¹ ä¼æ´ææãå¦å¦ä¹ Javaéåçæ¶åæ¾æ°æ®ç»æç书ççï¼å¦JDBCçæ¶åå¤ä¹ æ°æ®åºææ¯ï¼éåçä¾ç¶æ¯"éè¦çæ¶ååå¦"çååã
4ï¼ç»æè¯
éè¦å¼ºè°çæ¯ï¼å¦ä¹ 软件å¼åç¡®å®æä¸å®çé¾åº¦ï¼ä¹å¾è¾è¦ï¼éè¦ä»åºå¾å¤åªåï¼ä½åä¸ä¸è¦åéèåºãæ¬æå¦æè½å¯¹ä¸ç´å¾å¾å¨Javaç¥æ®¿ä¹å¤çæåææ帮å©çè¯ï¼ç¬è ä¹æ¬£æ °äºãååï¼æä¹å¬èµ·æ¥èæ°æ¨ªç§åï¼æ²¡åæ³ï¼å¨çµèçé¿æè¾å°ä¹ä¸ï¼é½å¿«åæå°è头äºãæåå¥ååä½ç¨åºåå°¤å ¶æ¯MMç¨åºåï¼å®æå·¥ä½å赶快è¿ç¦»çµèï¼æ®ãè¡æä¹±æ¥ãæ¥éï¼çµèè¾å°ä¼å¨ç½ççç®è¤ä¸é¢ç¹ç¼ä¸äºå°é»ç¹ï¼çèµ·æ¥é²è³æ æ¯â¦â¦ æèµ·æ天ç梦æ³è¿å¾é èªå·±ï¼
Java并发必会,深入剖析Semaphore源码
在深入理解Java并发编程时,必不可少的是对Semaphore源码的剖析。本文将带你探索这一核心组件,通过实践和源码解析,掌握其限流和共享锁的本质。Semaphore,中文名信号量,就像一个令牌桶,任务执行前需要获取令牌,处理完毕后归还,确保资源访问的有序进行。
首先,Semaphore主要有acquire()和release()两个方法。acquire()负责获取许可,若许可不足,任务会被阻塞,直到有许可可用。release()用于释放并归还许可,确保资源释放后,其他任务可以继续执行。一个典型的例子是,如果一个线程池接受个任务,但Semaphore限制为3,那么任务将按每3个一组执行,确保系统稳定性。
Semaphore的源码实现巧妙地结合了AQS(AbstractQueuedSynchronizer)框架,通过Sync同步变量管理许可数量,公平锁和非公平锁的实现方式有所不同。公平锁会优先处理队列中的任务,而非公平锁则按照获取许可的顺序进行。
acquire()方法主要调用AQS中的acquireSharedInterruptibly(),并进一步通过tryReleaseShared()进行许可更新,公平锁与非公平锁的区别在于判断队列中是否有前置节点。release()方法则调用releaseShared(),更新许可数量。
Semaphore的简洁逻辑在于,AQS框架负责大部分并发控制,子类只需实现tryReleaseShared()和tryAcquireShared(),专注于许可数量的管理。欲了解AQS的详细流程,可参考之前的文章。
最后,了解了Semaphore后,我们还将继续探索共享锁CyclicBarrier的实现,敬请期待下篇文章。