Android高級崗面試實戰04——某二手交易平臺Android電話一面

一開始我做了一下簡單的自我介紹,然後開始大致說了一下自己的技術情況,面試小哥沿着我的技術棧問了幾個很好的問題:

1.LRUCache污染問題如何避免?

我也不知道!

2.雙檢鎖單例爲什麼線程不安全?

https://blog.csdn.net/zy13608089849/article/details/82703192?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.nonecase

簡單來說,就是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)。鏈表的特點是:尋址困難,插入和刪除容易。

 

 

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