JAVA编程多线程面试常见知识点灵魂拷问(一)
1、對線程池的了解
ThreadPoolExcutor創(chuàng)建線程池,包含七個參數(shù)。七個參數(shù)分別是核心線程數(shù)、最大線程數(shù)、任務隊列、等待時間、時間單位、線程工廠、拒絕策略。
任務加入線程池算法流程,若加入線程池的任務數(shù)小于核心線程數(shù),則線程池繼續(xù)創(chuàng)建線程。當任務持續(xù)增加,線程池的任務數(shù)大于核心線程數(shù),則線程池會繼續(xù)創(chuàng)建線程處理任務。
首先判斷核心線程池是否已滿,若沒有線程池中線程數(shù)小于核心線程數(shù),則增加任務,繼續(xù)創(chuàng)建線程。若線程池中線程數(shù)已達到核心線程數(shù),則將新增任務加入等待隊列。
若等待隊列已滿,則新增線程數(shù),直至達到最大線程數(shù)。若繼續(xù)增加任務,則根據(jù)拒絕策略處理新增的任務。可以丟棄新增任務。
線程工廠一般寫入線程名,用于日志定位。
平常用Executors工具類創(chuàng)建單個線程池、調度線程池等,主要存在兩個問題。一是等待隊列無線大(Int的最大值),容易擠壓任務,造成內存溢出。二是創(chuàng)建線程無線大,也容易造成內存溢出。
2、線程的生命周期
線程的五種狀態(tài),包括創(chuàng)建、準備、運行、等待、死亡、阻塞。主要方法notify()、notifyall()、wait()、sleep()、run()等。
可通過實現(xiàn)Runnable接口或者繼承Thread類,當然還可以繼承Callable接口,這個接口可以返回異常信息。
通過線程池的submit方法,可以返回一個Future對象,可以獲取線程執(zhí)行結果。
3、對同步的了解
通過synchronized關鍵字實現(xiàn)同步。synchronized關鍵字具有原子性,能保證順序執(zhí)行,其余方法執(zhí)行需要獲取對應鎖才能繼續(xù)執(zhí)行。
常見的是在方法上加synchronized,實現(xiàn)同步方法。其實在非靜態(tài)方法上加synchronized,其實是對該實例的加鎖。
若是對靜態(tài)方法加synchronized,則是對該類加鎖。也可以創(chuàng)建一個Object對象,作為鎖。
synchronized可以作為同步方法,也可以作為同步代碼塊。經(jīng)常會問到同步方法和同步代碼塊的區(qū)別。同步代碼塊是通過monitorEntry和monitorExit兩個指令表示進入同步代碼塊和退出同步代碼塊。
而同步方法是通過ACC的標識位,代表進入同步方法。二者其實都是通過獲取對象監(jiān)視器的持有權限來執(zhí)行代碼。
Jdk1.6后,對底層同步進行了優(yōu)化,增加了很多鎖,提升了同步的處理效率。
4、volatile關鍵字的理解
volatile關鍵字的作用一是禁止指令重排,二是并發(fā)情況下數(shù)據(jù)的可見性。
并發(fā)的幾個特點包括原子性、可見性、有序性。synchronized關鍵字滿足三個特性,而volatile關鍵字只能滿足有序性和可見性。
Java內存模型,多個線程有本地內存,再從本地內存推送到主內存。volatile關鍵字能保證多個線程之間變量的可見性或者說一致性。
指令重排是指JVM可以在處理命令的時候可能會調整指令執(zhí)行順序,進行優(yōu)化處理。比如創(chuàng)建一個對象,包括三個步驟,一是開辟分配內存,二是初始化實例,三是指向實例的地址,三個步驟的順序可能會有調整。
5、JAVA內存模型
平常創(chuàng)建的實例分配到堆,其實大致是分為堆內存和棧內存。
線程私有區(qū)域以后程序計數(shù)器、本地方法棧、虛擬機棧,線程共享區(qū)域包括方法區(qū)、堆。
方法區(qū)主要把控類加載信息、靜態(tài)變量、常量等,堆則是實例存放的區(qū)域,所有創(chuàng)建的實例都會在這里分配內存。
程序計數(shù)器主要是保存方法運行的位置,也就是指令執(zhí)行的情況。多線程環(huán)境下,線程之間會進行切換,當下一個線程得到Cpu的調度時,需要知道上次執(zhí)行的情況。
本地方法棧則是一些其它語言實現(xiàn)的底層方法,虛擬機棧則是保存方法的變量等信息
6、AQS的了解
AbstractQueuedSynchronizer的縮寫AQS,類在java.util.concurrent.locks包下面。
AQS的核心思想是多個線程請求共享資源,分配不到鎖資源的線程進入隊列,按順序分配資源。常見應用場景包括信號量、CountDownLatch等。
信號量應用場景:線程池核心線程數(shù)100,同時請求共享資源,限制共享資源最大并發(fā)數(shù)為10。這個時候可以通過信號量控制并發(fā)數(shù),通過獲取鎖加一,釋放鎖減一,來控制資源分配。
CountDownLatch應用場景:一般用于統(tǒng)計,比如多個任務線程計算各個產(chǎn)品信息,最后需要匯總,這個時候可以通過CountDownLatch來實現(xiàn),可以阻塞主線程等待任務結束。
內容參考地址:多線程面試常見知識點靈魂拷問(一) - 歪棗網(wǎng)
http://blog.waizaowang.com/java/21.html
總結
以上是生活随笔為你收集整理的JAVA编程多线程面试常见知识点灵魂拷问(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第六周 Word目录和索引
- 下一篇: BCP utility in Sybas