首頁 > Java > Java面試題 > 主體

常見的14個網路Java面試題

(*-*)浩
發布: 2019-11-15 16:31:28
原創
2419 人瀏覽過

常見的14個網路Java面試題

1.synchronized 和reentrantlock 異同

相同點

#都實作了多執行緒同步和記憶體可見性語義,都是可重入鎖定

不同點

實作機制不同synchronized 透過java 物件頭鎖標記和Monitor物件實作reentrantlock 透過CAS、ASQ(AbstractQueuedSynchronizer)和locksupport(用於阻塞和解除阻塞)實作synchronized 依賴jvm 記憶體模型保證包含共享變數的多執行緒記憶體可見性reentrantlock 透過ASQ 的volatile state 保證包含共享變數的多執行緒記憶體可見性reentrantlock 透過ASQ 的volatile state 保證包含共享變數的多執行緒記憶體可見性

使用方式不同synchronized 可以修飾實例方法(鎖住實例物件)、靜態方法(鎖住類別物件)、程式碼區塊(顯示指定鎖定物件)reentrantlock 顯示呼叫trylock()/lock()方法,需要在finally 區塊中釋放鎖功能豐富程度不同reentrantlock

提供有限時間等候鎖(設定過期時間)、可中斷鎖(lockInterruptibly)、condition(提供await、signal等方法)等豐富語義reentrantlock 提供公平鎖定和非公平鎖定實作synchronized不可設定等待時間、不可被中斷(interrupted)

2. concurrenthashmap 為何讀取不用加鎖

jdk1.7

1)HashEntry 中的key、hash、next 皆為final 型,只能表頭插入、刪除結點

2)HashEntry 類別的value 域被宣告為volatile 類型

3)不允許用null 作為鍵和值,當讀取線程讀到某個HashEntry 的value 域的值為null時,便知道產生了衝突-發生了重排序現象(put 設定新value 對象的字節碼指令重新排序),需要加鎖後重新讀入這個value 值

4)volatile 變數count 協調讀寫線程之間的記憶體可見性,寫入操作後修改count,讀操作先讀count,根據happen-before 傳遞性原則寫操作的修改讀操作能夠看到

jdk1.8

1)Node 的val 和next 均為volatile 類型

2)tabAt 和casTabAt 對應的unsafe 操作實現了volatile 語義

3. ContextClassLoader(線程上下文類別載入器)的作用

#越過類別載入器的雙親委派機制去載入類,如serviceloader 實作使用執行緒上下文類別載入器載入類,要注意保證多個需要通訊的執行緒間的類別載入器應該是同一個,防止因為不同的類別載入器導致類型轉換異常(ClassCastException )

4. tomcat 類別載入機制

不同應用程式使用不同的webapp 類別載入器,實作應用隔離的效果,webapp 類別載入器下面是jsp類別加載器;不同應用共享的jar 套件可以放到Shared 類別載入器/shared 目錄下

5. osgi 類別載入機制

osgi 類別載入模型是網狀的,可以在模組(Bundle)間互相委託

osgi 實現模組化熱部署的關鍵是自訂類別載入器機制的實現,每個Bundle 都有一個自己的類別載入器,當需要更換一個Bundle時,就把Bundle 連同類別載入器一起換掉以實現程式碼的熱替換

當收到類別載入請求時,osgi 將按照下面的順序進行類別搜尋:

# 1)將以java.* 開頭的類別委派給父類別載入器載入

2)否則,將委派清單名單(設定檔org.osgi.framework.bootdelegation 中定義)內的類別委派給父類別載入器載入

3)否則,檢查是否在Import-Package 中聲明,如果是,則委派給Export 這個類別的Bundle 的類別載入器載入

4)否則,檢查是否在Require-Bundle 中聲明,如果是,則將類別載入請求委託給required bundle 的類別載入器

5)否則,請尋找目前Bundle 的ClassPath,使用自己的類別載入器載入

6)否則,查找類別是否在自己的Fragment Bundle 中,如果在,則委派給Fragment Bundle 的類別載入器載入

7)否則,查找Dynamic Import-Package(Dynamic Import 只有在真正用到此Package的時候才進行載入)的Bundle,委派給對應Bundle 的類別載入器載入

8)否則,類別尋找失敗

##6. 如何結束一個一直運行的執行緒

使用退出標誌,這個flag 變數要多執行緒可見

#使用interrupt,結合isInterrupted() 使用

7.threadlocal使用場景及問題

