場(chǎng)景描述:
? ? 在開發(fā)過程中,由于每個(gè)人的編碼習(xí)慣和風(fēng)格不同,而項(xiàng)目平時(shí)又不經(jīng)常進(jìn)行代碼優(yōu)化,久而久之會(huì)使項(xiàng)目代碼存在諸多問題。鑒于此公司近來使用SonarQube對(duì)公司項(xiàng)目的所有工程進(jìn)行了代碼質(zhì)量掃描,由此,發(fā)現(xiàn)了諸多問題。
源碼展示:

SonarQube掃描結(jié)果

問題描述
從非靜態(tài)方法正確地更新靜態(tài)字段非常困難,如果有多個(gè)類實(shí)例和/或多個(gè)線程在運(yùn)行,則很容易導(dǎo)致錯(cuò)誤。理想情況下,靜態(tài)字段只能從同步的靜態(tài)方法中更新。
每當(dāng)從非靜態(tài)方法更新靜態(tài)字段時(shí),此規(guī)則都會(huì)引發(fā)問題。
源碼知識(shí)點(diǎn)匯總
1、注解@PostConstruct使用規(guī)范及其特點(diǎn)??@PostConstruct使用詳解
2、jvm類加載時(shí)機(jī)
源碼加載分析
? ? 首先,JVM在加載階段通過類的全路徑找到該類并把類的信息加載到JVM的方法區(qū),然后在堆區(qū)實(shí)例化有關(guān)java.lang.Class對(duì)象,作為方法區(qū)中這個(gè)類的信息的入口;然后在連接階段,為類的靜態(tài)變量logClinet分配內(nèi)存并賦予JVM默認(rèn)初始值null;因?yàn)樽⒔釦PostConstruct的緣故,在類初始化之前會(huì)先加載該使用該注解的方法;然后再執(zhí)行類的初始化。
注:
? ? 構(gòu)造方法? ——> @Autowired —— > @PostConstruct ——> 靜態(tài)方法 (按此順序加載)