UNIX(多线程):23---线程池注意事项和常见问题
使用線程池的注意事項(xiàng)
死鎖
任何多線程程序都有死鎖的風(fēng)險(xiǎn),最簡(jiǎn)單的情形是兩個(gè)線程AB,A持有鎖1,請(qǐng)求鎖2,B持有鎖2,請(qǐng)求鎖1。(這種情況在mysql的排他鎖也會(huì)出現(xiàn),不會(huì)數(shù)據(jù)庫(kù)會(huì)直接報(bào)錯(cuò)提示)。線程池中還有另一種死鎖:假設(shè)線程池中的所有工作線程都在執(zhí)行各自任務(wù)時(shí)被阻塞,它們?cè)诘却硞€(gè)任務(wù)A的執(zhí)行結(jié)果。而任務(wù)A卻處于隊(duì)列中,由于沒有空閑線程,一直無法得以執(zhí)行。這樣線程池的所有資源將一直阻塞下去,死鎖也就產(chǎn)生了。
系統(tǒng)資源不足
如果線程池中的線程數(shù)目非常多,這些線程會(huì)消耗包括內(nèi)存和其他系統(tǒng)資源在內(nèi)的大量資源,從而嚴(yán)重影響系統(tǒng)性能。
并發(fā)錯(cuò)誤
線程池的工作隊(duì)列依靠wait()和notify()方法來使工作線程及時(shí)取得任務(wù),但這兩個(gè)方法難以使用。如果代碼錯(cuò)誤,可能會(huì)丟失通知,導(dǎo)致工作線程一直保持空閑的狀態(tài),無視工作隊(duì)列中需要處理的任務(wù)。因?yàn)樽詈檬褂靡恍┍容^成熟的線程池。
線程泄漏
使用線程池的一個(gè)嚴(yán)重風(fēng)險(xiǎn)是線程泄漏。對(duì)于工作線程數(shù)目固定的線程池,如果工作線程在執(zhí)行任務(wù)時(shí)拋出RuntimeException或Error,并且這些異常或錯(cuò)誤沒有被捕獲,那么這個(gè)工作線程就異常終止,使線程池永久丟失了一個(gè)線程。(這一點(diǎn)太有意思)
另一種情況是,工作線程在執(zhí)行一個(gè)任務(wù)時(shí)被阻塞,如果等待用戶的輸入數(shù)據(jù),但是用戶一直不輸入數(shù)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的UNIX(多线程):23---线程池注意事项和常见问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于遍历linux的文件目录的坑- re
- 下一篇: Windows Git客户端搭建