java 並發麵試
- 2019 年 10 月 25 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/qq_32534855/article/details/99609005
1.ConcurrentHashMap是面試常客,大家對於下面的問題了解嗎?
Collections.synchronizedMap()雖然是執行緒安全的,但是它是通過使用一個全局的鎖來同步不同執行緒間的並發訪問,因此會帶來較大的性能問題。ConcurrentHashMap的性能大大提升,設計之初就是為了代替Collections.synchronizedMap()。 HashMap(HashSet同理)在多執行緒下可能造成CPU100%,是為什麼? 2.HashMap在Java 7和8有什麼不同? 3.JDK8的ConcurrentHashMap也會造成CPU 100%,你知道嗎? 4.ConcurrentHashMap在Java 7和8有什麼不同? 5.ConcurrentHashMap的擴容過程你了解嗎? 6.ConcurrentHashMap與HashMap相比,有什麼不同? 7.為什麼Map桶中超過8個才轉為紅黑樹? 8.為什麼有了Collections.synchronizedMap(),還需要ConcurrentHashMap? 9.同樣是執行緒安全,ConcurrentHashMap和Hashtable 的區別 10.對比Hashtable, HashMap, TreeMap有什麼不同?
11.阻塞隊列
阻塞隊列最大的特點是帶有阻塞功能,最有特色的兩個帶有阻塞功能的方法是: 1 take()方法 獲取並移除隊列的頭結點。通常在隊列里有數據的時候,那麼就從正常取數據。但是一旦如果執行take的時候,隊列里無數據,則阻塞,直到隊列里有數據。一旦隊列里有數據了,就會立刻解除阻塞狀態,並且取到數據。 2 put()方法 插入元素。通常在隊列沒滿的時候,那就是正常的插入,但是如果隊列已滿,那麼就無法繼續插入,則阻塞,直到隊列里有了空閑空間。當消費者消費了一個元素後,隊列有了空閑空間,那麼此時隊列就會解除阻塞狀態,並把剛才那個元素添加進去。
以上過程中的阻塞和接觸阻塞,都是用BlockingQueue來完成的,不需要我們自己處理。