java線程面試題(第一版本,最全版)

這兩天也在找工作,抱著試試的心態,但是儘管是試試,還是應該認真,就昨天下午A廠的人瞭解情況,問了我一些基礎題目,感覺回答的不好,因此準備花上一個月或者兩個月的時間,把一些常見的面試題整理下來,答案給出一部分。

若有不全的或者是需要補充的,可以在評論區給出,我會繼續完善不斷髮布最新的。

一、線程基礎

1、什麼是線程?什麼是進程?他們之間有什麼區別?線程的好處和壞處?(壞處從單核CPU上下文切換帶來系統損耗來解答)

2、Java中實現線程有那幾種方式?區別是什麼?(三種或者四種,根據繼承和接口特點區別)

3、Thread類中的start和run方法的區別?(start方法內部含有native的start0,官方文檔解釋start0內部調用了run方法)

4、守護線程和非守護線程的區別?(服務員服務顧客的例子)

5、為什麼wait, notify 和 notifyAll這些方法不在thread類裡面?(這些操作都是鎖級別操作,每個對象都有鎖,所以定義在對象中)

6、Java中什麼是競態條件? 舉個例子說明。(兩個線程競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件,導致競態條件發生的代碼區稱作臨界區。在臨界區中使用適當的同步鎖就可以避免競態條件)

7、Java中如何停止一個線程?(從jdk1.0的stop、suspend、resume被遺棄說起,再到自然停止線程,或者使用volatile+boolean變量手動停止線程)。

8、sleep和wait的區別?

(四個:1、sleep是線程中的方法,但是wait是Object中的方法。

​ 2、sleep方法不會釋放lock,但是wait會釋放,而且會加入到等待隊列中。

​ 3、sleep方法不依賴於同步器synchronized,但是wait需要依賴synchronized關鍵字。

​ 4、sleep不需要被喚醒(休眠之後推出阻塞),但是wait需要(不指定時間需要被別人中斷)。)

9、Java中interrupted 和 isInterruptedd方法的區別?(主要區別是前者會將中斷狀態清除而後者不會)

10、如何在兩個線程間共享數據?(根據多個線程的代碼是否相同判斷是否使用同一個Runnable對象)

11、java的內存模型?(首先說出和內存結構的區別、然後是為什麼需要內存模型(從計算機發展的角度來看逐步過渡到原子性、可見性、有序性),最後就是java內存模型如何解決上面三個問題);

12、有三個線程T1,T2,T3,怎麼確保它們按順序執行?(多個方法,常見的join極其機制)

13、Thread類中的yield方法有什麼作用?(作用是暫停當前正在執行的線程對象,讓其它有相同優先級的線程執行,靜態方法,只是可能性,不能保證確定性)

14、多線程中的忙循環是什麼?(忙循環就是程序員用循環讓一個線程等待,不像傳統方法wait(), sleep() 或 yield() 它們都放棄了CPU控制,而忙循環不會放棄CPU,它就是在運行一個空循環。這麼做的目的是為了保留CPU緩存,在多核系統中,一個等待線程醒來的時候可能會在另一個內核運行,這樣會重建緩存。為了避免重建緩存和減少等待重建的時間就可以使用它了。)

線程基礎知識主要是線程相關的一些概念和api進行理解。

二、線程池

1、為什麼要使用線程池?(反過來說,創建銷燬線程的代價太高,再正過來說線程池的好處)

2、線程池有什麼用?(提高效率、方便管理)

3、使用過哪些線程池?有什麼使用場景?(newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool、newScheduledThreadPool,newWorkStealingPool)

4、線程池的七個參數的作用

<code>int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler/<runnable>/<code>

5、線程池的工作隊列(ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue)

