多線(xiàn)程基礎(chǔ)面試題

目錄:

1.并行和并發(fā):

2.進(jìn)程和線(xiàn)程:

3.創(chuàng)建多線(xiàn)程的方式:

4.接口和繼承多線(xiàn)程的區(qū)別:

5.callable和runnable的區(qū)別:

6.線(xiàn)程的生命周期:

7.線(xiàn)程死亡狀態(tài):

8.線(xiàn)程安全問(wèn)題:

9.解決線(xiàn)程安全問(wèn)題方法:

10.同步代碼塊和同步方法和同步鎖:

11.公平鎖和非公平鎖:

12.synchronized和lock的區(qū)別:

13.死鎖:

14.死鎖的4個(gè)條件:

15.死鎖預(yù)防:

16.線(xiàn)程間通訊:

17.Threadlocal:

18.可重入鎖和不可重入鎖:

19.同步容器和并發(fā)容器:

20.多線(xiàn)程的優(yōu)點(diǎn)和缺點(diǎn):

21.線(xiàn)程池的優(yōu)點(diǎn):

22.線(xiàn)程池核心參數(shù):

23.并發(fā)編程常見(jiàn)的三個(gè)問(wèn)題:

24.java內(nèi)存模型:

25.synchronized的特性:

1.并行和并發(fā):

并行:多個(gè)線(xiàn)程在同一時(shí)間點(diǎn)發(fā)生。

并發(fā):多個(gè)線(xiàn)程在同一個(gè)時(shí)間段發(fā)生。

2.進(jìn)程和線(xiàn)程:

進(jìn)程:應(yīng)用程序的運(yùn)行。

線(xiàn)程:進(jìn)程的單位。

3.創(chuàng)建多線(xiàn)程的方式:

1.繼承thread類(lèi)。

2.實(shí)現(xiàn)runnable接口。

3.實(shí)現(xiàn)callable接口。

4.使用線(xiàn)程池。

4.接口和繼承多線(xiàn)程的區(qū)別:

1.接口避免了java單繼承帶來(lái)的局限性。

2.線(xiàn)程池只支持接口的方式。

5.callable和runnable的區(qū)別:

相同點(diǎn):callable和runnable都是使用接口創(chuàng)建多線(xiàn)程。

不同點(diǎn):callable需要重寫(xiě)call方法,runnable需要重寫(xiě)run方法。

? ? ? ? ? ? ? ? callable需要處理異常,runnable不需要處理異常。

? ? ? ? ? ? ? ? callable有返回值,runnable沒(méi)有返回值。

? ? ? ? ? ? ? ? callable可以中斷,runnable不能中斷。

6.線(xiàn)程的生命周期:

1.新建狀態(tài):new出來(lái)的時(shí)候。

2.就緒狀態(tài):調(diào)用start方法。

3.運(yùn)行狀態(tài):cpu調(diào)度。

4.阻塞狀態(tài):調(diào)用wait,sleep,或join方法,同步阻塞,獲取其他線(xiàn)程鎖定的對(duì)象。

5.死亡狀態(tài):線(xiàn)程運(yùn)行結(jié)束等情況。

7.線(xiàn)程死亡狀態(tài):

1.run方法結(jié)束。

2.線(xiàn)程出現(xiàn)異常。

3.調(diào)用stop方法。

8.線(xiàn)程安全問(wèn)題:

多線(xiàn)程安全主要由全局變量或靜態(tài)變量引起。一旦操作全局變量或靜態(tài)變量,則可能引發(fā)線(xiàn)程的安全性問(wèn)題。

9.解決線(xiàn)程安全問(wèn)題方法:

1.synchronized關(guān)鍵字

2.同步鎖lock

3.volatile關(guān)鍵字修飾全局變量或靜態(tài)變量。

4.局部變量threadlocal

10.同步代碼塊和同步方法和同步鎖:

同步代碼塊:synchronized修飾一段代碼塊,需要鎖定一個(gè)對(duì)象。

同步方法:synchronized修飾方法,鎖定的對(duì)象為類(lèi)本身。

同步鎖:new一個(gè)lock對(duì)象,在需要同步的代碼中先加鎖,再使用try catch包住同步的內(nèi)容,最后再finally中解鎖。

11.公平鎖和非公平鎖:

公平鎖:按線(xiàn)程的先來(lái)后到的順序依次獲取鎖。

非公平鎖:多個(gè)線(xiàn)程可以同時(shí)搶占鎖。

12.synchronized和lock的區(qū)別:

