天天看點

網際網路5年開發管理崗的經驗之談

  工作了這麼長時間,終于也可以閑下來分享一下這些年的經驗,在這個網際網路時代,不能隻偷偷學,不輸出。

  lz是河北人,大學學習的計算機專業,畢業後又加入教育訓練學校學了一段時間,除了工作之外研究的最多的還是如何面試通過,因為也經常跳槽,這些年在面試上還是下了很多功夫的,找時間都分享出來,希望可以幫到各位同僚。

  我先羅列一下收集的問題

  1.10 個線程和 2 個線程的同步代碼,哪個更容易寫?

  從寫代碼的角度來說,兩者的複雜度是相同的,因為同步代碼與線程數量是互相獨立的。但是同步政策的選擇依賴于線程的數量,因為越多的線程意味着更大的競争,是以你需要利用同步技術,如鎖分離,這要求更複雜的代碼和專業知識。

  2.什麼是 Busy spin?我們為什麼要使用它?

  Busy spin 是一種在不釋放 CPU 的基礎上等待事件的技術。它經常用于避免丢失 CPU 緩存中的資料(如果線程先暫停,之後在其他CPU上運作就會丢失)。是以,如果你的工作要求低延遲,并且你的線程目前沒有任何順序,這樣你就可以通過循環檢測隊列中的新消息來代替調用 sleep() 或 wait() 方法。它唯一的好處就是你隻需等待很短的時間,如幾微秒或幾納秒。LMAX 分布式架構是一個高性能線程間通信的庫,該庫有一個 BusySpinWaitStrategy 類就是基于這個概念實作的,使用 busy spin 循環 EventProcessors 等待屏障。

  3.Java 中怎麼擷取一份線程 dump 檔案?

  在 Linux 下,你可以通過指令 kill -3 PID (Java 程序的程序 ID)來擷取 Java 應用的 dump 檔案。在 Windows 下,你可以按下 Ctrl + Break 來擷取。這樣 JVM 就會将線程的 dump 檔案列印到标準輸出或錯誤檔案中,它可能列印在控制台或者日志檔案中,具體位置依賴應用的配置。如果你使用Tomcat。

  4.啟動一個線程是調用run()還是start()方法?

  答:啟動一個線程是調用start()方法,使線程所代表的虛拟處理機處于可運作狀态,這意味着它可以由JVM 排程并執行,這并不意味着線程就會立即運作。run()方法是線程啟動後要進行回調(callback)的方法。

  5.什麼是DAO模式?

  答:DAO(Data Access Object)顧名思義是一個為資料庫或其他持久化機制提供了抽象接口的對象,在不暴露底層持久化方案實作細節的前提下提供了各種資料通路操作。在實際的開發中,應該将所有對資料源的通路操作進行抽象化後封裝在一個公共API中。用程式設計語言來說,就是建立一個接口,接口中定義了此應用程式中将會用到的所有事務方法。在這個應用程式中,當需要和資料源進行互動的時候則使用這個接口,并且編寫一個單獨的類來實作這個接口,在邏輯上該類對應一個特定的資料存儲。DAO模式實際上包含了兩個模式,一是Data Accessor(資料通路器),二是Data Object(資料對象),前者要解決如何通路資料的問題,而後者要解決的是如何用對象封裝資料。

  6.什麼是ORM?

  答:對象關系映射(Object-Relational Mapping,簡稱ORM)是一種為了解決程式的面向對象模型與資料庫的關系模型互不比對問題的技術;簡單的說,ORM是通過使用描述對象和資料庫之間映射的中繼資料(在Java中可以用XML或者是注解),将程式中的對象自動持久化到關系資料庫中或者将關系資料庫表中的行轉換成Java對象,其本質上就是将資料從一種形式轉換到另外一種形式。

  7.闡述Session加載實體對象的過程。

  答:Session加載實體對象的步驟是:

  ① Session在調用資料庫查詢功能之前,首先會在一級緩存中通過實體類型和主鍵進行查找,如果一級緩存查找命中且資料狀态合法,則直接傳回;

  ② 如果一級緩存沒有命中,接下來Session會在目前NonExists記錄(相當于一個查詢黑名單,如果出現重複的無效查詢可以迅速做出判斷,進而提升性能)中進行查找,如果NonExists中存在同樣的查詢條件,則傳回null;

  ③ 如果一級緩存查詢失敗則查詢二級緩存,如果

二手手遊賬号購買

二級緩存命中則直接傳回;

  ④ 如果之前的查詢都未命中,則發出SQL語句,如果查詢未發現對應記錄則将此次查詢添加到Session的NonExists中加以記錄,并傳回null;

  ⑤ 根據映射配置和SQL語句得到ResultSet,并建立對應的實體對象;

  ⑥ 将對象納入Session(一級緩存)的管理;

  ⑦ 如果有對應的攔截器,則執行攔截器的onLoad方法;

  ⑧ 如果開啟并設定了要使用二級緩存,則将資料對象納入二級緩存;

  ⑨ 傳回資料對象。

  8.說說&和&&的差別。

  &和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都為true時,整個運算結果才為true,否則,隻要有一方為false,則結果為false。 &&還具有短路的功能,即如果第一個表達式為false,則不再計算第二個表達式。 &還可以用作位運算符,當&操作符兩邊的表達式不是boolean類型時,&表示按位與操作。

  9.在JAVA中如何跳出目前的多重嵌套循環?

  在Java中,要想跳出多重循環,可以在外面的循環語句前定義一個标号,然後在裡層循環體的代碼中使用帶有标号的break語句,即可跳出外層循環。

  10.BIO、NIO、AIO 有什麼差別?

  BIO:同步阻塞 IO,就是我們平常使用的傳統 IO,伺服器的實作模式是一個請求連接配接一個線程,并發處理能力低,可能造成不必要的線程開銷,嚴重的還将導緻伺服器記憶體溢出。

  NIO:同步非阻塞 IO,是傳統 IO 的更新,伺服器的實作模式是多個請求一個線程,即請求會注冊到多路複用器Selector上,多路複用器輪詢到連接配接有IO請求時才啟動一個線程處理。

  AIO:異步非阻塞 IO,是 NIO 的更新,也叫 NIO2,伺服器的實作模式為多個有效請求一個線程,用戶端的IO請求都是由OS先完成再通知伺服器應用去啟動線程處理(回調)。

  明天繼續~~