threadlocal 並不能解決多執行緒共享變數的問題,同一個threadlocal 所包含的對象,在不同的thread中有不同的副本,互不干擾

#用於存放線程上下文變量,方便同一線程對變量的前後多次讀取,如事務、數據庫connection 連接,在web 編程中使用的更多

問題: 注意線程池場景使用threadlocal,因為實際變數值存放在了thread 的threadlocalmap類型變數中,如果該值沒有remove,也沒有先set 的話,可能會得到先前的舊值

問題: 注意線程池場景下的記憶體洩露,雖然threadlocal 的get/set 會清除key(key 為threadlocal的弱引用,value 是強引用,導致value 不釋放)為null 的entry,但是最好remove

8. 當執行緒池從啟動到工作的流程

剛建立時,裡面沒有執行緒呼叫execute() 新增任務時:

1 )如果正在執行的執行緒數量小於核心參數corePoolSize,繼續建立執行緒執行這個任務

2)否則,如果正在執行的執行緒數量大於或等於corePoolSize,將任務加入到阻塞佇列中

3)否則,如果佇列已滿,同時正在執行的執行緒數量小於核心參數maximumPoolSize,繼續建立執行緒執行這個任務

4)否則,如果佇列已滿,同時正在執行的執行緒數量大於或等於maximumPoolSize,根據設定的拒絕策略處理

5)完成一個任務,繼續取下一個任務處理

6)沒有任務繼續處理,線程被中斷或線程池被關閉時,執行緒退出執行,如果執行緒池被關閉,執行緒結束

7)否則,判斷執行緒池正在執行的執行緒數量是否大於核心執行緒數,如果是,執行緒結束,否則執行緒阻塞。因此執行緒池任務全部執行完成後,繼續留存的執行緒池大小為corePoolSize

#9.阻塞佇列BlockingQueue take 和poll 區別

#poll(time):取走BlockingQueue 裡排在首位的對象, 若不能立即取出,則可以等time參數規定的時間,取不到時返回null

take():取走BlockingQueue 裡排在首位的對象,若BlockingQueue 為空,阻塞直到BlockingQueue 有新的物件被加入

10. 如何從FutureTask 不阻塞取得結果

get(long timeout,TimeUnit unit),逾時則回傳

輪詢,先透過isDone()判斷是否結束,然後呼叫get()

11. blockingqueue 如果存放了比較關鍵的數據,系統宕機該如何處理

將佇列持久化,比較麻煩,需要將生產資料持久化到磁碟,持久化成功才返回,消費者執行緒從磁碟載入資料到記憶體阻塞佇列中,維護消費性offset,啟動時,根據消費性offset 從磁碟載入資料加入訊息佇列,保證訊息不遺失,產生序號,消費冪等,根據消費行程決定係統重啟後的生產狀態

12. NIO 與傳統I/O 的區別

節約線程,NIO 由原來的每個線程都需要阻塞讀寫變成了由單線程(即Selector)負責處理多個channel註冊(register)的興趣事件(SelectionKey)集合(底層借助操作系統提供的epoll()),netty bossgroup 處理accept 連接,workergroup 處理具體業務流程和數據讀寫NIO 提供非阻塞操作傳統I/O 以流的方式處理數據,而NIO 以區塊的方式處理數據,NIO 提供bytebuffer,分為堆內和堆外緩衝區,讀寫時均先放到該緩衝區中,然後由內核透過channel傳輸到對端,堆外緩衝區不走內核,提升了效能

13. list 中存放可重複字串,如何刪除某個字串

呼叫iterator 相關方法刪除倒刪,防止正序刪除導致的陣列重排,index 跳過陣列元素問題

14. 有哪些GC ROOTS(跟日常開發比較相關的是和此相關的記憶體外洩)

#所有Java 執行緒目前活躍的堆疊幀裡指向GC 堆裡的對象的引用,因此用不到的對象及時置null,提升內存回收效率

靜態變量引用的對象,因此減少靜態變量特別是靜態集合變數的大小,集合存放的物件會覆寫euqls()和hashcode(),防止持續成長

本地方法JNI 所引用的物件

方法區中的常數所引用的對象,因此減少在長字串上呼叫String.intern()

classloader 載入的class 對象,因此自訂classloader 無效時及時置null並且注意類別載入器載入物件之間的隔離jvm 裡的一些靜態資料結構裡指向GC 堆裡的物件的引用 

以上是常見的14個網路Java面試題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板