2.java集合,線程面試題(已實踐,目前已找到工作)

1線程的創建方式

  • 繼承Thread類
  • 實現Runnable接口
  • 實現Callable接口

2.這三種方式在項目中的使用有哪些,一般都是怎么用的

  1. 繼承thread類實現線程的方式通過實現run方法來實現線程,通過run進行線程的啟用
  2. 實現runnable方法實現run方法,然后通過thread類包裝并啟用
  3. 實現callable方法里的call方法,再由thread啟動

3.他們各自的優缺點

  1. thread:實現簡單,代碼簡潔,可以直接調用Thread類的方法,缺點是:單繼承限制,靈活性較低,且沒有返回值,無法獲取線程的執行結果
  2. runnable:避免了單繼承的限制,靈活性更高了,多個線程可以共享一個runnable,適合多線程操作共享資源,且runnable是一個函數接口,內存的開銷更小,缺點:無返回值,異常都是在方法內部拋出,代碼必須通過thread實現,代碼不太友好
  3. callable:callable有返回值,外部可以通過future.get()獲取異常,和runnable無單繼承的限制,多個callable可以共享資源,缺點:使用復雜,需要通過futureTask或者線程池啟動,用futureTak.get()方法會阻塞當前線程,直到線程結束,如果使用不當會導致性能問題,

4.技術的選型,三種分別應該怎么選

  • 簡單任務且無需返回結果:優先用Runnable(避免單繼承限制)。
  • 需要返回結果或處理異常:必須用Callable。
  • 極少情況下(如無需繼承其他類且邏輯簡單)才用繼承Thread類。

5.線程池有哪些參數?

5個核心參數:核心線程數,最大線程數,空閑線程存活時間,阻塞任務隊列,拒絕策略
線程存貨時間單位,線程工廠

6.線程池的使用步驟

  1. 創建線程池對象,
  2. 實現線程
  3. 提交任務到線程池
  4. 關閉線程池

