阿里,騰訊各大互聯網公司Java後端開發面試題總結,附詳細筆記解讀技術點!

直接放出乾貨:

ThreadLocal(線程變量副本)

Synchronized實現內存共享,ThreadLocal爲每個線程維護一個本地變量。

採用空間換時間,它用於線程間的數據隔離,爲每一個使用該變量的線程提供一個副本,每個線程都可以獨立地改變自己的副本,而不會和其他線程的副本衝突。

ThreadLocal類中維護一個Map,用於存儲每一個線程的變量副本,Map中元素的鍵爲線程對象,而值爲對應線程的變量副本。

ThreadLocal在Spring中發揮着巨大的作用,在管理Request作用域中的Bean、事務管理、任務調度、AOP等模塊都出現了它的身影。

Spring中絕大部分Bean都可以聲明成Singleton作用域,採用ThreadLocal進行封裝,因此有狀態的Bean就能夠以singleton的方式在多線程中正常工作

 

Java內存模型:

Java虛擬機規範中將Java運行時數據分爲六種。

1.程序計數器:是一個數據結構,用於保存當前正常執行的程序的內存地址。Java虛擬機的多線程就是通過線程輪流切換並分配處理器時間來實現的,

爲了線程切換後能恢復到正確的位置,每條線程都需要一個獨立的程序計數器,互不影響,該區域爲“線程私有”。

2.Java虛擬機棧:線程私有的,與線程生命週期相同,用於存儲局部變量表,操作棧,方法返回值。局部變量表放着基本數據類型,還有對象的引用。

3.本地方法棧:跟虛擬機棧很像,不過它是爲虛擬機使用到的Native方法服務。

4.Java堆:所有線程共享的一塊內存區域,對象實例幾乎都在這分配內存。

5.方法區:各個線程共享的區域,儲存虛擬機加載的類信息,常量,靜態變量,編譯後的代碼。

6.運行時常量池:代表運行時每個class文件中的常量表。包括幾種常量:編譯時的數字常量、方法或者域的引用

 

“你能不能談談,java GC是在什麼時候,在什麼時候,對什麼東西,做了什麼事情?”

1.新生代有一個Eden區和兩個survivor區,首先將對象放入Eden區,如果空間不足就向其中的一個survivor區上放,如果仍然放不下就會引發一次發生

在新生代的minor GC,將存活的對象放入另一個survivor區中,然後清空Eden和之前的那個survivor區的內存。在某次GC過程中,如果發現仍然又放不下的對象,就將這些對象放入老年代內存裏去。

2.大對象以及長期存活的對象直接進入老年區。

3.當每次執行minor GC的時候應該對要晉升到老年代的對象進行分析,如果這些馬上要到老年區的老年對象的大小超過了老年區的剩餘大小,那麼執行一次Full GC以儘可能地獲得老年區的空間。

對什麼東西:從GC Roots搜索不到,而且經過一次標記清理之後仍沒有復活的對象。

做什麼: 新生代:複製清理; 老年代:標記-清除和標記-壓縮算法; 永久代:存放Java中的類和加載類的類加載器本身。

GC Roots都有哪些:

1. 虛擬機棧中的引用的對象

2. 方法區中靜態屬性引用的對象,常量引用的對象

3. 本地方法棧中JNI(即一般說的Native方法)引用的對象

 

Synchronized 與Lock都是可重入鎖,同一個線程再次進入同步代碼的時候.可以使用自己已經獲取到的鎖。

Synchronized是悲觀鎖機制,獨佔鎖。而Locks.ReentrantLock是,每次不加鎖而是假設沒有衝突而去完成某項操作,如果因爲衝突失敗就重試,直到成功爲止。

ReentrantLock適用場景

1. 某個線程在等待一個鎖的控制權的這段時間需要中斷

2. 需要分開處理一些wait-notify,ReentrantLock裏面的Condition應用,能夠控制notify哪個線程,鎖可以綁定多個條件。

3. 具有公平鎖功能,每個到來的線程都將排隊等候

 

Volatile和Synchronized四個不同點: 1 粒度不同,前者針對變量 ,後者鎖對象和類 2 syn阻塞,volatile線程不阻塞 3 syn保證三大特性,volatile不保

證原子性 4 syn編譯器優化,volatile不優化 volatile具備兩種特性:

1. 保證此變量對所有線程的可見性,指一條線程修改了這個變量的值,新值對於其他線程來說是可見的,但並不是多線程安全的。

2. 禁止指令重排序優化。 Volatile如何保證內存可見性: 1.當寫一個volatile變量時,JMM會把該線程對應的本地內存中的共享變量刷新到主內存。 2.

當讀一個volatile變量時,JMM會把該線程對應的本地內存置爲無效。線程接下來將從主內存中讀取共享變量。

同步:就是一個任務的完成需要依賴另外一個任務,只有等待被依賴的任務完成後,依賴任務才能完成。 異步:不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,只要自己任務完成了就算完成了,被依賴的任務是否完成會通知回來。(異步的特點就是通知)。 打電話和發短信來比喻同步和異步操作。 阻塞:CPU停下來等一個慢的操作完成以後,纔會接着完成其他的工作。 非阻塞:非阻塞就是在這個慢的執行時,CPU去做其他工作,等這個慢的完成後,CPU纔會接着完成後續的操作。 非阻塞會造成線程切換增加,增加CPU的使用時間能不能補償系統的切換成本需要考慮。

 

還有更多大廠面試題,我都一一整理,尋找到了相關的技術點的文章

 

算法文檔

 

開發書籍

 

面試專題和思維導圖

現在在這裏都分享給大家,一切盡在我的公衆號:Java小朔哥,關注即可獲取免費領取方式!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章