主頁 > 後端開發 > JAVA那點破事,并發、IO模型、集合、執行緒池、死鎖、非阻塞、AQS...

JAVA那點破事,并發、IO模型、集合、執行緒池、死鎖、非阻塞、AQS...

2021-12-17 08:45:52 後端開發

微信搜索 【微觀技術】,關注這個不喜歡內卷的程式員,

精彩文章匯總 GitHub https://github.com/aalansehaiyang/technology-talk ,Star 12K ,匯總java生態圈常用技術框架、開源中間件,系統架構、資料庫、大公司架構案例、常用三方類別庫、專案管理、線上問題排查、個人成長、思考等知識

大家好,我是Tom哥~

關于Java面試,面試官一般喜歡問哪些問題?

本文對一些高頻問題做了匯總,為了便于大家查找問題,了解全貌,整理個目錄,我們可以快速全域了解關于 JAVA

圖片

接下來,我們逐條來看看每個問題及答案

JDK、JRE、JVM 三者有什么關系?

答案:

  • JDK(全稱 Java Development Kit),Java開發工具包,能獨立創建、編譯、運行程式,

JDK = JRE + java開發工具(javac.exe/java.exe/jar.exe)

  • JRE(全稱 Java Runtime Environment),能運行已編譯好的程式,但不能創建程式

JRE = JVM + java核心類別庫

  • JVM (全稱 Java Virtual Machine),java虛擬機,

java創建物件有哪些方式?

答案:

  • 1、new 創建物件

  • 2、反射機制創建物件

  • 3、通過clone方法

  • 4、序列化機制

== 和 equals 有什么區別?

答案:

  • == ,如果是基本資料型別,比較兩個值是否相等;如果是物件,比較兩個物件的參考是否相等,指向同一塊記憶體區域

  • equals,用于物件之間,比較兩個物件的值是否相等,

hashCode()的作用?

答案:生成哈希碼,int型別,用于確定該物件在哈希表中的索引位置,每個類中都包含這個方法,

String、StringBuffer、StringBuilder 有什么區別?

答案

  • 1、String,采用 final修飾,物件不可變,執行緒安全,如果對一個已經存在的String物件修改,會重新創建一個新物件,并把值放進去,

  • 2、StringBuffer,采用 synchronized 關鍵字修飾,執行緒安全

  • 3、StringBuilder,非執行緒安全,但效率會更高些,適用于單執行緒,

try-catch-finally,如catch中return了,還會執行finally嗎?

答案:當然啦,會在return之前執行,

行程和執行緒的區別?

答案:

  • 行程:是一個程式的執行流程,是系統進行資源分配和調度的基本單位,作用是程式能夠并發執行提高資源利用率,因為行程的創建、銷毀、切換產生大量的時間和空間的開銷,所以行程的數量不能太多

  • 執行緒:是比行程更小的能獨立運行的基本單位,他是行程的一個物體,可以減少程式并發執行時的時間和空間開銷,使得作業系統具有更好的并發性,多個執行緒可以共享行程的系統資源,執行緒基本不擁有系統資源,只有一些運行時必不可少的資源,比如程式計數器、暫存器和堆疊,行程則占有堆,

整理了一份大廠常考面試題,這份pdf包括 Java基礎、Java并發、JVM、MySQL、Redis、Spring、MyBatis、Kafka、設計模式等面試題,分享給大家,
下載地址:百度云鏈接:https://pan.baidu.com/s/1XHT4ppXTp430MEMW2D0-Bg 提取碼: s3ab

synchronized 的內部原理?

答案:java提供的原子性內置鎖,也被稱為監視器鎖,使用synchronized之后,會在編譯之后在同步的代碼塊前后加上monitorentermonitorexit位元組碼指令,依賴作業系統底層互斥鎖實作,實作原子性操作和解決共享變數的記憶體可?性問題,

內部處理程序(內部有兩個佇列waitSet和entryList,):

  • 1、當多個執行緒進入同步代碼塊時,首先進入entryList

  • 2、有一個執行緒獲取到monitor鎖后,就賦值給當前執行緒,并且計數器+1

  • 3、如果執行緒呼叫wait方法,將釋放鎖,當前執行緒置為null,計數器-1,同時進入waitSet等待被喚醒,呼叫notify或者notifyAll之后又會進入entryList競爭鎖

  • 4、如果執行緒執行完畢,同樣釋放鎖,計數器-1,當前執行緒置為null

圖片

