各大廠面試高頻的面試題新鮮出爐,你能答上幾道?

關於生產環境如何配置線程數,還是要根據業務來進行區分,我們時常會聽到什麼IO密集型、CPU密集型任務...

那麼這裏提一個問題:大家知道什麼樣的任務或者代碼會被認定爲IO/CPU密集?又是用什麼樣的標準來認定IO/CPU密集?

如果你沒有明確的答案,那麼就隨着這篇文章一起來聊一聊吧。

開篇之前我們先來了解下什麼是CPU密集型和IO密集型

CPU密集型(CPU-bound)

CPU密集型也叫計算密集型,顧名思義就是應用需要非常多的CPU計算資源,系統運作大部分的狀況是CPU Loading 100%,CPU要讀/寫I/O(硬盤/內存),I/O在很短的時間就可以完成,而CPU還有許多運算要處理,CPU Loading很高。

在多核CPU時代,我們要讓每一個CPU核心都參與計算,將CPU的性能充分利用起來,這樣纔算是沒有浪費服務器配置,如果在非常好的服務器配置上還運行着單線程程序那將是多麼重大的浪費。

代碼體現:

int n = 0.0
for (i in 0..9999999) {
    n = Math.cos(i.toDouble()
    )

平常開發應用場景:CPU密集型任務一般來說:計算型代碼、Bitmap轉換、Gson轉換等


IO密集型(I/O bound)

對於IO密集型的應用,就很好理解了,我們現在做的開發大部分都是WEB應用,涉及到大量的網絡傳輸。不僅如此,與數據庫,與緩存間的交互也涉及到IO,一旦發生IO,線程就會處於等待狀態,當IO結束,數據準備好後,線程纔會繼續執行。因此從這裏可以發現,對於IO密集型的應用,我們可以多設置一些線程池中線程的數量,這樣就能讓在等待的這段時間內,線程可以去做其它事,提高併發處理效率。

代碼體現:

BufferedReader br =new BufferedReader(new FileReader("xxxx"), 1024);
try {
    while (br.readLine() != null) {}
finally {
    if (br != null) {
        br.close()
    }


平常開發應用場景:文件讀寫、DB讀寫、網絡請求等


日常開發中如何優化:

計算密集型任務的特點是要進行大量的計算,消耗CPU資源,比如計算圓周率、對視頻進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多任務完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低。所以,要最高效地利用CPU,計算密集型任務同時進行的數量應當等於CPU的核心數

線程數 = CPU核數+1

也可以設置成CPU核數*2,這還是要看JDK的使用版本,以及CPU配置(服務器的CPU有超線程)。對於JDK1.8來說,裏面增加了一個並行計算,計算密集型的較理想線程數 = CPU內核線程數*2



IO密集型,涉及到網絡、磁盤IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因爲IO的速度遠遠低於CPU和內存的速度)。對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如Web應用

線程數 = CPU核心數/(1-阻塞係數)

這個阻塞係數一般爲0.8~0.9之間,也可以取0.8或者0.9。套用公式,對於雙核CPU來說,它比較理想的線程數就是20,當然這都不是絕對的,需要根據實際情況以及實際業務來調整。




Java併發內容還有很多比如同步工具類、lock類原子類、集合相關類、Executor框架相關類

當然還有一張更詳細的圖

內容容太多,很多小夥伴都迫不及待的想獲取,但是併發知識大,一口喫不下。想成爲一名優秀的Java開發,學好併發還是要靜下心來好好學習,學好了絕對是你走入高薪行列的必備能力。


這次小編週末和京東的Monkey大佬一起吃了個飯,聊了下這個併發編程如何學習,他是這方面的專家,之前在京東內部也做過很多這方面的分享,我特邀請他爲大家來開設專欄小課,內容如下:



《Java併發編程》深度精講!這期課程是根據一線大廠面試內容專門開設,並且限時0.02元!針對技術人的面試考點與成長路徑,給程序員傳授實用的技能跟面試技巧,培養真正符合一線互聯網公司用人需求的人才。針對具體技能進行深度剖析講解,結合一線互聯網大廠熱門面試題詳析,搞定大廠面試,拿下心儀offer。


趕緊上車,報名的同學還有機會獲取金三銀四面試書一本。點擊掃碼,即可購課~


點擊閱讀原文也可購課~

本文分享自微信公衆號 - Java中文社羣(javacn666)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章