黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 2019最新美團java面試題及答案

2019最新美團java面試題及答案

更新時間:2019-08-20 17:04:47 來源:動力節點 瀏覽3498次

 


美團網的發展速度是超乎想象的,這一在近幾年快速崛起的行業,在技術方面的需求同樣發展是非常迅速的,隨著企業的運營規模在不斷的增加,對于技術人員的數量需求也在不斷的增長。

  

  在java方面的需求也是非常大的,下面我們就主要來看一下在美團java方面美團都是會問到那些問題吧。


  1、任務隊列(taskQueue):用于存放沒有處理的任務。提供一種緩沖機制。


  線程池技術正是關注如何縮短或調整T1,T3時間的技術,從而提高服務器程序性能的。它把T1,T3分別安排在服務器程序的啟動和結束的時間段或者一些空閑的時間段,這樣在服務器程序處理客戶請求時,不會有T1,T3的開銷了。


  線程池不僅調整T1,T3產生的時間段,而且它還顯著減少了創建線程的數目,看一個例子:


  假設一個服務器一天要處理50000個請求,并且每個請求需要一個單獨的線程完成。在線程池中,線程數一般是固定的,所以產生線程總數不會超過線程池中線程的數目,而如果服務器不利用線程池來處理這些請求則線程總數為50000。一般線程池大小是遠小于50000。所以利用線程池的服務器程序不會為了創建50000而在處理請求時浪費時間,從而提高效率。



  2、常見線程池


(1)newSingleThreadExecutor


  單個線程的線程池,即線程池中每次只有一個線程工作,單線程串行執行任務


(2)newFixedThreadExecutor(n)


  固定數量的線程池,沒提交一個任務就是一個線程,直到達到線程池的最大數量,然后后面進入等待隊列直到前面的任務完成才繼續執行


(3)newCacheThreadExecutor(推薦使用)


  可緩存線程池,當線程池大小超過了處理任務所需的線程,那么就會回收部分空閑(一般是60秒無執行)的線程,當有任務來時,又智能的添加新線程來執行。


