6個(gè)java多線程問題總結(jié)

Java學(xué)習(xí)群,479121291,每天都會(huì)有干貨分享

1、多線程有什么用?

一個(gè)可能在很多人看來很扯淡的一個(gè)問題:我會(huì)用多線程就好了,還管它有什么用?。所謂”知其然知其所以然”,”會(huì)用”只是”知其然”,”為什么用”才是”知其所以然”,只有達(dá)到”知其然知其所以然”的程度才可以說是把一個(gè)知識點(diǎn)運(yùn)用自如。OK,下面說說我對這個(gè)問題的看法:

(1)發(fā)揮多核CPU的優(yōu)勢隨著工業(yè)的進(jìn)步,現(xiàn)在的筆記本、臺式機(jī)乃至商用的應(yīng)用服務(wù)器至少也都是雙核的,4核、8核甚至16核的也都不少見,如果是單線程的程序,那么在雙核CPU上就浪費(fèi)了50%,在4核CPU上就浪費(fèi)了75%。單核CPU上所謂的”多線程”那是假的多線程,同一時(shí)間處理器只會(huì)處理一段邏輯,只不過線程之間切換得比較快,看著像多個(gè)線程”同時(shí)”運(yùn)行罷了。多核CPU上的多線程才是真正的多線程,它能讓你的多段邏輯同時(shí)工作,多線程,可以真正發(fā)揮出多核CPU的優(yōu)勢來,達(dá)到充分利用CPU的目的。

(2)防止阻塞從程序運(yùn)行效率的角度來看,單核CPU不但不會(huì)發(fā)揮出多線程的優(yōu)勢,反而會(huì)因?yàn)樵趩魏薈PU上運(yùn)行多線程導(dǎo)致線程上下文的切換,而降低程序整體的效率。但是單核CPU我們還是要應(yīng)用多線程,就是為了防止阻塞。試想,如果單核CPU使用單線程,那么只要這個(gè)線程阻塞了,比方說遠(yuǎn)程讀取某個(gè)數(shù)據(jù)吧,對端遲遲未返回又沒有設(shè)置超時(shí)時(shí)間,那么你的整個(gè)程序在數(shù)據(jù)返回回來之前就停止運(yùn)行了。多線程可以防止這個(gè)問題,多條線程同時(shí)運(yùn)行,哪怕一條線程的代碼執(zhí)行讀取數(shù)據(jù)阻塞,也不會(huì)影響其它任務(wù)的執(zhí)行。

(3)便于建模這是另外一個(gè)沒有這么明顯的優(yōu)點(diǎn)了。假設(shè)有一個(gè)大的任務(wù)A,單線程編程,那么就要考慮很多,建立整個(gè)程序模型比較麻煩。但是如果把這個(gè)大的任務(wù)A分解成幾個(gè)小任務(wù),任務(wù)B、任務(wù)C、任務(wù)D,分別建立程序模型,并通過多線程分別運(yùn)行這幾個(gè)任務(wù),那就簡單很多了。

2、創(chuàng)建線程的方式

比較常見的一個(gè)問題了,一般就是兩種:

(1)繼承Thread類

(2)實(shí)現(xiàn)Runnable接口至于哪個(gè)好,不用說肯定是后者好,因?yàn)閷?shí)現(xiàn)接口的方式比繼承類的方式更靈活,也能減少程序之間的耦合度,面向接口編程也是設(shè)計(jì)模式6大原則的核心。

3、什么是線程安全

又是一個(gè)理論的問題,各式各樣的答案有很多,我給出一個(gè)個(gè)人認(rèn)為解釋地最好的:如果你的代碼在多線程下執(zhí)行和在單線程下執(zhí)行永遠(yuǎn)都能獲得一樣的結(jié)果,那么你的代碼就是線程安全的。這個(gè)問題有值得一提的地方,就是線程安全也是有幾個(gè)級別的:

(1)不可變像String、Integer、Long這些,都是final類型的類,任何一個(gè)線程都改變不了它們的值,要改變除非新創(chuàng)建一個(gè),因此這些不可變對象不需要任何同步手段就可以直接在多線程環(huán)境下使用

(2)絕對線程安全不管運(yùn)行時(shí)環(huán)境如何,調(diào)用者都不需要額外的同步措施。要做到這一點(diǎn)通常需要付出許多額外的代價(jià),Java中標(biāo)注自己是線程安全的類,實(shí)際上絕大多數(shù)都不是線程安全的,不過絕對線程安全的類,Java中也有,比方說CopyOnWriteArrayList、CopyOnWriteArraySet

(3)相對線程安全相對線程安全也就是我們通常意義上所說的線程安全,像Vector這種,add、remove方法都是原子操作,不會(huì)被打斷,但也僅限于此,如果有個(gè)線程在遍歷某個(gè)Vector、有個(gè)線程同時(shí)在add這個(gè)Vector,99%的情況下都會(huì)出現(xiàn)ConcurrentModificationException,也就是fail-fast機(jī)制。

(4)線程非安全這個(gè)就沒什么好說的了,ArrayList、LinkedList、HashMap等都是線程非安全的類。

最后我推薦下我自己的JAVAqun:479121291,不管你是小白還是大牛,小編我都挺歡迎,不定期分享干貨,包括我自己整理的一份最新JAVA資料和零基礎(chǔ)入門教程!,歡迎初學(xué)和進(jìn)階中的小伙伴。

4、一個(gè)線程如果出現(xiàn)了運(yùn)行時(shí)異常會(huì)怎么樣

如果這個(gè)異常沒有被捕獲的話,這個(gè)線程就停止執(zhí)行了。另外重要的一點(diǎn)是:如果這個(gè)線程持有某個(gè)某個(gè)對象的監(jiān)視器,那么這個(gè)對象監(jiān)視器會(huì)被立即釋放

5、如何在兩個(gè)線程之間共享數(shù)據(jù)

通過在線程之間共享對象就可以了,然后通過wait/notify/notifyAll、await/signal/signalAll進(jìn)行喚起和等待,比方說阻塞隊(duì)列BlockingQueue就是為線程之間共享數(shù)據(jù)而設(shè)計(jì)的。

6、為什么要使用線程池

避免頻繁地創(chuàng)建和銷毀線程,達(dá)到線程對象的重用。另外,使用線程池還可以根據(jù)項(xiàng)目靈活地控制并發(fā)的數(shù)目。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容