天天看點

2018.9.21攜程背景開發面試記錄

一面感覺挺随便的,就是一大群人和一大群面試官在一個大房間然後一對一面試,俨然一個菜市場……也不知道有沒有二面,面試官有些問題也沒答上來,作為第一次面試還是好好記錄一下,積累面試的套路經驗

1、上來當然還是自我介紹

2、看履歷,讓我講一下模仿天貓的項目用了什麼技術棧,我主要用的SSM,就問了Spring的bean對象的生命周期。這個其實不是特别清楚,現在捋一下

流程圖轉自這篇部落格

2018.9.21攜程背景開發面試記錄
2018.9.21攜程背景開發面試記錄

Bean的完整聲明周期經過了很多方法調用,大緻分為四個

  1. Bean自身的方法:包括Bean自身調用的方法以及applicationContext.xml中指定的init-method和destroy-method
  2. Bean級生命周期接口方法:這個包括了BeanNameAware,BeanFactoryAware,InitializingBean和DisposableBean這些接口的方法
  3. 容器級生命接口方法:這個包括InstantiationAwareBeanPostProcessor和BeanPostProcessor這兩個接口,一般稱它們的實作類為“後處理器”
  4. 工廠後處理器方法:這個包括AspectJWeavingEnabler,ConfigurationClassPostProcessor,CustomerAutowireConfigurer等工廠後處理器接口的方法,它也是容器級的,在應用上下文裝配配置檔案後立即調用

示範:

2018.9.21攜程背景開發面試記錄

對照測試結果和流程圖基本就清楚了

3、問項目是學校的還是機關的還是怎麼的,我說是按照一個教程做的,就設想了一個并發場景,如果庫存為1但同時有兩人下單,那麼會出現什麼問題,如何解決。我一開始給的方案是給資料庫加鎖,同一時間隻有一個使用者能操作資料,他思考了一下說這樣是可行的,但是又會帶來另一個問題,如果此時庫存加貨了需要更新怎麼辦,讓我回來思考。問了問站長他說可以用樂觀鎖來解決,大緻就是采用一個版本控制,原理圖如下

2018.9.21攜程背景開發面試記錄

4、因為剛才讨論過程中我說到了也許可以用事務來解決(當然我是随便說的很快就反應到不對了)是以他又問了資料庫的隔離級别, 這個沒怎麼看過,當時回答還跟springMVC的事務隔離級别混淆了,現在補上……

資料庫的四種隔離級别

READ_UNCOMMITED

  • 事務對目前讀取的資料不加鎖
  • 事務在更新資料的瞬間必須對其加行級共享鎖,直到事務結束才釋放

表現

  • 事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新;當事務2對該記錄進行更新時,事務1再次讀取該記錄,能讀到事務2對該記錄的修改版本,即使該修改尚未被送出
  • 事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束

READ_COMMITED

  • 事務對目前讀取到的資料加行級共享鎖,一旦讀完該行,立即釋放鎖
  • 事務在更新某資料瞬間,必須加行級排他鎖,直到事務結束才釋放

表現

  • 事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新;當事務2對該記錄進行更新時,事務1再次讀取該記錄,讀到的隻能是事務2對其更新前的版本,要不就是事務2送出後的版本
  • 事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束

REPEATABLE_READ

  • 事務在讀取某資料的瞬間(就是開始讀取的瞬間),必須先對其加行級共享鎖,直到事務結束才釋放
  • 事務在更新某資料的瞬間(就是發生更新的瞬間),必須先對其加行級排他鎖,直到事務結束才釋放

表現

  • 事務1讀取某行記錄時,事務2也能對這行記錄進行讀取、更新;當事務2對該記錄進行更新時,事務1再次讀取該記錄,讀到的仍然是第一次讀取的那個版本
  • 事務1更新某行記錄時,事務2不能對這行記錄做更新,直到事務1結束

SERIALIZABLE

  • 事務在讀取資料時,必須先對其加表級共享鎖,直到事務結束才釋放
  • 事務在更新資料時,必須先對其加表級排他鎖,直到事務結束才釋放

表現

  • 事務1正在讀取A表中的記錄時,則事務2也能讀取A表,但不能對A表做更新、新增、删除,直到事務1結束
  • 事務1正在更新A表中的記錄時,則事務2不能讀取A表的任意記錄,更不可能對A表做更新、新增、删除,直到事務1結束

5、開始問Java基礎,比如ArrayList和LinkedList的差別,插入較多選用哪個;HashMap和HashTable的差別,選用什麼(我說ConcurrentHashMap)于是問了HashTable和ConcurrentHashMap線程安全的實作方式差別;然後還問了建立線程的兩種方式,start和run的差別

6、問原子操作是什麼意思,原子類是如何實作的。隻記得原子類了,當時回答說可能都用了synchronized關鍵詞,這裡記一下

使用CAS算法,直接由硬體支援保證原子性

CAS記錄三個值,記憶體位置V,預期值A,新值B

如果更新時發現V與A相等,則說明資料沒有被修改過,就用B更新V,否則什麼都不做

7、問了一些深入點的問題,用到什麼設計模式(設計模式還沒看,隻能亂答)他提示我用過單例模式沒有,我說用過,于是要求手寫了一個單例(有點忘記了,估計當時寫錯了)這裡鞏固一下

三個要素
  1. 構造方法私有化,保證無法在外部new一個對象
  2. 靜态屬性指向執行個體
  3. public static的getInstance方法,傳回第二步的靜态屬性
// 餓漢式,直接建立執行個體
public class Singleton {
	private static Object instance = new Object();
	private Singleton() {}
	public static Object getInstance() {
		return instance;
	}
}

// 懶漢式,調用方法時才建立執行個體
public class Singleton {
	private static Object instance;
	private Singleton() {}
	public static Object getInstance() {
		if (null == instance)
			instance = new Object();
		return instance;
	}
}
           

8、問JVM幫助我們優化了什麼東西,舉了個例子是回收記憶體。這個真的不知道怎麼回答,畢竟沒有深入研究過JVM……

9、看我是電氣的,問我為什麼轉行,職業規劃之類的

10、有什麼問題要問我

差不多就這些,感覺自己答的不是太好,很多地方還有欠缺,沒過也不覺得可惜吧。積攢經驗,準備後面的面試