1. 程式人生 > >去YY歡聚時代的一次面試經歷

去YY歡聚時代的一次面試經歷

一、2015年11月21日上午初試的面試題如下:

1.   做一下自我介紹

畫出正在做的B2B平臺的架構圖,包括各子系統(ec,buyer,seller,message,order)、SOA(dubbo)、快取Redis、訊息rabbitmq、單點登陸CAS、負載均衡nginx,MySQL資料庫讀寫分離,郵件伺服器postfix

2.   單點登陸的原理

3.   如何防止cookie被盜用

4.   Cookie和Session的區別

5.   Session共享及其好處

6.   Mysql主從資料同步的方式

7.   spring 控制器的載入過程

8.   Spring 例項是單例還是多例?會不會有執行緒問題

9.   如何進行跨機房資料同步?如何保證資料訪問的一致性

10. 資料庫索引有什麼好處?

11. Mysql如何檢視執行計劃?

12. Mysql執行計劃的的順序

13. 如何檢視Mysql中SQL執行的快慢?

14. SQL執行過程net和wait for table的區別?

15. IO與NIO的區別?NIO中select的原理?NIO緩衝區的預設大小?

16. 使用什麼資料庫連線池?連線池的工作 原理?常用連線池C3PO,proxool與JNDI的區別?

17. 快取redis如何應對系統崩潰後的快照問題?

18. Redis的預設鍵大小是多少?

19. 執行緒中sleep與wait的區別?

20. Restful與dubbo的對比?

二、2015年11月25日下午複試的題目

1.IO和NIO的區別和原理?

(1)    IO是面向流的,NIO是面向緩衝區的

Java IO面向流意味著每次從流中讀一個或多個位元組,直至讀取所有位元組,它們沒有被快取在任何地方。此外,它不能前後移動流中的資料。如果需要前後移動從流中讀取的資料,需要先將它快取到一個緩衝區。 

Java NIO的緩衝導向方法略有不同。資料讀取到一個它稍後處理的緩衝區,需要時可在緩衝區中前後移動。這就增加了處理過程中的靈活性。但是,還需要檢查是否該緩衝區中包含所有您需要處理的資料。而且,需確保當更多的資料讀入緩衝區時,不要覆蓋緩衝區裡尚未處理的資料。

(2)    阻塞與非阻塞IO

Java IO的各種流是阻塞的。這意味著,當一個執行緒呼叫read() 或 write()時,該執行緒被阻塞,直到有一些資料被讀取,或資料完全寫入。該執行緒在此期間不能再幹任何事情了。 Java NIO的非阻塞模式,使一個執行緒從某通道傳送請求讀取資料,但是它僅能得到目前可用的資料,如果目前沒有資料可用時,就什麼都不會獲取。而不是保持執行緒阻塞,所以直至資料變的可以讀取之前,該執行緒可以繼續做其他的事情。 非阻塞寫也是如此。一個執行緒請求寫入一些資料到某通道,但不需要等待它完全寫入,這個執行緒同時可以去做別的事情。 執行緒通常將非阻塞IO的空閒時間用於在其它通道上執行IO操作,所以一個單獨的執行緒現在可以管理多個輸入和輸出通道(channel)。

(3)    使用單執行緒Selector來管理多個通道,減少系統開銷

2. NIO中select的實現機制

(1)  建立Selector

(2)  向Selector註冊通道

(3)  SelectionKey

(4)  通過Selector選擇通道

(5)  wakeup

(6)  close()

3.多執行緒中syschronize、volitile、lock的區別和應用

1ReentrantLock擁有Synchronized相同的併發性和記憶體語義,此外還多了鎖投票,定時鎖等候和中斷鎖等候
     
執行緒AB都要獲取物件O的鎖定,假設A獲取了物件O鎖,B將等待A釋放對O的鎖定,
     
如果使用 synchronized,如果A不釋放,B將一直等下去,不能被中斷
     
如果使用ReentrantLock,如果A不釋放,可以使B在等待了足夠長的時間以後,中斷等待,而幹別的事情
 
    ReentrantLock
獲取鎖定與三種方式:
    a)  lock(), 
如果獲取了鎖立即返回,如果別的執行緒持有鎖,當前執行緒則一直處於休眠狀態,直到獲取鎖
    b) tryLock(), 
如果獲取了鎖立即返回true,如果別的執行緒正持有鎖,立即返回false
    c)tryLock(long timeout,TimeUnit unit)
  如果獲取了鎖定立即返回true,如果別的執行緒正持有鎖,會等待引數給定的時間,在等待的過程中,如果獲取了鎖定,就返回true,如果等待超時,返回false
    d) lockInterruptibly:
如果獲取了鎖定立即返回,如果沒有獲取鎖定,當前執行緒處於休眠狀態,直到或者鎖定,或者當前執行緒被別的執行緒中斷
 
2
synchronized是在JVM層面上實現的,不但可以通過一些監控工具監控synchronized的鎖定,而且在程式碼執行時出現異常,JVM會自動釋放鎖定,但是使用Lock則不行,lock是通過程式碼實現的,要保證鎖定一定會被釋放,就必須將unLock()放到finally{}
 