synchronized是一個(gè)關(guān)鍵字,可以修飾代碼塊和方法,發(fā)生異常會(huì)自動(dòng)釋放鎖,不可中斷。

lock是一個(gè)接口,發(fā)生異常不會(huì)釋放鎖,所以需要再finally中手動(dòng)釋放鎖,可以中途中斷。

13.死鎖:

多個(gè)線(xiàn)程因?yàn)闋?zhēng)奪資源,而造成的一種相互等待的現(xiàn)象,無(wú)外力作用下,無(wú)法繼續(xù)推動(dòng)。此時(shí)不會(huì)發(fā)生異常,而是所有的線(xiàn)程都處于阻塞的狀態(tài)。

14.死鎖的4個(gè)條件:

1.互斥條件:當(dāng)一個(gè)線(xiàn)程獲取鎖后,不允許其他線(xiàn)程鎖定。

2.不可剝奪條件:鎖定的對(duì)象,無(wú)法被強(qiáng)制剝奪。

3.請(qǐng)求保持:線(xiàn)程獲取鎖后,除非運(yùn)行完畢,否則不會(huì)釋放鎖。

4.循環(huán)等待:多個(gè)線(xiàn)程鎖定對(duì)象后,等待其他線(xiàn)程獲取的資源釋放。

15.死鎖預(yù)防:

1.避免多次鎖定,即鎖定一個(gè)對(duì)象后,再鎖定第二對(duì)象,釋放之前鎖定的對(duì)象。

2.設(shè)定鎖的超時(shí)時(shí)間。

3.使多個(gè)線(xiàn)程有相同的加鎖順序。

16.線(xiàn)程間通訊:

正常來(lái)說(shuō)多線(xiàn)程是由cpu隨機(jī)調(diào)配執(zhí)行,當(dāng)我們想讓多線(xiàn)程按照我們預(yù)想的方式執(zhí)行,則需要使用線(xiàn)程間通訊。

1.休眠喚醒:調(diào)用wait方法后,線(xiàn)程休眠,但必須使用notify來(lái)喚醒。

Object:wait、notify、notifyall

Condition: condition、signal、signalall

2.countdownlatch:使一個(gè)線(xiàn)程等待其他線(xiàn)程執(zhí)行完畢后,再執(zhí)行。

3.cyclicbarrier:一組線(xiàn)程等待某個(gè)狀態(tài)后,一起執(zhí)行。

17.Threadlocal:

threadlocal提供了線(xiàn)程的局部變量。即相同的變量由每一個(gè)線(xiàn)程單獨(dú)維護(hù)。和synchronized相似避免了多個(gè)線(xiàn)程訪問(wèn)相同的變量是,造成的訪問(wèn)沖突。

synchronized犧牲了時(shí)間來(lái)保證變量訪問(wèn)的沖突。

threadlocal因?yàn)槊恳粋€(gè)線(xiàn)程都有單獨(dú)的局部變量,所以犧牲了空間來(lái)保證變量訪問(wèn)的沖突。

使用方法:new一個(gè)threadlocal對(duì)象后,調(diào)用get和set方法即可。

18.可重入鎖和不可重入鎖:

可重入鎖:線(xiàn)程可以拿到自己鎖定的對(duì)象,但解鎖的時(shí)候,鎖定幾次就需要解鎖幾次。

不可重入鎖:線(xiàn)程不能拿到自己鎖定的對(duì)象,會(huì)發(fā)生阻塞。

19.同步容器和并發(fā)容器:

同步容器:victor,hashtable.

并發(fā)容器:currenthashmap

20.多線(xiàn)程的優(yōu)點(diǎn)和缺點(diǎn):

多線(xiàn)程優(yōu)點(diǎn):提高資源利用率,提升程序的執(zhí)行效率。

多線(xiàn)程缺點(diǎn):創(chuàng)建和銷(xiāo)毀線(xiàn)程浪費(fèi)資源,線(xiàn)程間的切換同樣浪費(fèi)資源。

21.線(xiàn)程池的優(yōu)點(diǎn):

1.減少了線(xiàn)程的創(chuàng)建和銷(xiāo)毀,節(jié)約資源。

2.避免高訪問(wèn)量是,創(chuàng)建大量的線(xiàn)程,造成資源不足。

22.線(xiàn)程池核心參數(shù):

核心線(xiàn)程數(shù):線(xiàn)程池創(chuàng)建時(shí)創(chuàng)建的線(xiàn)程數(shù),這些線(xiàn)程不會(huì)被銷(xiāo)毀。

