阿里畢玄:來測試下你的Java編程能力

上篇整理了下後面準備更系統化寫的Java編程進階的思路,若是僅看裏面的詞,不少同窗會以爲都懂,但我真心以爲沒有多少人是真懂的,因此簡單的想了一些題目,感興趣的同窗們能夠來作作看,看看本身的Java編程水平怎麼樣。數據庫

懶得去作小程序了,因此你們就直接回復你的答案吧,我會來一一點評下,友情提醒下,有些題目有點坑。編程

  1. 基於BIO實現的Server端,當創建了100個鏈接時,會有多少個線程?若是基於NIO,又會是多少個線程? 爲何?
  2. 一般來講基於NIO實現的Server端,會用多少個線程去處理IO事件,爲何?
  3. 一個典型的客戶端集羣->LB->服務端集羣這樣的結構中,如客戶端採用鏈接池,長鏈接的方式,這種設計你以爲可能會出現什麼問題?若是客戶端採用的是單個長鏈接的方式呢?若是有問題,你以爲應該怎麼解決?
  4. cglib和Java的動態代理相比,具體有什麼不一樣?
  5. 在基於Netty實現FrameDecoder時,下面兩種代碼的表現會有什麼不一樣?

第一種

private void callDecode(...) {

   List<Object> results = new ArrayList<Object>();
   while (cumulation.readable()) {
         int oldReaderIndex = cumulation.readerIndex();
         Object frame = decode(context, channel, cumulation);
         if (frame == null) {
              if (oldReaderIndex == cumulation.readerIndex())
                    break;
              else
                   continue;
        }
       else if (oldReaderIndex == cumulation.readerIndex()) {
              throw new IllegalStateException( ".....");
        }
        results.add(frame);
 }
 if(results.size() > 0)
     fireMessageReceived(context, remoteAddress, results);

}

第二種

private void callDecode(...) {

   int oldReaderIndex = cumulation.readerIndex();
   Object frame = decode(context, channel, cumulation);
   if (frame != null)
          fireMessageReceived(context, remoteAddress, frame);

}
  1. 用Executors.newCachedThreadPool建立的線程池,在運行的過程當中有可能產生的風險是?
  2. new ThreadPoolExecutor(10,100,10,TimeUnit.MILLISECONDS,new LinkedBlockingQueue(10));一個這樣建立的線程池,當已經有10個任務在運行時,第11個任務提交到此線程池執行的時候會發生什麼,爲何?
  3. 實現一個自定義的ThreadFactory的做用一般是?
  4. 除了用Object.wait和Object.notifyAll來實現線程間的交互外,你還會經常使用哪些來實現?
  5. 爲何ConcurrentHashMap能夠在高併發的狀況下比HashMap更爲高效?
  6. AtomicInteger、AtomicBoolean這些類之因此在高併發時高效,共同的緣由是?
  7. 請合理的使用Queue來實現一個高併發的生產/消費的場景,給些核心的代碼片斷。
  8. 請實現讓10個任務同時併發啓動,給些代碼片斷。
  9. 在Java程序運行階段,能夠用什麼命令行工具來查看當前Java程序的一些啓動參數值,例如Heap Size等。
  10. 用什麼命令行工具能夠查看運行的Java程序的GC情況,請具體寫出命令行格式。
  11. 用什麼工具,能夠在Java程序運行的狀況下跟蹤某個方法的執行時間,請求參數信息等,並請解釋下工具實現的原理。
  12. 當一個Java程序接收請求,很長時間都沒響應的話,一般你會怎麼去排查這種問題?
  13. Java進程忽然消失了,你會怎麼去排查這種問題?
  14. 如下這段代碼思路,你以爲在運行時可能會產生的風險是,應該如何改進?
List getUsers(String[] userIds){

   // 從數據庫查找符合userIds的user記錄
  //  將返回的記錄組裝爲User對象,放入List並返回

}
  1. 如下兩種代碼,在運行時有什麼不一樣?爲何?

第一種

private static final boolean isLoggerDebugEnabled = log.isDebugEnabled();
public void xx(User user){

 if(isLoggerDebugEnabled){
      log.debug("enter xx method, user id is: " + user.getId());
 }

}


第二種

public void xx(User user){

 log.debug("enter xx method, user id is: " + user.getId());

}
  1. Java程序爲何一般在剛啓動的時候會執行的比較慢,而處理了一些請求後會變快,AOT能帶來什麼幫助?
  2. Parallel GC、CMS GC、ZGC、Azul Pauseless GC最主要的不一樣是?背後的原理也請簡單描述下?
  3. 請寫一段程序,讓其運行時的表現爲觸發5次ygc,而後3次fgc,而後3次ygc,而後1次fgc,請給出代碼以及啓動參數。
  4. Go的Coroutine和Java的線程機制最主要的不一樣是?若是Java語言要透明的實現Coroutine,你以爲主要的難點是?

 

本文做者:畢玄  小程序

原文連接併發

本文來自雲棲社區合做夥伴「HelloJava」,如需轉載請聯繫原做者。less

相關文章
相關標籤/搜索