【面試準備】華爲二面準備

類加載機制

SSM註解的實現原理

反射和注入

雙親委派機制

1. 當前ClassLoader首先從自己已經加載的類中查詢是否此類已經加載,如果已經加載則直接返回原來已經加載的類。
每個類加載器都有自己的加載緩存,當一個類被加載了以後就會放入緩存,等下次加載的時候就可以直接返回了。

2.  當前classLoader的緩存中沒有找到被加載的類的時候,委託父類加載器去加載,依次遞歸(即:父類加載器採用同樣的策略,首先查看自己的緩存,然後委託父類的父類去加載,一直到bootstrp ClassLoader),如果父類加載器可以完成類加載任務,就成功返回;

3.  當所有的父類加載器都沒有加載的時候,再由當前的類加載器加載,並將其放入它自己的緩存中,以便下次有加載請求的時候直接返回。

類加載的三種方式

一.靜態加載

1.

通過new關鍵字來創建Test的實例對象。

二.動態加載

1.

通過Class.forName()來加載類,然後調用類的newInstance()方法實例化對象。

2.

通過類加載器的loadClass()方法來加載類,然後調用類的newInstance()方法實例化對象。

高併發場景下如何保證數據庫和緩存的數據一致性

只要用緩存,就可能會涉及到緩存與數據庫雙存儲雙寫,你只要是雙寫,就一定會有數據一致性的問題,那麼你如何解決一致性問題?

經典做法

最經典的緩存+數據庫讀寫的模式,就是 Cache Aside Pattern。
讀的時候,先讀緩存,緩存沒有的話,就讀數據庫,然後取出數據後放入緩存,同時返回響應。
更新的時候,先刪除緩存,然後更新數據庫。

如何在高併發情況下保證數據的一致性

 

對多個更新操作的業務加事物註解。在數據庫表中加一個vesion版本控制字段(初始值爲0)在更新操作前查詢並記錄該字段,更新操作完成vesion+1,再次查詢vesion與更新操作前記錄的值相差1說明前後數據一致,否則回滾更新操作

1.通過悲觀鎖實現 for update

2.通過樂觀鎖實現,加字段

3.針對秒殺系統,可以採取將併發請求串行化。放在一個隊列中,處理對數據庫的寫操作

4.通過redis實現,讀和寫都操作redis。寫redis數據時,同時產生一條業務相關聯的日誌數據。單獨開個任務或者消息隊列來對日誌數據進行讀取,獲取裏面的對數據庫的操作。然後進行寫數據庫。

5.因爲redis支持事務,所有寫操作可以通過lua腳本來支持對數據庫的操作。

1.業務層面樂觀鎖CAS,使用版本號解決ABA問題,實際使用中使用時間戳,更新的時候把查出來的時間戳帶上,如果更新失敗可以自旋,獲取最近值和時間戳,直到更新成功。
2.DB層面開啓一個事務,然後select一行for update給這一行加上排它鎖,再去更新行,然後提交,其他事務就會阻塞在select for update。
3.分佈式鎖適合競爭不激烈的情況保證一致性,因爲性能比較差,按CAP理論來講應該是保證了CP放棄了A,zk或者redis保證一致性P,只有拿到鎖的線程才能執行,保證一致性C

http://www.unibeta.org.cn/article/25

http://www.360doc.com/content/18/0426/20/41344223_748994212.shtml

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