java 併發執行緒個數的確定
阿新 • • 發佈:2019-02-01
本文從控制變數的角度來談決定執行緒個數的依據。模型很簡單,在實際的生產環境中,情況肯定比下文要複雜的多。要充分的進行測試,以使執行緒個數為優。
java應用程式大概分為兩種:cpu密集型和io密集型。
cpu密集型:
就是指執行緒大部分時間都在用cpu,一般來說,普通的操作都需要用到cpu,比如計算,讀取,迴圈,賦值,查詢,排序等等。在最理想的情況下,大牛們建議將執行緒數設定為count(cpu)+-1
io密集型
io操作一般不需要cpu的參與,執行緒在io時,執行緒會被阻塞(執行緒的六個狀態之一就有Blocked)如果一個執行緒完成某項工作一共需要100ms,其中io需要80ms,cpu需要20ms(忽略其他時間).那麼執行緒數應該設立為5.
有鎖的情況
多執行緒為了安全,往往會加鎖。對於關鍵程式碼(被頻繁呼叫的程式碼),往往可以成為執行緒個數的依據之一。對於全域性鎖(比如static上鎖),無論多少個執行緒,程式碼都是序列執行的。這樣執行緒越多反而越不好。對於鎖粒度的越小,對於執行緒併發來說越有利。比如ConcurrentHashMap來說,分了16個segment,也就是加了16把鎖。在理性的情況下,鎖粒度可以降低16倍,那麼自然可以允許16個併發。最壞的情況是16個執行緒去爭用一個segment。這個執行緒的個數需要根據實際情況去調優。