1. 了解項目數(shù)據(jù)庫的表結構,這個方面是最容易忘記的,有時候我們只顧著看每一個方法是怎么進行的,卻沒有去了解數(shù)據(jù)庫之間的主外鍵關聯(lián)。其實如果先了解數(shù)據(jù)庫表結構,再去看一個方法的實現(xiàn)會更加容易。2. 然后需要過一遍web.xml,知道項目中用到了什么攔截器,監(jiān)聽器,過濾器,擁有哪些配置文件。如果是攔截器,一般負責過濾請求,進行AOP等;如果是監(jiān)聽器,可能是定時任務,初始化任務;配置文件有如使用了spring后的讀取mvc相關,db相關,service相關,aop相關的文件。3. 查看攔截器,監(jiān)聽器代碼,知道攔截了什么請求,這個類完成了怎樣的工作。有的人就是因為缺少了這一步,自己寫了一個action,配置文件也沒有寫錯,但是卻怎么調試也無法進入這個action,直到別人告訴他,請求被攔截了。4. 接下來,看配置文件,首先一定是mvc相關的,如springmvc中,要請求哪些請求是靜態(tài)資源,使用了哪些view策略,控制器注解放在哪個包下等。然后是db相關配置文件,看使用了什么數(shù)據(jù)庫,使用了什么orm框架,是否開啟了二級緩存,使用哪種產(chǎn)品作為二級緩存,事務管理的處理,需要掃描的實體類放在什么位置。最后是spring核心的ioc功能相關的配置文件,知道接口與具體類的注入大致是怎樣的。當然還有一些如aspectj置文件,也是在這個步驟中完成。5. log相關文件,日志的各個級別是如何處理的,在哪些地方使用了log記錄日志。6. 從上面幾點后知道了整個開源項目的整體框架,閱讀每個方法就不再那么難了。7. 當然如果有項目配套的開發(fā)文檔也是要閱讀的。源碼解析-偏向鎖撤銷流程解讀源碼鏈接:簡單總結下偏向撤銷的流程:細節(jié)補充:如何判斷偏向所有者沒有正在持有該偏向鎖?分兩步,首先判斷偏向所有者是否還活著,如果還活著,則遍歷它的棧,看是否能找到關聯(lián)該鎖的鎖記錄,如果找到,則正在持有,如果沒找到,則沒有持有。(遍歷過程在一個安全點執(zhí)行,此時偏向所有者被阻塞。)偏向所有者正在持有該偏向鎖,如何將其撤銷為輕量級鎖?遍歷偏向所有者的棧,修改與該鎖關聯(lián)的所有鎖記錄,讓偏向所有者以為它對該對象加的就是輕量級鎖。源碼中的highest_lock,為什么說是最早關聯(lián)偏向鎖的鎖記錄呢?首先,鎖記錄在棧里是連續(xù)存放的。請求獲取鎖時,按照從低地址到高地址的順序,找在已關聯(lián)該鎖的鎖記錄之前,最后一個空閑的鎖記錄(沒有指向任何鎖對象)。請求鎖的源碼如下:而撤銷偏向鎖時,遍歷偏向所有者的鎖記錄,也是按照從低地址到高地址的順序,但它沒有break的邏輯,因為它要處理所有關聯(lián)該鎖的鎖記錄。所以退出循環(huán)后,highest_lock指向的是最早關聯(lián)該鎖的鎖記錄。這篇:源碼解析-觸發(fā)批量撤銷或批量重偏向的條件,介紹了批量撤銷的觸發(fā)條件。包含批量撤銷邏輯的源碼:禁用類的可偏向屬性有兩點作用:對于批量撤銷時,正在被線程持有的偏向鎖,通過在安全點遍歷所有Java線程的棧,將偏向鎖撤銷為輕量級鎖。JAVA源碼解析的時候Character.MIN_RADIX為什么=2?‘’占一個字符位,你想一下,如果值是1,那么你怎么輸入漢字Character類的使用方法Character:字符類型1、屬性。staticintMIN_RADIX:返回最小基數(shù)。java解析eml的源代碼//?從EML文件得到MimeMessage對象MimeMessage?message?=?new?MimeMessage(session,?new?FileInputStream(emlFile));public?static?String?getMailSubject(Message?message)?throws?IOException?{return?MimeUtility.decodeText(message.getSubject());}public?static?String?getMailSender(Message?message)?throws?Exception?{String?emailSender?=?null;Address[]?addresses?=?message.getFrom();if?(addresses?==?null?||?addresses.length??1)?{throw?new?IllegalArgumentException("該郵件沒有發(fā)件人");}//?獲得發(fā)件人InternetAddress?address?=?(InternetAddress)?addresses[0];String?senderName?=?address.getPersonal();if?(senderName?!=?null)?{senderName?=?MimeUtility.decodeText(senderName);emailSender?=?senderName?+?""?+?address.getAddress()?+?"";}?else?{senderName?=?address.getAddress();}return?emailSender;}public?static?String?getMailRecipients(Message?message,?Message.RecipientType?recipientType)?throws?Exception?{StringBuilder?builder?=?new?StringBuilder();Address[]?addresses?=?null;if?(recipientType?==?null)?{addresses?=?message.getAllRecipients();}?else?{addresses?=?message.getRecipients(recipientType);}if?(addresses?==?null?||?addresses.length??1)?{throw?new?IllegalArgumentException("該郵件沒有收件人");}for?(Address?address?:?addresses)?{InternetAddress?iAddress?=?(InternetAddress)?address;builder.append(iAddress.toUnicodeString()).append(",?");}return?builder.deleteCharAt(builder.length()?-?1).toString();}public?static?String?getMailSendDate(Message?message,?String?pattern)?throws?Exception?{String?sendDateString?=?null;if?(pattern?==?null?||?"".equals(pattern.trim()))?{pattern?=?"yyyy年MM月dd日?E?HH:mm";}Date?sendDate?=?message.getSentDate();sendDateString?=?new?SimpleDateFormat(pattern).format(sendDate);return?sendDateString;}public?static?boolean?containsAttachment(Part?part)?throws?Exception?{boolean?flag?=?false;if?(part?!=?null)?{if?(part.isMimeType("multipart/*"))?{MimeMultipart?mp?=?(MimeMultipart)?part.getContent();for?(int?i?=?0;?i??mp.getCount();?i++)?{BodyPart?bodyPart?=?mp.getBodyPart(i);String?disposition?=?bodyPart.getDisposition();if?(disposition?!=?null??(Part.ATTACHMENT.equalsIgnoreCase(disposition)||?Part.INLINE.equalsIgnoreCase(disposition)))?{flag?=?true;}?else?if?(bodyPart.isMimeType("multipart/*"))?{flag?=?containsAttachment(bodyPart);}?else?{String?contentType?=?bodyPart.getContentType();if?(contentType.indexOf("application")?!=?-1)?{flag?=?true;}if?(contentType.indexOf("name")?!=?-1)?{flag?=?true;}}if?(flag)break;}}?else?if?(part.isMimeType("message/rfc822"))?{flag?=?containsAttachment((Part)?part.getContent(),?destDir);}}return?flag;}public?static?boolean?isSeen(Message?message)?throws?Exception?{if?(message?==?null)?{throw?new?MessagingException("Message?is?empty");}return?message.getFlags().contains(Flags.Flag.SEEN);}public?static?boolean?isReplaySign(Message?message)?throws?Exception?{if?(message?==?null)?{throw?new?MessagingException("Message?is?empty");}boolean?replaySign?=?false;String[]?headers?=?message.getHeader("Disposition-Notification-To");if?(headers?!=?null??headers.length??0)?{replaySign?=?true;}return?replaySign;}public?static?String?getMailPriority(Message?message)?throws?Exception?{if?(message?==?null)?{throw?new?MessagingException("Message?is?empty");}String?priority?=?"普通";String[]?headers?=?message.getHeader("X-Priority");if?(headers?!=?null??headers.length??0)?{String?mailPriority?=?headers[0];if?(mailPriority.indexOf("