首頁>技術>

原文連結:https://mp.weixin.qq.com/s/tesPxGPXpn0IAacnW3KZ6g

阿粉最近接到了一個面試,但是面試結果不是很盡如人意,因為雖然有些問題回答的還湊活,但是因為面試官問了一些後續的內容,阿粉不會,於是就被吊起來瘋狂捶打了半天,敗興而歸。

面試題1:HashMap和ConcurrentHashMap的區別

我們都知道HashMap是執行緒不安全的,當我們在有併發的情況下去使用HashMap的put,還有get等一些方法的時候,CPU直接飆升,而且也沒有辦法保證執行緒的安全性,但是更加安全的HashTable呢?

因為在HashTable裡面put和get的方法的,沒一個都是加上了synchronize,雖然保證了執行緒的安全性,但是效率就比較低下了,在我們進行併發訪問的時候,每次只能是一個執行緒進行操作,其他的執行緒就只能是阻塞執行,所以,他的效率相對來說,是非常低的,這時候我們就出現了ConcurrentHashMap。

而ConcurrentHashMap則使用了鎖分段(減小鎖範圍)、CAS(樂觀鎖,減小上下文切換開銷,無阻塞)等等技術,這時候你回答了,就出現了一環套一環的操作,那麼你就分別來說說把。

在JDK1.7中,ConcurrentHashMap使用的鎖分段技術,將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當一個執行緒佔用鎖訪問其中一個段資料的時候,其他段的資料也能被其他執行緒訪問。

在JDK1.8中,ConcurrentHashMap採用CAS和synchronized方式處理併發。以put操作為例,CAS方式確定key的陣列下標,synchronized保證連結串列節點的同步效果

阿粉也沒怎麼墨跡,直接說能給我一張紙麼?於是阿粉畫了一個之前在網上看的圖。

阿粉給面試官介紹的時候直接就從圖上介紹了,而阿粉直接分析原始碼的時候,剛開始Segment繼承了ReentrantLock的時候,面試官就打斷了我接下來要敘述的內容,讓我直接就說1.8的了。

1.8中的:

首先new一個新的hash表(nextTable)出來,大小是原來的2倍。後面的rehash都是針對這個新的hash表操作,不涉及原hash表(table)。然後會對原hash表(table)中的每個連結串列進行rehash,此時會嘗試獲取頭節點的鎖。這一步就保證了在rehash的過程中不能對這個連結串列執行put操作。透過sizeCtl控制,使擴容過程中不會new出多個新hash表來。最後,將所有鍵值對重新rehash到新表(nextTable)中後,用nextTable將table替換。這就避免了HashMap中get和擴容併發時,可能get到null的問題。在整個過程中,共享變數的儲存和讀取全部透過volatile或CAS的方式,保證了執行緒安全。

而至於分析原始碼,阿粉不再進行分析了,以後在遇到面試的時候分析原始碼的時候在繼續給大家說。畢竟下面還有很多內容。

面試題2:你對兩種方式的看法是什麼,為什麼1.8要改變呢?優點是哪裡呢?

阿粉就猜測到可能這麼問,畢竟你開了頭了,你都區分出1.7和1.8了,必然會有面試官會這麼問你,阿粉是這麼回答的。

減少記憶體開銷假設使用可重入鎖,那麼每個節點都需要繼承AQS,但並不是每個節點都需要同步支援,只有連結串列的頭節點(紅黑樹的根節點)需要同步,這無疑消耗巨大記憶體。獲得JVM的支援可重入鎖畢竟是API級別的,後續的效能最佳化空間很小。synchronized則是JVM直接支援的,JVM能夠在執行時作出相應的最佳化措施:鎖粗化、鎖消除、鎖自旋等等。使得synchronized能夠隨著JDK版本的升級而不改動程式碼的前提下獲得性能上的提升。

也是虧了阿粉在面試之前的時候看過很多這樣的文章,很多東西都專門去比對了一下,於是第二個問題結束了。

面試題3:你們是怎麼避免 SQL 注入的?

阿粉看到這個問題的時候,第一反應就是肯定是按照我簡歷上寫的問的,因為阿粉之前的公司就是對安全性要求比較高的,像什麼SQL注入啦,像跨站攻擊啦,於是阿粉就開始說了。

阿粉在之前的時候時候最多使用的是 where條件後面加上個1=1然後再繼續寫自己的引數。

確認每種資料的型別,比如是數字,資料庫則必須使用int型別來儲存嚴格限制資料庫許可權過濾引數中含有的一些資料庫關鍵詞

比如說過濾一些 and,char,這些在資料庫語句中是關鍵字的一些詞。

也可能面試官對這些資料安全的方面不是太注重,所以,阿粉回答出這幾種方式之後,就已經算是完事了,也沒有繼續再往下深究。

面試題4:說一下 MySQL常用的引擎都有哪些?

資料庫儲存引擎是資料庫底層軟體組織,資料庫管理系統(DBMS)使用資料引擎進行建立、查詢、更新和刪除資料。不同的儲存引擎提供不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎,還可以 獲得特定的功能。現在許多不同的資料庫管理系統都支援多種不同的資料引擎。儲存引擎主要有:1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。

面試題5:看你簡歷上說用過redis,那麼你說一下redis的持久化的方式吧。RDB持久化方式能夠在指定的時間間隔能對你的資料進行快照儲存.AOF持久化方式記錄每次對伺服器寫的操作,當伺服器重啟的時候會重新執行這些命令來恢復原始的資料,AOF命令以redis協議追加儲存每次寫的操作到檔案末尾.Redis還能對AOF檔案進行後臺重寫,使得AOF檔案的體積不至於過大.

RDB其實就是把資料以快照的形式儲存在磁碟上。什麼是快照呢,你可以理解成把當前時刻的資料拍成一張照片儲存下來。

RDB持久化是指在指定的時間間隔內將記憶體中的資料集快照寫入磁碟。也是預設的持久化方式,這種方式是就是將記憶體中資料以快照的方式寫入到二進位制檔案中,預設的檔名為dump.rdb。

而關於怎麼觸發,這個就直接去修改redis.conf配置檔案即可。

AOF持久化,實際上就是追加儲存每次寫的操作到檔案末尾,也可能阿粉在實際的使用Redis的時候,並沒有去做過持久化的操作,回答到這裡已經算是沒有其他的了,而接下來面試官問的幾個關於Redis的問題就回答不是特別的好了,所以在Redis上面,還是得下功夫呀。

12
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 太棒了,新手也可以做到的簡單爬取網易雲音樂評論