面試真題由Android研習社社員提供,這一次放出來是爲了幫助你們更好的準備面試;部分題目寫了一些答案,僅供參考,你們關注問題自己就好java
想加大佬微信?或者深刻學習的,掃描下方二維碼,一塊兒來探討!c++
你們平時接觸最多的設計模式確定就是單例了。有時候面試官會提問,除了單例模式,你最熟悉的設計模式是什麼?
我仍是先來講一下單例吧
如今通常咱們都會寫靜態單例,或者雙重校驗鎖,靜態單例原理好像是利用的jvm中靜態實例只會加載一次的特性,因此以後再去獲取的時候確定是惟一的;
而後說一下雙重校驗鎖。爲何要雙重校驗呢?若是隻校驗一次可不能夠呢?實際上是能夠的,多線程去獲取鎖對象的時候遇到synchronize加鎖的代碼塊,確定須要先獲取鎖才能進行下一步操做。可是這裏就有一個問題,就是效率不高,每次都須要去查看鎖對象是否被搶佔。因而纔有了雙重校驗鎖,先在synchronize代碼塊外進行一次非空判斷(沒有加鎖,減小了獲取鎖的時間),若是不爲空就直接返回了;若是爲空,再進行進一步的同步獲取鎖的操做。
那雙重校驗鎖有缺點嗎?實際上是有的,就是jvm可能會對執行進行重排,致使建立對象時,可能變量和內存都申請完成,可是把實例數據放置到內存空間這一步沒有完成,致使對象爲空的狀況。
這個問題的根本緣由,實際上是指令重排致使的有序性問題。
解決可見性問題,java提供了volatile關鍵字,就可以針對該對象禁用指令重排。
而後再來按照面試官的要求,說一下適配器模式。適配器模式在Android中應用的很普遍了,通常是用來作數據和UI的接口適配器。
在Android以外,其實你們都不是很看好適配器模式。由於它是固有設計不合理才產生的,把一個接口,轉化爲另外一個接口。這也是適配器模式的概念,把兩個不兼容的接口,經過統一的接口適配爲一個能夠調用的接口方式。
可是在Android中這個模式反而如魚得水,由於總有需求要把數據呈現到UI上來,適配器模式實際上是實現了相同數據格式的呈現接口的複用,減小了冗餘代碼,也把數據和UI作了解藕。
除了適配器模式,我在項目的實際使用中還使用過構造者模式和觀察者模式。
構造者模式通常用來和工廠模式作對比,他們都是構建型設置模式,構造者模式是針對的複雜對象,好比說一個類初始化須要穿10幾個參數,那對於使用者來講,第一不易讀,第二寫着也不方便,傳10多個參數簡直就是噩夢。
構造者模式實際上是把各個參數獨立出來,提供單獨的方法來設置,而後返回本類對象,實現能夠鏈式調用。
複製代碼
首先說下什麼是原子性。原子性,從表面上看是不能分割,本質上不可中斷,也就是說操做有一致性的要求。
好比說付款這個操做,必定是涉及到轉出和轉入操做的一直性,也就是原子性。
在java中,多個線程間要保證一致性其實就是要對其進行加鎖。這個說的是業務層面的原子性。
加鎖的方式,能夠直接在方法上家sync關鍵字,jvm會自動在方法開始的地方加上look,在方法結束的地方加上unlook,保證它們是成對使用的。這種方法的鎖對象是該類的實例對象。
還能夠對代碼塊進行加鎖,減小臨界區的範圍,提升性能。若是是sync(this),鎖對象也是該類的實例對象,
若是是sync(非this對象),那是用的鎖就是這個對象。
另外除了直接使用sync關鍵字,還能夠直接使用look和unlook進行加鎖和解鎖,可是不要忘了他們須要成對使用
複製代碼
先說一下實際的應用場景吧,好比在作app啓動優化的時候,若是多個異步任務有依賴關係,
好比taskA必須在taskB和taskC,taskD,都異步執行完以後再執行,那就能夠用countDownlatch在主線程使用await阻塞等待,
設置countDownlatch(3),每完成一個任務就執行一次countdown,
當三個如今都執行完成後,await阻塞等待結束,就能夠執行taskA了
如今來總結下,該類主要是用來處理多個線程異步執行時做爲條件變量來進行阻塞判斷的情景。
複製代碼
特別感謝:
Android研習社
社長--南山丶Gzw設計模式
鄭重聲明緩存
本文由Android研習社社羣創做,版權©️歸Android研習社全部
,侵權必究!安全