1,效能與可伸縮性
1.1,要想通過併發來獲得更好的效能,需要努力做好兩件事:更有效地利用現有處理資源,以及在出現新的處理資源時使程式盡可能地利用這些新的資源。
1.2,應用程式效能可以採用多個指標來衡量:服務時間,延遲時間,吞吐率,效率,可伸縮性以及容量等
1.3,可伸縮性指的是:當增加計算資源時(如:cpu,記憶體,儲存容量或者i/o寬頻等),程式的吞吐量或者處理能力能相應地增加
1.4,避免不成熟的優化,首先使程式正確,然後再提高執行速度
1.5,在所有併發程式中都包含一些序列部分。如果你認為你的程式中不存在序列部分,那麼可以在仔細檢查一遍
2,執行緒引入的開銷
2.1,上下文切換:如果主線程是唯一的執行緒,那麼它基本上不會被排程出去。另一方面,如果可執行的執行緒數大於cpu的數量,那麼作業系統最終會將某個正在執行的執行緒排程出來,從而是其他執行緒能夠使用cpu,這將導致一次上下文切換。在大多數通用的處理器中,上下文切換的開銷相當於5000-10000個時鐘週期,也就是幾微秒
2,記憶體同步
2.1,在synchronized和volatile提供的可見性保證中可能會使用一些特殊指令,即記憶體柵欄。
2.2,記憶體柵欄可以重新整理快取,使快取無效,重新整理硬體的寫緩衝,以及停止執行管道。記憶體柵欄將抑制一些編譯器優化操作,在記憶體柵欄中,大多數操作都是不能被重排序的。
2.3,現代jvm能通過優化來去掉一些不會發生競爭的鎖,一些更完備的jvm能通過逸出分析(escape analysis)找出不會發布到堆得本地物件(因此這個引用是執行緒本地的)。
2.4,不要過度擔心非競爭同步帶來的開銷,這個基本的機制已經非常快了,並且jvm還能進行額外的優化進一步降低或消除開銷。因此我們應該講優化重點放在那些發生鎖競爭的地方。
3,阻塞
3.1,在鎖上競爭失敗的執行緒,肯定會阻塞,jvm在實現阻塞行為時,可以採用自旋等待(spin-waiting),或者通過作業系統掛起被阻塞的執行緒
3.2,如果等待時間較短,適合採用自旋等待;如果等待時間過長,適合執行緒掛起
Java併發程式設計實戰 第11章 效能與可伸縮性
執行緒最主要的目的是提高程式的執行效能。但執行緒也會引入額外的開銷,如執行緒之間的協調,上下文切換,執行緒的建立和銷毀,執行緒的排程。效能有很多指標,如執行速度,吞吐量,可伸縮性等。可伸縮性指增加計算資源時 如cpu,記憶體,頻寬,儲存容量等 程式的吞吐量或處理能力能相應的增加。amdahl定律 可...
Java併發程式設計實戰 總結
1.可變狀態是至關重要的。所有的併發問題都可以歸結為如何協調對併發狀態的訪問,可變狀態越少,就越容易確保執行緒安全性。2.盡量將域宣告為final型別,除非需要它們是可變的。3.不可變物件一定是執行緒安全的。不可變物件能極大地降低併發程式設計的複雜性。它們更為簡單而且安全,可以任意共享而無須使用加鎖...
java併發程式設計實戰 簡介
1 併發和並行的區別 併發 多個程式在同一時間段執行,只有乙個cpu。並行 多個程式在同一時刻執行,有多個cpu。2 執行緒帶來的風險 1 安全性問題 永遠不發生糟糕的事情 兩個或多個執行緒同時訪問乙個變數,可能會出現差錯。例如,兩個執行緒同時對乙個變數執行讀操作,從而它們得到了相同的值,違背了該變...