6、線程池的拒絕策略?(三種AbortPolicyDiscardPolicyDiscardOldestPolicy

7、 execute和submit的區別?(execute適用於不需要關注返回值的場景,只需要將線程丟到線程池中去執行就可以,submit方法適用於需要關注返回值的場景)

8、如何終止線程池?(shutdownNow:對正在執行的任務停止,shutdown:只是不接受新任務)

三、鎖系列

1、synchronized的作用、使用、底層原理、常見缺陷?

(從同步角度看作用,從對象鎖和類鎖角度看使用,可重入性和不可中斷性看性質,從反編譯字節碼的角度看底層原理包含了監控器monitor,缺點是效率低、不夠靈活、不知道是否獲得了鎖。)

2、volatile關鍵字的作用?(保證可見性有序性,不保證原子性,非線程安全,)

3、什麼是活鎖、飢餓、無鎖、死鎖?(死鎖是相互佔據對方的資源又不釋放、活鎖是主動釋放自己的資源而不使用、飢餓是優先級高的線程一直佔據資源,)

4、什麼是CAS?(AtomicInteger底層實現,從A,V,B三個角度看,可以從你媽預期你女朋友A,你現在女朋友V,你媽如果看到A==V,那就讓你娶B。)

5、什麼是AQS?(AQS是一個用來構建鎖和同步器的框架,使用AQS能簡單且高效地構造出應用廣泛的大量的同步器,比如我們提到的ReentrantLock,Semaphore,其他的諸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基於AQS的,

AQS核心思想是,如果被請求的共享資源空閒,則將當前請求資源的線程設置為有效的工作線程,並且將共享資源設置為鎖定狀態。如果被請求的共享資源被佔用,那麼就需要一套線程阻塞等待以及被喚醒時鎖分配的機制,這個機制AQS是用CLH隊列鎖實現的,即將暫時獲取不到鎖的線程加入到隊列中。使用了獨佔式和共享式,底層使用了模板方法模式)

6、什麼是樂觀鎖,什麼是悲觀鎖?有什麼區別?

(悲觀鎖總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,關係型數據庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。Java中synchronized和ReentrantLock等獨佔鎖就是悲觀鎖思想的實現。

樂觀鎖是每次去拿數據的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號機制和CAS算法實現。atomic

四、線程工具類

1、ThreadLocal是什麼?有什麼用?

ThreadLocal是一個本地線程副本變量工具類。主要用於將私有線程和該線程存放的副本對象做一個映射,各個線程之間的變量互不干擾,在高併發場景下,可以實現無狀態的調用,特別適用於各個線程依賴不通的變量值完成操作的場景。ThreadLocal就是一種以空間換時間的做法,在每個Thread裡面維護了一個以開地址法實現的ThreadLocal.ThreadLocalMap,把數據進行隔離,數據不共享,自然就沒有線程安全方面的問題了。

2、Semaphore有什麼作用

Semaphore就是一個信號量,它的作用是限制某段代碼塊的併發數。Semaphore有一個構造函數,可以傳入一個int型整數n,表示某段代碼最多隻有n個線程可以訪問,如果超出了n,那麼請等待,等到某個線程執行完畢這段代碼塊,下一個線程再進入。

3、CountDownLatch?(類似於計數器的方式,用於等待一個或多個線程執行完操作開始自身代碼的執行。)

4、CyclicBarrier?(CyclicBarrier即同步屏障,它主要功能是讓一組線程達到一個屏障(也可以稱為同步點)是被阻塞,直到最後一個線程達到屏障是,屏障才被打開,所有被攔截的線程才會繼續執行)

5、Exchanger?(用於線程間的協作工具類,主要用於線程間數據的交換。它提供了一個同步點,在這個同步點,兩個線程可以交換彼此的數據)

6、 CyclicBarrier和CountDownLatch的區別?(二者的區別在於:

(1)CyclicBarrier的某個線程運行到某個點上之後,該線程即停止運行,直到所有的線程都到達了這個點,所有線程才重新運行;CountDownLatch則不是,某線程運行到某個點上之後,該線程會繼續運行。

(2)CyclicBarrier只能喚起一個任務,CountDownLatch可以喚起多個任務。

(3)CyclicBarrier可重用,CountDownLatch不可重用,計數值為0該CountDownLatch就不可再用了)

線程集合將和java中的類集合一塊討論。如有不完善的地方還請補充。


分享到:


相關文章: