给这份并发编程宝典总结献出我的膝盖!
關于生產環境如何配置線程數,還是要根據業務來進行區分,我們時常會聽到什么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。
趕緊上車,報名的同學還有機會獲取金三銀四面試書一本。點擊掃碼,即可購課~
點擊閱讀原文也可購課~
總結
以上是生活随笔為你收集整理的给这份并发编程宝典总结献出我的膝盖!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序授权登录的步骤
- 下一篇: 2021-07-20warning: n