【金三銀四】Java并發(fā)編程面試題(2021最新版)
前言
多線程和并發(fā)問(wèn)題是Java技術(shù)面試中面試官比較喜歡問(wèn)的問(wèn)題之一。在這里,從面試的角度列出了大部分重要的問(wèn)題,但是你仍然應(yīng)該牢固的掌握J(rèn)ava多線程基礎(chǔ)知識(shí)來(lái)對(duì)應(yīng)日后碰到的問(wèn)題。
Java并發(fā)編程最全面試題 123道
一、基礎(chǔ)知識(shí)
1. 為什么要使用并發(fā)編程
充分利用多核CPU的計(jì)算能力:通過(guò)并發(fā)編程的形式可以將多核CPU的計(jì)算能力發(fā)揮到極致,性能得到提升
方便進(jìn)行業(yè)務(wù)拆分,提升系統(tǒng)并發(fā)能力和性能:在特殊的業(yè)務(wù)場(chǎng)景下,先天的就適合于并發(fā)編程?,F(xiàn)在的系統(tǒng)動(dòng)不動(dòng)就要求百萬(wàn)級(jí)甚至千萬(wàn)級(jí)的并發(fā)量,而多線程并發(fā)編程正是開(kāi)發(fā)高并發(fā)系統(tǒng)的基礎(chǔ),利用好多線程機(jī)制可以大大提高系統(tǒng)整體的并發(fā)能力以及性能。面對(duì)復(fù)雜業(yè)務(wù)模型,并行程序會(huì)比串行程序更適應(yīng)業(yè)務(wù)需求,而并發(fā)編程更能吻合這種業(yè)務(wù)拆分 。
2. 多線程應(yīng)用場(chǎng)景
3. 并發(fā)編程有什么缺點(diǎn)
并發(fā)編程的目的就是為了能提高程序的執(zhí)行效率,提高程序運(yùn)行速度,但是并發(fā)編程并不總是能提高程序運(yùn)行速度的,而且并發(fā)編程可能會(huì)遇到很多問(wèn)題,比如**:內(nèi)存泄漏、上下文切換、線程安全、死鎖**等問(wèn)題。
4. 并發(fā)編程三個(gè)必要因素是什么?
并發(fā)編程三要素(線程的安全性問(wèn)題體現(xiàn)在):
原子性:原子,即一個(gè)不可再被分割的顆粒。原子性指的是一個(gè)或多個(gè)操作要么全部執(zhí)行成功要么全部執(zhí)行失敗。
可見(jiàn)性:一個(gè)線程對(duì)共享變量的修改,另一個(gè)線程能夠立刻看到。(synchronized,volatile)
有序性:程序執(zhí)行的順序按照代碼的先后順序執(zhí)行。(處理器可能會(huì)對(duì)指令進(jìn)行重排序)
出現(xiàn)線程安全問(wèn)題的原因:
線程切換帶來(lái)的原子性問(wèn)題
緩存導(dǎo)致的可見(jiàn)性問(wèn)題
編譯優(yōu)化帶來(lái)的有序性問(wèn)題
解決辦法:
JDK Atomic開(kāi)頭的原子類(lèi)、synchronized、LOCK,可以解決原子性問(wèn)題
synchronized、volatile、LOCK,可以解決可見(jiàn)性問(wèn)題
Happens-Before 規(guī)則可以解決有序性問(wèn)題
5. Java 程序中怎么保證多線程的運(yùn)行安全?
6. 并行和并發(fā)有什么區(qū)別?
7. 什么是多線程
多線程:多線程是指程序中包含多個(gè)執(zhí)行流,即在一個(gè)程序中可以同時(shí)運(yùn)行多個(gè)不同的線程來(lái)執(zhí)行不同的任務(wù)。
8. 多線程的好處
可以提高 CPU 的利用率。在多線程程序中,一個(gè)線程必須等待的時(shí)候,CPU 可以運(yùn)行其它的線程而不是等待,這樣就大大提高了程序的效率。也就是說(shuō)允許單個(gè)程序創(chuàng)建多個(gè)并行執(zhí)行的線程來(lái)完成各自的任務(wù)。
9. 多線程的劣勢(shì):
線程也是程序,所以線程需要占用內(nèi)存,線程越多占用內(nèi)存也越多;
多線程需要協(xié)調(diào)和管理,所以需要 CPU 時(shí)間跟蹤線程;
線程之間對(duì)共享資源的訪問(wèn)會(huì)相互影響,必須解決競(jìng)用共享資源的問(wèn)題。
10. 線程和進(jìn)程區(qū)別
進(jìn)程
一個(gè)在內(nèi)存中運(yùn)行的應(yīng)用程序。每個(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間,一個(gè)進(jìn)程可以有多個(gè)線程,比如在Windows系統(tǒng)中,一個(gè)運(yùn)行的xx.exe就是一個(gè)進(jìn)程。
線程
進(jìn)程中的一個(gè)執(zhí)行任務(wù)(控制單元),負(fù)責(zé)當(dāng)前進(jìn)程中程序的執(zhí)行。一個(gè)進(jìn)程至少有一個(gè)線程,一個(gè)進(jìn)程可以運(yùn)行多個(gè)線程,多個(gè)線程可共享數(shù)據(jù)。
線程具有許多傳統(tǒng)進(jìn)程所具有的特征,故又稱(chēng)為輕型進(jìn)程(Light—Weight Process)或進(jìn)程元;而把傳統(tǒng)的進(jìn)程稱(chēng)為重型進(jìn)程(Heavy—Weight Process),它相當(dāng)于只有一個(gè)線程的任務(wù)。在引入了線程的操作系統(tǒng)中,通常一個(gè)進(jìn)程都有若干個(gè)線程,至少包含一個(gè)線程。
根本區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線程是處理器任務(wù)調(diào)度和執(zhí)行的基本單位
資源開(kāi)銷(xiāo):每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開(kāi)銷(xiāo);線程可以看做輕量級(jí)的進(jìn)程,同一類(lèi)線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程之間切換的開(kāi)銷(xiāo)小。
包含關(guān)系:如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程,則執(zhí)行過(guò)程不是一條線的,而是多條線(線程)共同完成的;線程是進(jìn)程的一部分,所以線程也被稱(chēng)為輕權(quán)進(jìn)程或者輕量級(jí)進(jìn)程。
內(nèi)存分配:同一進(jìn)程的線程共享本進(jìn)程的地址空間和資源,而進(jìn)程之間的地址空間和資源是相互獨(dú)立的
影響關(guān)系:一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,但是一個(gè)線程崩潰整個(gè)進(jìn)程都死掉。所以多進(jìn)程要比多線程健壯。
執(zhí)行過(guò)程:每個(gè)獨(dú)立的進(jìn)程有程序運(yùn)行的入口、順序執(zhí)行序列和程序出口。但是線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制,兩者均可并發(fā)執(zhí)行



該資料獲取方式:關(guān)注+轉(zhuǎn)發(fā)后,
下方掃碼關(guān)注公眾號(hào)加我微信領(lǐng)取【備注:公眾號(hào)】?免費(fèi)領(lǐng)取
程序員這個(gè)職業(yè)需要我們不斷進(jìn)步,需要我們不斷學(xué)習(xí)新的知識(shí)。
喜歡小編的文章可以點(diǎn)點(diǎn)關(guān)注哦!
小編持續(xù)為你分享最新文章 和 福利領(lǐng)取哦
