上篇整理了下后面准備更系統化寫的Java編程進階的思路,如果僅看里面的詞,很多同學會覺得都懂,但我真心覺得沒有多少人是真懂的,所以簡單的想了一些題目,感興趣的同學們可以來做做看,看看自己的Java編程水平怎么樣。
懶得去做小程序了,所以大家就直接回復你的答案吧,我會來一一點評下,友情提醒下,有些題目有點坑。
-
基於BIO實現的Server端,當建立了100個連接時,會有多少個線程?如果基於NIO,又會是多少個線程? 為什么?
-
通常來說基於NIO實現的Server端,會用多少個線程去處理IO事件,為什么?
-
一個典型的客戶端集群->LB->服務端集群這樣的結構中,如客戶端采用連接池,長連接的方式,這種設計你覺得可能會出現什么問題?如果客戶端采用的是單個長連接的方式呢?如果有問題,你覺得應該怎么解決?
-
cglib和Java的動態代理相比,具體有什么不同?
-
在基於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);
}
-
用Executors.newCachedThreadPool創建的線程池,在運行的過程中有可能產生的風險是?
-
new ThreadPoolExecutor(10,100,10,TimeUnit.MILLISECONDS,new LinkedBlockingQueue(10));一個這樣創建的線程池,當已經有10個任務在運行時,第11個任務提交到此線程池執行的時候會發生什么,為什么?
-
實現一個自定義的ThreadFactory的作用通常是?
-
除了用Object.wait和Object.notifyAll來實現線程間的交互外,你還會常用哪些來實現?
-
為什么ConcurrentHashMap可以在高並發的情況下比HashMap更為高效?
-
AtomicInteger、AtomicBoolean這些類之所以在高並發時高效,共同的原因是?
-
請合理的使用Queue來實現一個高並發的生產/消費的場景,給些核心的代碼片段。
-
請實現讓10個任務同時並發啟動,給些代碼片段。
-
在Java程序運行階段,可以用什么命令行工具來查看當前Java程序的一些啟動參數值,例如Heap Size等。
-
用什么命令行工具可以查看運行的Java程序的GC狀況,請具體寫出命令行格式。
-
用什么工具,可以在Java程序運行的情況下跟蹤某個方法的執行時間,請求參數信息等,並請解釋下工具實現的原理。
-
當一個Java程序接收請求,很長時間都沒響應的話,通常你會怎么去排查這種問題?
-
Java進程突然消失了,你會怎么去排查這種問題?
-
以下這段代碼思路,你覺得在運行時可能會產生的風險是,應該如何改進?
public List<User> getUsers(String[] userIds){
// 從數據庫查找符合userIds的user記錄
// 將返回的記錄組裝為User對象,放入List並返回
}
-
以下兩種代碼,在運行時有什么不同?為什么?
第一種
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());
}
-
Java程序為什么通常在剛啟動的時候會執行的比較慢,而處理了一些請求后會變快,AOT能帶來什么幫助?
-
Parallel GC、CMS GC、ZGC、Azul Pauseless GC最主要的不同是?背后的原理也請簡單描述下?
-
請寫一段程序,讓其運行時的表現為觸發5次ygc,然后3次fgc,然后3次ygc,然后1次fgc,請給出代碼以及啟動參數。
-
Go的Coroutine和Java的線程機制最主要的不同是?如果Java語言要透明的實現Coroutine,你覺得主要的難點是?