(4)newScheduleThreadExecutor


  大小無限制的線程池,支持定時和周期性的執行線程



  3、Java 中能創建 volatile 數組嗎?


  能,Java 中可以創建 volatile 類型數組,不過只是一個指向數組的引用,而不是整個數組。我的意思是,如果改變引用指向的數組,將會受到 volatile 的保護,但是如果多個線程同時改變數組的元素,volatile 標示符就不能起到之前的保護作用了。



  4、volatile 能使得一個非原子操作變成原子操作嗎?


  一個典型的例子是在類中有一個 long 類型的成員變量。如果你知道該成員變量會被多個線程訪問,如計數器、價格等,你最好是將其設置為 volatile。為什么?因為 Java 中讀取 long 類型變量不是原子的,需要分成兩步,如果一個線程正在修改該 long 變量的值,另一個線程可能只能看到該值的一半(前 32 位)。但是對一個 volatile 型的 long 或 double 變量的讀寫是原子。



  5、volatile 修飾符的有過什么實踐?


  一種實踐是用 volatile 修飾 long 和 double 變量,使其能按原子類型來讀寫。double 和 long 都是64位寬,因此對這兩種類型的讀是分為兩部分的,第一次讀取第一個 32 位,然后再讀剩下的 32 位,這個過程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫是原子的。volatile 修復符的另一個作用是提供內存屏障(memory barrier),例如在分布式框架中的應用。簡單的說,就是當你寫一個 volatile 變量之前,Java 內存模型會插入一個寫屏障(write barrier),讀一個 volatile 變量之前,會插入一個讀屏障(read barrier)。意思就是說,在你寫一個 volatile 域時,能保證任何線程都能看到你寫的值,同時,在寫之前,也能保證任何數值的更新對所有線程是可見的,因為內存屏障會將其他所有寫的值更新到緩存。



  6、volatile 類型變量提供什么保證?


  volatile 變量提供順序和可見性保證,例如,JVM 或者 JIT為了獲得更好的性能會對語句重排序,但是 volatile 類型變量即使在沒有同步塊的情況下賦值也不會與其他語句重排序。 volatile 提供 happens-before 的保證,確保一個線程的修改能對其他線程是可見的。某些情況下,volatile 還能提供原子性,如讀 64 位數據類型,像 long 和 double 都不是原子的,但 volatile 類型的 double 和 long 就是原子的。



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


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


  (1) Session在調用數據庫查詢功能之前,首先會在一級緩存中通過實體類型和主鍵進行查找,如果一級緩存查找命中且數據狀態合法,則直接返回;


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


  (3) 如果一級緩存查詢失敗則查詢二級緩存,如果二級緩存命中則直接返回;


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


  (5) 根據映射配置和SQL語句得到ResultSet,并創建對應的實體對象;


  (6)將對象納入Session(一級緩存)的管理;


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


  (8) 如果開啟并設置了要使用二級緩存,則將數據對象納入二級緩存;


  (9) 返回數據對象。



  8、Query接口的list方法和iterate方法有什么區別?


  (1)list()方法無法利用一級緩存和二級緩存(對緩存只寫不讀),它只能在開啟查詢緩存的前提下使用查詢緩存;iterate()方法可以充分利用緩存,如果目標數據只讀或者讀取頻繁,使用iterate()方法可以減少性能開銷。


  (2) list()方法不會引起N+1查詢問題,而iterate()方法可能引起N+1查詢問題。



  9、Hibernate如何實現分頁查詢?


  通過Hibernate實現分頁查詢,開發人員只需要提供HQL語句(調用Session的createQuery()方法)或查詢條件(調用Session的createCriteria()方法)、設置查詢起始行數(調用Query或Criteria接口的setFirstResult()方法)和最大查詢行數(調用Query或Criteria接口的setMaxResults()方法),并調用Query或Criteria接口的list()方法,Hibernate會自動生成分頁查詢的SQL語句。



  10、鎖機制有什么用?簡述Hibernate的悲觀鎖和樂觀鎖機制。


  有些業務邏輯在執行過程中要求對數據進行排他性的訪問,于是需要通過一些機制保證在此過程中數據被鎖住不會被外界修改,這就是所謂的鎖機制。


  Hibernate支持悲觀鎖和樂觀鎖兩種鎖機制。悲觀鎖,顧名思義悲觀的認為在數據處理過程中極有可能存在修改數據的并發事務(包括本系統的其他事務或來自外部系統的事務),于是將處理的數據設置為鎖定狀態。悲觀鎖必須依賴數據庫本身的鎖機制才能真正保證數據訪問的排他性,關于數據庫的鎖機制和事務隔離級別在《Java面試題大全(上)》中已經討論過了。樂觀鎖,顧名思義,對并發事務持樂觀態度(認為對數據的并發操作不會經常性的發生),通過更加寬松的鎖機制來解決由于悲觀鎖排他性的數據訪問對系統性能造成的嚴重影響。最常見的樂觀鎖是通過數據版本標識來實現的,讀取數據時獲得數據的版本號,更新數據時將此版本號加1,然后和數據庫表對應記錄的當前版本號進行比較,如果提交的數據版本號大于數據庫中此記錄的當前版本號則更新數據,否則認為是過期數據無法更新。Hibernate中通過Session的get()和load()方法從數據庫中加載對象時可以通過參數指定使用悲觀鎖;而樂觀鎖可以通過給實體類加整型的版本字段再通過XML或@Version注解進行配置。


  提示:使用樂觀鎖會增加了一個版本字段,很明顯這需要額外的空間來存儲這個版本字段,浪費了空間,但是樂觀鎖會讓系統具有更好的并發性,這是對時間的節省。因此樂觀鎖也是典型的空間換時間的策略。



  11、闡述實體對象的三種狀態以及轉換關系。


  最新的Hibernate文檔中為Hibernate對象定義了四種狀態(原來是三種狀態,面試的時候基本上問的也是三種狀態),分別是:瞬時態(new, or transient)、持久態(managed, or persistent)、游狀態(detached)和移除態(removed,以前Hibernate文檔中定義的三種狀態中沒有移除態),如下圖所示,就以前的Hibernate文檔中移除態被視為是瞬時態。


  瞬時態:當new一個實體對象后,這個對象處于瞬時態,即這個對象只是一個保存臨時數據的內存區域,如果沒有變量引用這個對象,則會被JVM的垃圾回收機制回收。這個對象所保存的數據與數據庫沒有任何關系,除非通過Session的save()、saveOrUpdate()、persist()、merge()方法把瞬時態對象與數據庫關聯,并把數據插入或者更新到數據庫,這個對象才轉換為持久態對象。


  持久態:持久態對象的實例在數據庫中有對應的記錄,并擁有一個持久化標識(ID)。對持久態對象進行delete操作后,數據庫中對應的記錄將被刪除,那么持久態對象與數據庫記錄不再存在對應關系,持久態對象變成移除態(可以視為瞬時態)。持久態對象被修改變更后,不會馬上同步到數據庫,直到數據庫事務提交。


  游離態:當Session進行了close()、clear()、evict()或flush()后,實體對象從持久態變成游離態,對象雖然擁有持久和與數據庫對應記錄一致的標識值,但是因為對象已經從會話中清除掉,對象不在持久化管理之內,所以處于游離態(也叫脫管態)。游離態的對象與臨時狀態對象是十分相似的,只是它還含有持久化標識。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 2021国产成人午夜精品 | 中文字幕一区二区三 | 欧美日韩动漫 | 最近2019中文字幕大全7 | 大香人蕉免费视频75 | 国产ppp视频在线观看 | 色九九视频 | 免费看三级黄色片 | 久操手机在线视频 | 午夜在线播放免费人成无 | 一级国产黄色片 | 男人女人真曰批视频大全免费观看 | 欧美精品video | 日韩综合| 青青草狠狠操 | 日批日韩在线观看 | 欧美黑人巨大xxxx猛交 | 在线天堂中文在线网 | 日韩高清成人 | 午夜视频一区二区三区 | 色老头成人免费视频天天综合 | 日韩一级黄色录像 | 男人的天堂色偷偷之色偷偷 | 在线观看黄色毛片 | 一区二区三区波多野结衣 | 新久草视频 | 久久亚洲高清观看 | www.黑丝| 911精品国产亚洲日本美国韩国 | 777色狠狠一区二区三区香蕉 | 成人看免费一级毛片 | 日韩三级影院 | 成人国产第一区在线观看 | 亚洲欧美一区二区三区另类 | 一个人免费观看的www视频 | 日韩理论在线播放 | 丁香五月缴情综合网 | 成人国产一区二区三区精品 | 一级大片免费观看 | 欧美日韩国产手机在线观看视频 | 欧美国产日韩在线播放 |