synchronized 和 ReentrantLock 的區別?

答案:

  • ReentrantLock 實作了Lock介面,synchronized是系統關鍵字

  • ReentrantLock需要手動指定鎖范圍,synchronized 支持同步塊、同步方法

  • 都具有可重入性

  • 默認都是非公平鎖,但 ReentrantLock 還支持公平模式,但性能會急劇下降

  • ReentrantLock 需要顯示的獲取鎖、釋放鎖

  • ReentrantLock 支持多種方式獲取鎖,

  • lock():阻塞模式來獲取鎖

  • lockInterruptibly:阻塞式獲取鎖,支持中斷

  • tryLock():非阻塞模式嘗試獲取鎖

  • tryLock(long timeout, TimeUnit unit):同上,支持時間設定

  • ReentrantLock 可以同時系結多個Condition條件物件,

AQS (AbstractQueuedSynchronizer 抽象佇列同步器 )的原理?

答案:AQS內部維護一個state狀態位,嘗試加鎖的時候通過CAS(CompareAndSwap)修改值,如果成功設定為 1,并且把當前執行緒ID賦值,則代表加鎖成功,

一旦獲取到鎖,其他的執行緒將會被阻塞進入阻塞佇列自旋,獲得鎖的執行緒釋放鎖的時候將會喚醒阻塞佇列中的執行緒,釋放鎖的時候則會把state重新置為0,同時當前執行緒ID置為空,

CAS 有什么缺點?

答案:在多執行緒場景下,更新變數值被其他執行緒跑了個對沖,CAS會出現ABA問題,解決方式有很多,

  • 可以通過,自增版本號方式,永遠不會回退

  • Java中提供了 AtomicStampedReference,增加了標志欄位,更新時不光檢查值,還要檢查當前的標志是否等于預期標志,全部滿足條件才會更新

  • 更多內容,CAS原理分析,解決銀行轉賬ABA難題

Java 都用過哪些鎖?

答案:

  • 樂觀鎖、悲觀鎖

  • 分布式鎖

  • 獨占鎖、共享鎖

  • 互斥鎖

  • 讀寫鎖

  • 公平鎖、非公平鎖

  • 可重入鎖

  • 自旋鎖

  • 分段鎖

  • 鎖升級(無鎖|偏向鎖|輕量級鎖|重量級鎖)

  • 鎖優化技術(鎖粗化、鎖消除)

  • 更多詳細內容,一文全面梳理各種鎖機制

HashMap原理?

答案:內部由陣列和鏈表組成,非執行緒安全,JDK1.7和1.8的主要區別在于頭插和尾插方式的修改,頭插容易導致HashMap鏈表死回圈,并且1.8之后加入紅黑樹對性能有提升,

  • put插入:key 計算hash值,取模,找到陣列位置,如果陣列中沒有元素直接存入,反之,則判斷key是否相同,key相同就覆寫,否則就會插入到鏈表的尾部,如果鏈表的?度超過8且資料總量超過64,則會轉換成紅黑樹,最后判斷元素個數是否超過默認的?度(16)*負載因子(0.75),也就是12,超過則進行擴容,

  • get查詢:計算出hash值,然后去陣列查詢,是紅黑樹就去紅黑樹查,鏈表就遍歷鏈表查詢就可以了,

紅黑樹的時間復雜度 O(logn);鏈表的時間復雜度 O(n),當鏈表過長時,紅黑樹能大大提高查詢性能,

ConcurrentHashMap 如何能保證執行緒安全的?

答案:ConcurrentHashmap在JDK1.7和1.8的版本改動比較大,

  • 1.7 使用Segment + HashEntry 分段鎖的方式實作,Segment繼承于ReentrantLockHashEntry存盤鍵值對資料,

  • 1.8 采用陣列+ 鏈表 + 紅黑樹,鎖設計上拋棄了Segment分段鎖,采用 CAS + synchronized 實作,

ArrayList 和 LinkedList 有什么區別?

答案:

1、Arraylist

  • 非執行緒安全

  • 底層采用陣列存盤

  • 插入、洗掉元素,時間復雜度受位置影響,默認是添加在串列的末尾,如果在位置 k 插入或洗掉一個元素,需要將k后面的元素后移或前移一位,

  • 支持隨機訪問,根據索引下標序號,可以快速定位元素

  • 需要連續的記憶體空間,中間不能有碎片

