面試經歷【平安科技】

java集合類哪些是有序的,哪些是無序的

實現了List接口的全部都是有序集合;ArrayList,LinkedList

實現了Set接口的,HashSet無序,TreeSet有序

實現了Map接口的,HashMap無序,TreeMap有序

List接口的主要對象:

----LinkedList沒有同步方法;

----ArrayList是非同步的;

----Vector類似ArrayList,Vec是同步的(synchronized)

---------Stack(棧),push添加元素,pop取出元素,先進後出,search檢查一個元素在堆棧中的位置。

Set不包含重複元素

----HashSet

----TreeSet(實現SortedSet接口)

Queen直接實現collection

Map

Map沒有實現collection接口,提供key-value的映射規則

----hashmap 可空對象,非同步,效率高,

--------WeakHashMap:對key實行弱引用,如果一個key值不再被外部引用,它可以被GC回收

----hashtable 任何非空對象,同步的

-----TreeMap(實現SortedMap)有序的

總結:

----如果涉及到堆棧,隊列(先進後出)等操作,應該考慮用List,如果需要快速插入刪除元素,選用LinkedList,如果需要隨機訪問元素,選用ArrayList

----ArrayList、HashSet/LinkedHashSet、PriorityQueue、LinkedList是線程不安全的

ArrayList和Vector有什麼區別

Vector是線程同步的,Vector擴容*2,ArrayList擴容*1.5

Comparable和Comparator區別

Comparable是一個接口,當調用collections.sort進行排序的時候,需要List內的對象都實現了Comparable接口

Comparator是排序規則,可以自定義排序規則來實現排序

     Collections.sort(imageList, new Comparator() {  

           public int compare(Object a, Object b) {  

               int orderA = Integer.parseInt( ( (Image) a).getSequence());  

               int orderB = Integer.parseInt( ( (Image) b).getSequence());  

               return orderA - orderB;  

         }       

});  

雙向鏈表相對於單向鏈表有什麼優勢

單向鏈表:由數據域和節點域組成,每一個節點的head指針指向下一個節點,這樣就形成了單向鏈表;如果要查找其中某一個節點,只能從頭開始遍歷;

雙向鏈表:雙鏈表比單鏈表相比,多了一個指向尾指針(tail),雙鏈表每個節點都有一個頭指針(head)和尾指針(tail),雙鏈表比單鏈表更容易操作,雙鏈表節點的首節點(head)指向null,tail指向下一個節點的head,是雙向關係。

單向鏈表:只有一個指向下一個節點的指針;

優點:單向鏈表增加刪除節點簡單,遍歷的時候不會死循環

缺點:只能從頭到尾遍歷,只能找到後面一個節點,無法找到前面個

適用於節點的增加刪除

雙向鏈表:有兩個指針,一個指向前一個節點,一個指向後一個節點

優點:可以找到前驅和後繼,可進可退

缺點:增加刪除節點複雜,多需要一個分配指針的空間

使用與需要雙向查找的節點值得情況,適用於查詢

 

Linux怎麼查看cpu的使用率,怎麼處理cpu過高

top:查看cpu使用率(進程級別 top -u oracle 即可查看oracle的cpu使用情況)

vmstat:系統級別的cpu使用情況

處理cpu跑高:top查看----p排序----ll /proc/PID/exe可以查看每個進程ID對應的程序文件----k PID終止進程

 

ps -ef|grep命令解釋:

ps:將某個進程顯示出來

grep:查找(文本搜索工具,可使用正則表達式)

|:管道命令,表示間ps grep同時執行

e:顯示所有進程

f:全格式顯示

netstat:檢查Linux網絡連接的工具

 

紅黑樹的原理:

紅黑樹是一種自平衡的二叉樹

平衡是指所有葉子深度基本相同

二叉搜索樹是指,節點最多兩個兒子,且左子樹節點都小於右子樹

節點改動時,通過調整順序(自旋),重新給節點進行染色,使節點滿足某種特殊性質來保持平衡

插入、刪除以及旋轉、染色操作都是O(log n)的時間複雜度

滿足以下基本性質:

----節點必須是紅色或者黑色

----根節點和葉節點必須是黑色

----紅色節點必須有兩個黑色的兒子節點

----從任一節點出道到每個葉節點的路勁,黑色節點數量是相等的

關鍵屬性:從根節點到最遠的葉子節點的路徑與到最近的葉子節點的路徑長度不會超過2

保持平衡的原理:

參考文檔:https://www.cnblogs.com/yangecnu/p/Introduce-Red-Black-Tree.html

 

ReentrantLock

實現Lock接口,可輪詢,無條件的,定時的,可中斷的

lock(),unlock()方法顯示獲取鎖和釋放鎖,如果忘記釋放鎖會造成阻塞