最大線(xiàn)程數(shù):線(xiàn)程池所能創(chuàng)建的最大線(xiàn)程數(shù)。

阻塞隊(duì)列:核心線(xiàn)程滿(mǎn)后,多余的請(qǐng)求放在阻塞隊(duì)列中。

空閑線(xiàn)程存活時(shí)間:核心線(xiàn)程和阻塞隊(duì)列滿(mǎn)后,額外創(chuàng)建的線(xiàn)程存活的時(shí)間。

handle:當(dāng)最大線(xiàn)程數(shù)也滿(mǎn)了的時(shí)候,所采取的策略。(1.直接拋異常,2.誰(shuí)提交誰(shuí)執(zhí)行,3.拋棄隊(duì)列中等待的任務(wù),4.拋棄當(dāng)前任務(wù))

23.常用的4個(gè)線(xiàn)程池:

1.newCachedThreadPool:核心線(xiàn)程數(shù)為0。有新任務(wù)時(shí),會(huì)自動(dòng)創(chuàng)建線(xiàn)程。

2.newFixedThreadPool :核心線(xiàn)程數(shù)和最大線(xiàn)程數(shù)相同,即最多創(chuàng)建的線(xiàn)程數(shù)就是核心線(xiàn)程數(shù)。多余的線(xiàn)程交給隊(duì)列。

3.newSingleThreadExecutor :線(xiàn)程數(shù)量始終只有一個(gè),保證了隊(duì)列的先進(jìn)先出。

4.newScheduledThreadPool:支持定時(shí)或周期性的任務(wù)。

23.并發(fā)編程常見(jiàn)的三個(gè)問(wèn)題:

1.可見(jiàn)性:

當(dāng)一個(gè)線(xiàn)程對(duì)共享變量的值進(jìn)行修改后,其他的線(xiàn)程無(wú)法立即查看更新的值。

2.原子性:

當(dāng)一個(gè)線(xiàn)程對(duì)共享變量操作到一半時(shí),另外的線(xiàn)程也可能操作該變量,干擾了前一個(gè)線(xiàn)程的執(zhí)行,例如i++;

3.有序性:

程序中代碼的執(zhí)行順序,并不一定是按照開(kāi)發(fā)者編寫(xiě)的代碼的順序。

java常用synchronized關(guān)鍵字來(lái)保證這三大特性。

24.java內(nèi)存模型:

java內(nèi)存模型是一套規(guī)范,描述了共享變量的訪問(wèn)規(guī)則,java內(nèi)存模型是對(duì)共享數(shù)據(jù)的可見(jiàn)性,原子性,有序性的規(guī)則和保障。

25.synchronized的特性:

1.可重入特性:一個(gè)線(xiàn)程可以重復(fù)進(jìn)入synchronized,重復(fù)獲取同一把鎖。原理是內(nèi)部有一個(gè)計(jì)數(shù)器會(huì)記錄獲取幾次數(shù)。

2.不可中斷特性:一個(gè)線(xiàn)程獲取鎖后,另一個(gè)線(xiàn)程想要獲取鎖,必須等待,如果第一個(gè)線(xiàn)程不釋放鎖,第二個(gè)線(xiàn)程會(huì)一直等待。

26.CAS:

CAS:compare and Swap,比較相同再交換。CAS可以保證共享變量賦值時(shí)的原子操作。當(dāng)多個(gè)線(xiàn)程cas更新同一個(gè)變量時(shí),只有一個(gè)能成功,其他的全部失敗,失敗的線(xiàn)程可以再次嘗試更新。CAS屬于樂(lè)觀鎖,即每次拿數(shù)據(jù)都認(rèn)為不會(huì)修改,有人修改了就重試。

舊值和內(nèi)存中的值和新值:比較內(nèi)存中的值和舊值是否相同,相同則替換成新值。

ABA問(wèn)題:線(xiàn)程一從內(nèi)存中取出變量A,線(xiàn)程二同樣從內(nèi)存中取出A,并將A的值替換成B之后,又重新賦值為A,此時(shí)線(xiàn)程一再?gòu)膬?nèi)存中拿到變量A,發(fā)現(xiàn)沒(méi)變化,誤認(rèn)為還是原來(lái)的A,操作成功。例如別人挪用資金后,趁你沒(méi)發(fā)現(xiàn)又還了回來(lái),表面上沒(méi)影響,實(shí)際可能出現(xiàn)大問(wèn)題。解決方式是使用AtomicStampedReference類(lèi)來(lái)解決,具體就是加版本號(hào),每操作一次就加上版本號(hào)。

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

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