此時(shí),就可以寫一個(gè)多線程的應(yīng)用,同時(shí)向ArryList這一類非線程安全的容器中存放內(nèi)容,然后觀察為什么他們是線程不安全的,會(huì)出現(xiàn)什么問(wèn)題,生動(dòng)又形象。
PS: 這里順道說(shuō)一下,這就是為什么創(chuàng)建線程時(shí)建議起一個(gè)有意義的名字,至少是可以識(shí)別的名字,否則在這里都不能區(qū)分出哪個(gè)是自己的線程,想切換還麻煩。
2 后退執(zhí)行
這里所說(shuō)的后退執(zhí)行,是有些時(shí)候我們?cè)赿ebug代碼時(shí),懶的每個(gè)方法都進(jìn)入單步調(diào)試,就會(huì)出現(xiàn)你觀察一個(gè)變量值的變化時(shí),某個(gè)方法沒(méi)跟進(jìn)去,結(jié)果值就變了,不得不重來(lái)一次。
依靠后退執(zhí)行的功能,可以后退,就像下棋時(shí)悔棋那種功能一樣。當(dāng)然,這個(gè)后退招待的名字是我自己起的,在IDE里被稱為Drop Frame。
有了這個(gè)功能,我們?cè)贒rop 了當(dāng)前這個(gè)Frame之后,已經(jīng)改變的變量值不會(huì)恢復(fù)。比如你向當(dāng)前調(diào)用方法里傳入了一個(gè)List,并且在方法中向List里添加了內(nèi)容,那在Drop到調(diào)用該方法的地方時(shí),List不會(huì)恢復(fù)到之前的狀態(tài)。
但是在該方法再次被調(diào)用時(shí),你可以觀察List什么時(shí)候被改變的,至少不需要再重跑一遍程序了。甚至你可以一言不合就后退。
3 條件斷點(diǎn)
為了調(diào)試代碼,就需要在要觀察變更的地方添加斷點(diǎn),然后小心翼翼的一步步執(zhí)行。但是如果是在一個(gè)循環(huán)里,又或者該方法會(huì)被多線程同時(shí)調(diào)用到的時(shí)候,你小心的向下單步調(diào)試,發(fā)現(xiàn)沒(méi)有你關(guān)心的內(nèi)容,又從循環(huán)開(kāi)始處跑下來(lái),還是沒(méi)你的內(nèi)容,人就開(kāi)始煩燥起來(lái)。
其實(shí),在添加斷點(diǎn)的時(shí)候,我們可以為斷點(diǎn)增加一定的條件,這樣,在指定的條件滿足時(shí),斷點(diǎn)才會(huì)生效。
IntelliJ IDEA內(nèi),在斷點(diǎn)上右擊,會(huì)彈出如下圖的條件框,輸入指定的條件即可。