1. 程式人生 > 其它 >小米Java面經-1

小米Java面經-1

1、自我介紹
姓名、教育經歷、專案經理、個人榮譽、專業知識

2、專案
將手機端實時採集到的BLE資料包轉化成指紋序列,利用實時資料生成的指紋序列,識別出使用者當前所處的位置

3、面向物件的理解
面向物件:基於”萬物皆為物件“的思想,類比於對自然界各種事物進行分類,而某一類別的每一個事物是這個類別中的一個例項,同時每個例項有自己的屬性和方法,將這些屬性和方法抽象出來,生成這個類的屬性和方法

4、反射
Java的反射機制;程式在執行時,1、構建、2、瞭解、3、瞭解、4、呼叫
如何實現反射:
原理:。。。記憶體中生成一個Class物件,從該Class物件中可以獲得類的許多基本資訊
百度百科:Java反射機制


反射機制所需的類主要有java.lang包中的Class類和java.lang.reflect包中的Constructor類、Field類、Method類和Parameter類。Class類是一個比較特殊的類,它是反射機制的基礎,Class類的物件表示正在執行的Java程式中的類或介面,也就是任何一個類被載入時,即將類的.class檔案(位元組碼檔案)讀入記憶體的同時,都自動為之建立一個java.lang.Class物件。Class類沒有公共構造方法,其物件是JVM在載入類時通過呼叫類載入器中的defineClass()方法建立的,因此不能顯式地建立一個Class物件
通過這個Class物件,才可以獲得對應類的其他資訊

5、內部類
內部類:定義放在另一個類內部的類
分類:靜態和非靜態
使用場景:
如何建立內部類的例項

6、static關鍵字
類成員,成員變數-》靜態變數 成員方法-》靜態方法,屬於該類的所有例項,可以通用類名.成員變數 或 類名.方法名
補充:修飾基本資料型別變數;引用型別變數;靜態方法中不可以使用非靜態成員,因為非靜態成員依賴於被建立的例項
靜態程式碼塊:對靜態變數初始化;注意:在類方法外,可以有多個靜態類程式碼快,在類載入的初始化過程中被執行,用於給靜態成員變數賦正確的初始值
靜態內部類:
靜態導包:匯入靜態資源

7、JMM,Java記憶體模型,
是什麼:一套規範
作用是什麼:效果
內容:主記憶體,執行緒的工作記憶體,執行緒資料操作的方式,原子性(鎖)、可見性(沒有及時將修改更新到主存)、有序性(程式碼重編譯)

8、同步有幾種方式:同步方法、同步程式碼塊、volatile修飾的變數(特殊域變數volatile)、原子性操作、可重入鎖、ThreadLocal區域性變數

9、Lock可重入鎖

10、鎖升級

鎖一共有4種狀態,級別從低到高依次是:無鎖偏向鎖輕量級鎖重量級鎖

synchronized關鍵字:
synchronized可以修飾靜態方法、成員函式,同時還可以直接定義程式碼塊,但是歸根結底它上鎖的資源只有兩類:一個是物件,一個是類

原子性:一個或多個操作,要麼全部執行成功且執行過程中不會被任何因素打斷,要麼就都不執行,
可見性:可見性是指多個執行緒訪問一個資源時,該資源的狀態、值資訊等對於其他執行緒都是可見的
有序性:有序性值程式執行的順序按照程式碼先後執行

volatile修飾的變數不具有原子性;其實嚴格的說,對任意單個volatile變數的讀/寫具有原子性,但類似於volatile++這種複合操作不具有原子性,因為++這種操作是由桑額原子操作組合而成,在組合操作中,讀取後,不會再次讀取

偏向鎖:大多數情況下,鎖總是由同一執行緒多次獲得,為了讓執行緒獲得鎖的代價更低而引入了偏向鎖
原理:記錄獲得偏向鎖的程序ID,以後該執行緒在進入和退出同步塊時不需要進行CAS操作來加鎖和解鎖,只需簡單地測試一下物件頭的Mark Word裡是否儲存著指向當前執行緒的偏向鎖
如果測試成功,表示執行緒已經獲得了鎖。如果測試失敗,則需要再測試一下Mark Word中偏向鎖的標識是否設定成1(表示當前是偏向鎖):如果沒有設定,則使用CAS競爭鎖;如果設定了,則嘗試使用CAS將物件頭的偏向鎖指向當前執行緒
詳細過程:
1、執行緒2來競爭鎖物件;
2、判斷當前物件頭是否是偏向鎖;
3、判斷擁有偏向鎖的執行緒1是否還存在;
4、執行緒1不存在,直接設定偏向鎖標識為0(執行緒1執行完畢後,不會主動去釋放偏向鎖);
5、使用cas替換偏向鎖執行緒ID為執行緒2,鎖不升級,仍為偏向鎖;
6、執行緒1仍然存在,暫停執行緒1;
7、設定鎖標誌位為00(變為輕量級鎖),偏向鎖為0;
8、從執行緒1的空閒monitor record中讀取一條,放至執行緒1的當前monitor record中;
9、更新mark word,將mark word指向執行緒1中monitor record的指標;
10、繼續執行執行緒1的程式碼;
11、鎖升級為輕量級鎖;
12、執行緒2自旋來獲取鎖物件;

可重入鎖:執行緒獲得了鎖,還可以重複的申請鎖