3
、在資源競爭不是很激烈的情況下,Synchronized的效能要優於ReetrantLock,但是在資源競爭很激烈的情況下,Synchronized的效能會下降幾十倍,但是ReetrantLock的效能能維持常態;

4.樂觀鎖和悲觀鎖的區別?

5.資料庫中事務的級別

1.    讀未提交

2.    讀已提交

3.    可重複讀

4.    讀序列化

6. 資料庫行級鎖的應用,修改一條記錄時是否會加上行級鎖

行級鎖的優點有:
 在很多執行緒請求不同記錄時減少衝突鎖。
 事務回滾時減少改變資料。
 使長時間對單獨的一行記錄加鎖成為可能。

行級鎖的缺點有:
 比頁級鎖和表級鎖消耗更多的記憶體。
 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制,不同的資料庫的鎖機制大同小異。由於資料庫資源是一種供許多使用者共享的資源,所以如何保證資料併發訪問的一致性、有效性是所有資料庫必須解決的一個問題,鎖衝突也是影響資料庫併發訪問效能的一個重要因素。瞭解鎖機制不僅可以使我們更有效的開發利用資料庫資源,也使我們能夠更好地維護資料庫,從而提高資料庫的效能。

上述三種鎖的特性可大致歸納如下:
1) 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
2) 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
3) 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。

     三種鎖各有各的特點,若僅從鎖的角度來說,表級鎖更適合於以查詢為主,只有少量按索引條件更新資料的應用,如WEB應用;行級鎖更適合於有大量按索引條件併發更新少量不同資料,同時又有併發查詢的應用,如一些線上事務處理(OLTP)系統。

/* ==================== MySQL InnoDB 鎖表與鎖行 ======================== */

由於InnoDB預設是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL才會執行Row lock (只鎖住被選取的資料例) ,否則MySQL將會執行Table Lock (將整個資料表單給鎖住)。

7.Spring事務的實現方式和實現原理

8.Spring AOP的實現

9.HTTP長連線和短連線的區別

TCP/IP

TCP/IP是個協議組,可分為三個層次:網路層、傳輸層和應用層。

在網路層有IP協議、ICMP協議、ARP協議、RARP協議和BOOTP協議。

在傳輸層中有TCP協議與UDP協議。

在應用層有:TCP包括FTP、HTTP、TELNET、SMTP等協議

                 UDP包括DNS、TFTP等協議

短連線

連線->傳輸資料->關閉連線

HTTP是無狀態的,瀏覽器和伺服器每進行一次HTTP操作,就建立一次連線,但任務結束就中斷連線。

也可以這樣說:短連線是指SOCKET連線後傳送後接收完資料後馬上斷開連線。

 

長連線

連線->傳輸資料->保持連線 -> 傳輸資料-> 。。。 ->關閉連線。

長連線指建立SOCKET連線後不管是否使用都保持連線,但安全性較差。

 

http的長連線

HTTP也可以建立長連線的,使用Connection:keep-alive,HTTP 1.1預設進行持久連線。HTTP1.1和HTTP1.0相比較而言,最大的區別就是增加了持久連線支援(貌似最新的 http1.0 可以顯示的指定 keep-alive),但還是無狀態的,或者說是不可以信任的。

 

什麼時候用長連線,短連線?

 長連線多用於操作頻繁,點對點的通訊,而且連線數不能太多情況,。每個TCP連線都需要三步握手,這需要時間,如果每個操作都是先連線,再操作的話那麼處理速度會降低很多,所以每個操作完後都不斷開,次處理時直接傳送資料包就OK了,不用建立TCP連線。例如:資料庫的連線用長連線, 如果用短連線頻繁的通訊會造成socket錯誤,而且頻繁的socket 建立也是對資源的浪費。

 

而像WEB網站的http服務一般都用短連結,因為長連線對於服務端來說會耗費一定的資源,而像WEB網站這麼頻繁的成千上萬甚至上億客戶端的連線用短連線會更省一些資源,如果用長連線,而且同時有成千上萬的使用者,如果每個使用者都佔用一個連線的話,那可想而知吧。所以併發量大,但每個使用者無需頻繁操作情況下需用短連好。

 

總之,長連線和短連線的選擇要視情況而定。

10.Spring事務的種類和各自的區別

11.Redis的叢集方式,主點掛掉後如何將備點切換成主點

12.Mysql的叢集方式,主備的資料同步方式,主庫掛掉後如何切換從庫為主庫,有沒做過兩主兩備的叢集?

13.如何分析一條慢查詢的SQL,MYSQL執行計劃的類別(all Table,using index,using where)

14.執行緒掛掉後,如何在虛擬機器上分析。

15.CAP一致性、可用性、分割槽容忍性,系統中是犧牲了哪一種。

16.Freemarker的快取機制

17. Zookeeper的實現原理

 

三、HR面試

1.   個人的未來規劃,偏技術還是偏管理?

2.   現在薪酬的組成,基本工資+補貼

3.   想離職的原因?

4.   期望的薪酬情況

個人問題

5.   社保和公積金的基數

基數按工資基數交,公積金的比率是公司交10%,個人交10%~12%

另外公司有四百多補貼

6.   入職後進入哪個團隊?從事什麼專案的開發?