2、LinkedList

  • 非執行緒安全

  • 底層采用雙向回圈鏈表存盤

  • 插入、洗掉元素,時間復雜度不受位置影響,只需要更改位置 k的前后指標地址,時間復雜度為 O(1)

  • 不支持高效的隨機訪問

  • 不需要連續的記憶體空間

volatile 原理?

答案:volatile宣告的變數,值被更新后對其他執行緒立即可?,

CPU會根據快取一致性協議,強制執行緒重新從主記憶體加載最新的值到自己的作業記憶體中,而不是直接用cpu快取中的值,

ThreadLocal 原理?

答案:ThreadLocal有一個靜態內部類ThreadLocalMapThreadLocalMap又包含了一個Entry陣列,Entry本身是一個弱參考,他的key是指向ThreadLocal的弱參考,Entry具備保存key – value鍵值對的能力,

在使用完之后呼叫remove方法洗掉Entry物件,避免出現記憶體泄露,

什么是作業記憶體、主記憶體?

答案:

  • 作業記憶體:暫存器、CPU快取(L1、L2、L3)

  • 主記憶體:主要是指物理記憶體

JUC并發包用過哪些執行緒安全的類?

答案:

  • ConcurrentHashMap

  • CountDownLatch、CyclicBarrier

  • Semaphore

  • BlockingQueue

  • ThreadPoolExecutor

  • ReentrantLock、ReentrantReadWriteLock

  • CompletableFuture

ThreadPoolExecutor 有哪些構造引數?

答案:核心執行緒數、最大執行緒數、最大空閑時間、時間單位、任務佇列、執行緒工廠、拒絕策略

  • 更多內容,參考 史上最全ThreadPoolExecutor梳理(上篇)

  • 更多內容,參考 史上最全ThreadPoolExecutor梳理(下篇)

ThreadPoolExecutor 的拒絕策略有哪些?

答案:

  • 1、AbortPolicy:直接丟棄任務,拋出例外,這是默認策略

  • 2、CallerRunsPolicy:只用呼叫者所在的執行緒來處理任務

  • 3、DiscardOldestPolicy:丟棄等待佇列中最舊的任務,并執行當前任務

  • 4、DiscardPolicy:直接丟棄任務,也不拋出例外

  • 5、使用RejectedExecutionHandler介面,自定義實作

執行緒有哪些狀態?是如何轉換?

答案:New、Runnable、Running、Blocked、Waiting、Timed Waiting、Terminated

圖片

IO 模型有哪五種?

答案:

1、阻塞IO,當 應用B 發起讀取資料申請時,如果內核資料沒有準備好,應用B會一直處于等待資料狀態,直到內核把資料準備好了交給應用B才結束,

2、非阻塞IO,當應用B發起讀取資料申請時,如果內核資料沒有準備好會即刻告訴應用B,不會讓B在這里等待,

3、IO復用模型,行程通過將一個或多個fd傳遞給select,阻塞在select操作上,select幫我們偵測多個fd是否準備就緒,當有fd準備就緒時,select回傳資料可讀狀態,應用程式再呼叫recvfrom讀取資料,

4、信號IO,信號驅動IO不是用回圈請求詢問的方式去監控資料就緒狀態,而是在呼叫sigaction時候建立一個SIGIO的信號聯系,當內核資料準備好之后再通過SIGIO信號通知執行緒資料準備好后的可讀狀態,當執行緒收到可讀狀態的信號后,此時再向內核發起recvfrom讀取資料的請求,因為信號驅動IO的模型下應用執行緒在發出信號監控后即可回傳,不會阻塞,所以這樣的方式下,一個應用執行緒也可以同時監控多個fd,

5、異步IO,解決了應用程式需要先后查看資料是否就緒發送接收資料請求兩個階段的模式,在異步IO的模式下,只需要向內核發送一次請求就可以完成狀態查詢和資料拷貝的所有操作,

阻塞IO 和 非阻塞IO 的區別?

答案:如果資料沒有就緒,在查看資料是否就緒的這個階段是一直等待?還是直接回傳一個標志資訊,


關于我:Tom哥,前阿里P7技術專家,出過專利,多年大廠實戰經驗,歡迎關注,我會持續輸出更多經典原創文章,為你大廠助力,

歡迎小伙伴找Tom哥嘮嗑聊天, 技術交流,圍觀朋友圈,人生打怪不再寂寞,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/382872.html

標籤:java

上一篇:位元組跳動Java面試還要問網路知識?懂一點就好

下一篇:python3基礎之集合set

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more