7.線程池有哪幾種?它們分別對應什么隊列?

  1. 固定大小線程池(核心線程數=最大線程數,空閑線程存活時間為0)=》無界隊列
    特點:線程數量固定,不會動態增減,任務隊列無界可以無限接收任務(可能OOM
  2. 單線程化線程池(核心線程數=最大線程數=1,空閑存活線程時間為0)=》無界隊列
  3. 可緩存線程池=》同步隊列
  4. 定時任務線程池=》延遲隊列
  5. 單線程定時任務線程池=》延遲隊列

無界隊列:隊列的容量沒有上限,可以一直添加任務(注意若任務提交速度遠快于處理速度,隊列會無限膨脹,可能導致內存溢出(OOM))
同步隊列:不存儲任何任務,生產即消費,
延遲隊列:隊列任務中任務按照延遲時間排序,只有當任務的延遲時間到期后才能被取出執行,

8.什么時候觸發最大線程條件?

核心線程全忙,隊列全滿,且最大線程數全滿(無界隊列不會觸發最大線程)

9.線程池拒絕策略有哪些?默認是哪個?

  1. AbortPolicy(默認,拋出RejectedExecutionException異常,適用場景:不允許任務丟失,需要明確感知到任務提交失敗的場景
  2. CallerRunsPolicy(讓提交的線程自己執行改任務,而非線程池中的線程執行,適用場景:需要減緩任務提交的速度,起到自我限流的作用
  3. discardpolicy:默認丟棄新提交的任務,不拋異常,也不做任何處理,適用日志,非關鍵數據的統計上報
  4. discardOldestPolicy:丟棄隊列中最舊的數據,騰出位置給新提交的任務,適用實時數據處理任務

10.什么是線程安全

解決共享資源的并發訪問沖突,常見的手段是關鍵字synchronized,和加鎖

11.如何判斷一個類是否線程安全?

  1. 共享資源的并發訪問沖突,
  2. 看線程是否有共享的資源(資源滿足原子性,可見性,有序性則為線程安全),是否是共享的狀態(有共享狀態且持有成員變量,且這個變量可能被多個線程讀寫,則線程不安全)

12.線程不安全的根源是什么?請舉例說明。

  1. 共享資源的非原子操作,具體來說就是,當共享資源被分為讀取,修改,寫入,三個操作不是原子性的時候,就有可能中間狀態被其他線程修改導致數據不一致
  2. 例如ArrayList就是線程不安全的:底層是elementData動態數組,當執行add(),remove()方法的時候不是原子性的

13.線程安全的三大特性(原子性、可見性、有序性)分別指什么?

原子性:操作不可拆分,要么全部執行,要么全部不執行
可見性:一個線程修改共享資源后,其他線程可以立即看見最新的值
有序性:程序執行順序符合預期(為提高性能jvm,cpu會對指令重排,在多線程環境下會影響線程之間的邏輯

14.ArrayList是否線程安全

底層是elementData動態數組,當執行add(),remove()方法的時候不是原子性的

add方法=》檢查容量-擴容-元素賦值
remove方法=》查找元素-移動后續元素填補空位-修改size

15.使用什么集合可以做到線程安全

  1. 線程安全的用Vector,使用synchronized修改,線程安全了,但是性能低于ArrayList(盡量不用
  2. 使用collection.synchronizedList()將ArrayList包裝為線程安全的集合(簡單場景且并發量低的情況下使用)
  3. CopyOnWriteArrayList,是juc并發包提供的線程安全集合,當進行修改的操作的時候,會創建底層的數據副本,修改完成后再替換原數組,讀操作無需加鎖(適合讀多寫少的情況)

16.如何線程安全地操作ArrayList

  1. 使用collections.synchronizedList()包裝修飾
  2. 使用copyonwriteArrayList()適合讀多寫少的情況,原理是采用讀寫分離,寫操作有數組復制的開銷,會造成內存占用的增加

17.ArrayList擴容機制

擴容依賴于兩個變量,elementData,size,是按需擴容
當調用add()方法的時候添加元素的時候,初始elementData為空則會觸發擴容,新容量為10,DEFAULT_CAPACITY默認值,然后每次到達上限的時候,擴充當前的1.5倍

18.HashMap、TreeMap、LinkedHashMap的區別?

hashMap:基于數組+鏈表/紅黑樹實現,無序插入,鍵可以允許插入null且只能一個;
treeMap:基于紅黑樹實現,按照鍵的自然順序或者自定義比較器排序,鍵不允許為null
linkedMap:基于哈希表+雙向鏈表實現,在hashMap的基礎上通過雙向鏈表記錄元素順序,即保留了hash表的查詢效率又保證了有序性,鍵允許為null

19.什么是紅黑樹

是一種簡單的自平衡二叉樹,通過一套規則進行保證樹的平衡,從而讓各種操作都能更高效的,

兩個核心特點:

  1. 節點非黑即紅且根節點必須是黑色的,
  2. 從任意節點到葉子的所有路徑黑色節點數量相等

20.他們各自適用的場景

hashmap:追求查詢和修改的高效性,且不關心元素順序(緩存,快速查詢)
treeMap:需要對鍵進行排序或者范圍查詢(排行榜,區間統計場景)
linkedHashMap:需要保留插入順序(日志記錄),需要實現LRU緩存(緩存淘汰策略)

21.HashMap數據結構、哈希沖突解決方法

數據結構是基于數組+鏈表/紅黑樹實現,
當多個鍵哈希到同一個桶的時候會鏈表的形式存儲這些鍵值對(解決哈希沖突
當鏈表過長時默認長度>8自動轉為紅黑樹,當紅黑樹的節點數少于6的時候會自動轉為鏈表

22.什么是哈希算法

把任意長度的輸入通過散列算法變為固定長度的輸出,hash表又是散列表

23.HashMap為什么線程不安全?如何線程安全地操作?

并發操作時可能導致數據不一致或結構破壞
hashmap多個線程同時進行put操作的會出現數據覆蓋的情況,導致數據的丟失

想要安全的操作線程可以使用concourrentHashMap,或者使用手動加鎖,collection.synchronizedMap, 手動加鎖并發效率低,會有性能問題,concurrentHashMap則是轉為高并發設計的

24.HashMap擴容的原理

判斷是否擴容的依據是元素數量>=閾值
分為兩個階段
1.計算新容量
2.遷移元素

25.Shiro怎么根據url對應權限,流程是什么?

1.請求攔截
2.匹配URL對的權限規則
3.檢驗用戶是否有該權限(通過dogetAuthorizationInfo獲取)
4.允許或者拒絕訪問

26.怎么結合redis存儲權限,提高性能的

一:
1.緩存用戶的所有權限,避免每次權限校驗的時候都查詢數據庫
2.緩存url與對應權限的對應關系,減少動態解析URL規則開銷
3.緩存角色與權限的映射關系,加速權限繼承關系的計算

27.session存放在哪里?

1.shiro默認把session存放在jvm中,— 缺點是集群環境下會話不共享,節點切換的時候需要重新登錄
重啟后session丟失,用戶需要重新登錄
內存容量有限用戶過多的情況下會oom
2.采用redis存儲,好處解決了會話共享和持久化,

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94437.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94437.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94437.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

站在前端的角度,看鴻蒙頁面布局

從Web前端轉向鴻蒙(HarmonyOS)開發時,理解其頁面布局的相似與差異是快速上手的核心。鴻蒙的ArkUI框架在布局理念上與Web前端有諸多相通之處,但也存在關鍵區別。以下從五個維度系統分析: 📦 一、盒子模型&a…

JavaWeb遺傳算法、TSP、模擬退火、ACO算法等實戰應用

Java Web中實現遺傳算法的應用 以下是關于Java Web中實現遺傳算法的應用場景和實例的整理,涵蓋不同領域的解決方案和實現方法: 遺傳算法基礎結構 在Java Web中實現遺傳算法通常需要以下核心組件: 種群初始化:隨機生成初始解集。 適應度函數:評估個體優劣。 選擇操作:輪…

【圖像算法 - 09】基于深度學習的煙霧檢測:從算法原理到工程實現,完整實戰指南

一、項目背景與需求 視頻介紹 【圖像算法 - 09】基于深度學習的煙霧檢測:從算法原理到工程實現,完整實戰指南今天我們使用深度學習來訓練一個煙霧明火檢測系統。這次我們使用了大概一萬五千張圖片的數據集訓練了這次的基于深度學習的煙霧明火檢測模型&a…

間接制冷技術概念及特征

1、基本概念 (1)間接制冷技術即二次制冷技術。常規做法:二次冷卻液儲液罐增加放置于制冷系統管路,促使冷量再快捷的傳遞給載冷劑,繼而載冷劑冷量促使冷庫達到制冷效果。間接制冷技術:通過常壓的二次冷卻介質進行大循環傳送冷量,在直接制冷劑不易應用的位置或者不可運用直…

Antlr學習筆記 01、maven配置Antlr4插件案例Demo

文章目錄前言源碼插件描述pom引入插件案例:實現hello 標識符 案例1、引入Antlr4的pom運行依賴2、定義語義語法,配置.g4文件實現java代碼3、編寫完之后,執行命令實現編譯4、編寫單測測試使用參考文章資料獲取前言 博主介紹:?目前…

PostGIS面試題及詳細答案120道之 (101-110 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

第十七天:原碼、反碼、補碼與位運算

原碼、反碼、補碼與位運算 一、原碼、反碼、補碼 1、原碼 定義:原碼是一種簡單的機器數表示法。對于一個有符號整數,最高位為符號位, 0 表示正數, 1 表示負數,其余位表示數值的絕對值。示例:以 8 位二進制…

一次完整的 Docker 啟動失敗排錯之旅:從 `start-limit` 到 `network not found

一次完整的 Docker 啟動失敗排錯之旅:從 start-limit 到 network not found 你是否也曾自信地敲下 sudo systemctl start docker,卻只得到一個冰冷的 failed?這是一個開發者和運維工程師都可能遇到的場景。本文將通過一個真實的排錯案例&…

Tdengine 時序庫年月日小時分組匯總問題

年月分組select to_char(collection_time ,"yyyy-mm") AS date, cast(SUM(a.stage_value)as DOUBLE) as stage_value from TABLE GROUP BY date年月日分組select to_char(collection_time ,"yyyy-mm-dd") AS date, SUM(a.stage_value)as DOUBLE) as stage_…

數據結構(01)—— 數據結構的基本概念

408前置學習C語言基礎也可以看如下專欄:打怪升級之路——C語言之路_ankleless的博客-CSDN博客 目錄 1. 基本概念 1.1 數據 1.2 數據元素 1.3 數據項 1.4 組合項 1.5 數據對象 1.6 數據類型 2. 數據結構 2.1 邏輯結構 2.2 存儲結構 2.3 數據的運算 在學…

什么是模型并行?

模型并行c 簡單來說,就是把一個模型拆開來放到多個 GPU 上,一起訓練,從而化解“顯存塞不下模型”的問題!更多專業課程內容可以聽取工信部電子標準院《人工智能大模型應用工程師》課程獲得詳解!

跑yolov5的train.py時,ImportError: Failed to initialize: Bad git executable.

遇到的問題&#xff1a; Traceback (most recent call last):File "D:\miniconda\envs\yolov5\lib\site-packages\git\__init__.py", line 296, in <module>refresh()File "D:\miniconda\envs\yolov5\lib\site-packages\git\__init__.py", line 287…

TCP如何實現可靠傳輸?實現細節?

TCP如何實現可靠傳輸&#xff1f;實現細節&#xff1f;如何實現可靠傳輸&#xff1f;擁塞控制的主要機制TCP流量控制怎么實現的&#xff1f;如何實現可靠傳輸&#xff1f; TCP通過自身的序列號、確認應答、數據效驗、超時重傳、流量控制、擁塞避免&#xff0c;確保了數據傳輸的…

Linux 服務器性能監控、分析與優化全指南

Linux 服務器性能監控、分析與優化在現代 IT 架構中&#xff0c;Linux 服務器作為承載業務系統的核心載體&#xff0c;其性能表現直接決定了服務的穩定性、響應速度與用戶體驗。無論是高并發的 Web 服務、數據密集型的數據庫集群&#xff0c;還是承載虛擬化平臺的宿主機&#x…

基于wenet和模型做企業直播敏感語音屏蔽技術

本文介紹了基于Wenet語音識別工具包的實時敏感詞屏蔽技術方案。該方案通過客戶端緩存25秒直播內容&#xff0c;利用Wenet的流式識別和斷句檢測功能&#xff0c;實時檢測講師語音中的敏感詞&#xff0c;并將對應位置的語音替換為"嗶"聲。文章詳細闡述了Wenet的兩種識別…

42.MySQL視圖

1.一個需求emp 表的列信息很多&#xff0c;有些信息是個人重要信息 (比如 sal, comm, mgr, hiredate)&#xff0c;如果我們希望某個用戶只能查詢 emp 表的 (empno、ename, job 和 deptno ) 信息&#xff0c;有什么辦法&#xff1f;表的數據&#xff1a;想讓用戶查詢到的&#x…

MinIO01-入門

零、文章目錄 MinIO01-入門 1、介紹 &#xff08;1&#xff09;介紹 MinIO 是一款基于 Apache License v2.0 的開源對象存儲系統&#xff0c;專為海量非結構化數據&#xff08;如圖片、視頻、日志文件等&#xff09;設計&#xff0c;兼容 Amazon S3 API&#xff0c;支持高性…

*Docker數據卷(Volume)核心機制剖析:持久化與共享的終極解決方案

根本問題當容器被刪除時&#xff0c;其內部產生的所有文件&#xff08;包括配置文件、數據庫、日志&#xff09;都會不可逆丟失。數據卷&#xff08;Volume&#xff09;通過外置存儲方案徹底解決此痛點。一、數據卷與普通容器存儲對比實驗 場景1&#xff1a;無卷模式下的寫入悲…

原型模式在C++中的實現與面向對象設計原則

引言 在軟件開發中&#xff0c;原型模式是一種常用的設計模式&#xff0c;主要用于創建對象的克隆。通過原型模式&#xff0c;我們可以避免復雜的對象創建過程&#xff0c;尤其是當對象的初始化需要大量資源或復雜操作時。本文將通過一個具體的例子&#xff0c;詳細介紹如何在C…

SpringCloud學習------Gateway詳解

在微服務架構中&#xff0c;隨著服務數量的激增&#xff0c;如何統一管理服務入口、實現請求路由、保障服務安全等問題日益突出。SpringCloud Gateway 作為 Spring 官方推出的網關組件&#xff0c;憑借其強大的功Gateway 是 Spring 官方基于 Spring、SpringBoot 和 Project Rea…