一開始我做了一下簡單的自我介紹,然後開始大致說了一下自己的技術情況,面試小哥沿着我的技術棧問了幾個很好的問題:
1.LRUCache污染問題如何避免?
我也不知道!
2.雙檢鎖單例爲什麼線程不安全?
簡單來說,就是JVM的指令重排!
public class DoubleCheckLock {
private static DoubleCheckLock instance;
private DoubleCheckLock() {
// TODO
}
public static DoubleCheckLock getInstance() {
if (instance == null) {
synchronized (DoubleCheckLock.class) {
if (instance == null) {
instance = new DoubleCheckLock();
}
}
}
return instance;
}
}
再回過頭看我們的雙檢鎖內部,對於"instance = new DoubleCheckLock();"這一行代碼,它分爲三個步驟執行:
1.分配一塊內存空間
2.在這塊內存上初始化一個DoubleCheckLock的實例
3.將聲明的引用instance指向這塊內存
第2和第3個步驟都依賴於第1個步驟,但是2和3之間沒有依賴關係,那麼如果編譯器將2和3調換順序,變成了:
1.分配一塊內存空間
2.將聲明的引用instance指向這塊內存
3.在這塊內存上初始化一個DoubleCheckLock的實例
當線程A執行到第2步時,instance已經不爲null了,因爲它指向了這塊內存,此時如果線程B走到了"if (instance == null)",那麼線程B其實拿到的還是一個null,因爲這塊內存還沒有初始化,這就出現了問題。
解決方案:volatile關鍵字
public class DoubleCheckLock {
private static volatile DoubleCheckLock instance;
private DoubleCheckLock() {
// TODO
}
public static DoubleCheckLock getInstance() {
if (instance == null) {
synchronized (DoubleCheckLock.class) {
if (instance == null) {
instance = new DoubleCheckLock();
}
}
}
return instance;
}
}
3.OkHttp請求流程是什麼?
https://www.jianshu.com/p/230e2e2988e0/
4.HashMap原理。
https://blog.csdn.net/vking_wang/article/details/14166593
5.EventBus如何做到進程間通信。
不清楚!~
6.詳細講一講Http和Https。
7.數組和鏈表有什麼區別?
數組存儲區間是連續的,佔用內存嚴重,故空間複雜度很大。但數組的二分查找時間複雜度小,爲O(1);數組的特點是:尋址容易,插入和刪除困難;
鏈表存儲區間離散,佔用內存比較寬鬆,故空間複雜度很小,但時間複雜度很大,達O(N)。鏈表的特點是:尋址困難,插入和刪除容易。