可以使用tryLock()方法嘗試獲取鎖,如果沒有獲取到則釋放已經持有的鎖,避免產生死鎖

使用定時鎖可以在一段時間內沒有獲取鎖時可以返回,不會像內部鎖一直阻塞

與synchronized的比較:

----ReentrantLock 擁有Synchronized相同的併發性和內存語義,此外還多了 鎖投票,定時鎖等候和中斷鎖等候

----synchronized是在jvm層面上實現的,可以通過監控工具進行監控,在代碼出現異常的時候可以自動釋放鎖,但lock不行

----在資源競爭不激烈的情況下,synchronized的性能優於ReentrantLock,但競爭激烈的時候synchronized會下降很多,ReentrantLock會保持常態

結尾:寫同步的時候,優先考慮synchronized(synchronized和ReentrantLock的開銷差距在喚醒線程的數量,synchronized是喚醒鎖池裏的所有線程+剛好來訪的線程,ReentrantLock是喚醒進來的第一個線程+剛好來訪的線程;如果實在併發量不大的情況下,synchronized不需要將等待線程掛起,所以效率較高),如果有特殊需要,再進一步優化。ReentrantLock和Atomic如果用的不好,不僅不能提高性能,還可能帶來災難。

ReentrantLock的特有能力:

----可以指定是公平鎖還是非公平鎖(先等待,先獲取即爲公平),synchronized爲非公平鎖

----ReentrantLock提供condition類,用來實現分組喚醒線程,synchronized爲隨機喚醒,或者全部喚醒

----ReentrantLock提供可以中斷等待鎖的線程機制,通過lock.lockInteruptibly()來實現

參考文檔:https://blog.csdn.net/qq838642798/article/details/65441415

https://www.cnblogs.com/fanguangdexiaoyuer/p/5313653.html

 

悲觀鎖和樂觀鎖的區別:

悲觀鎖:假設最壞的情況,認爲每個線程都會去修改數據,所以在每次拿到數據的時候都會上鎖,別人只能等待知道持有鎖的線程結束後再競爭鎖(共享資源只能給一個線程使用),synchronized和ReentrantLock都是悲觀鎖,傳統關係型數據庫也基本是悲觀鎖(行鎖,表鎖,讀寫鎖等)

樂觀鎖:認爲每個線程都不會修改數據,但是在當前線程更新數據的時候回去判斷是否有其他線程對數據進行更新,可以使用CAS算法和版本號機制實現(適用於多讀類型的應用場景,提高吞吐量),java中atomic包下面的原子變量類就是樂觀鎖的CAS方式實現。

CAS算法(compare and swap):一種無鎖算法,即在不使用鎖的情況下實現多線程之間的變量同步(非阻塞同步),基本原理:首先讀內存值V,確認進行比較的值A,需更新的值B;當且僅當內存值V等於A時,CAS通過原子方式用B值更新V值,否則不執行任何操作(自旋操作,即不成功會一直重試,知道成功,會造成cpu資源的嚴重浪費)。

樂觀鎖的缺點:

ABA問題:當前V值雖然等於A值,但是不保證在此過程中A值沒有被改爲其他值

循環開銷過大:自旋操作會一直進行,直到成功(JVM支持cpu提供的pause命令可以提升一定的效率【延遲流水線作業,內存衝突會直接清空cpu流水線】)

只能保證一個共享變量的遠在操作,當操作涉及多個共享變量的時候CAS無效,但是可以使用AtomicReference類來保證引用對象之間的原子性,將多個變量放在一個對象中進行操作

CAS和synchronized:

當資源競爭較少時,synchronized進行線程阻塞和喚醒切換線程操作會額外的浪費cpu資源,而CAS基於硬件實現,自旋概率小,不需要進入內核,不需要切換線程,因此可以獲得更高的性能

當競爭較強時,CAS自旋的概率增大,從而浪費更多的資源,效率低於synchronized

綜合比較:

性能:競爭小時:CAS >>>>>synchronized>>>>>ReentrantLock;競爭大時:ReentrantLock>>>>synchronized>>>>CAS

JavaSE 1.6之後進行了主要包括爲了減少獲得鎖和釋放鎖帶來的性能消耗而引入的 偏向鎖 和 輕量級鎖 以及其它各種優化之後變得在某些情況下並不是那麼重了。synchronized的底層實現主要依靠 Lock-Free 的隊列,基本思路是 自旋後阻塞,競爭切換後繼續競爭鎖,稍微犧牲了公平性,但獲得了高吞吐量。在線程衝突較少的情況下,可以獲得和CAS類似的性能;而線程衝突嚴重的情況下,性能遠高於CAS。

 

 

 

 

 

 

 

 

 

 

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