天天看點

java并發程式設計實戰學習筆記之第三部分:活躍性、性能與測試

第十章 避免活躍性危險

鎖順序死鎖:定義鎖的順序,可以通過某種方法決定每個鎖的順序,比如hashcode或者序列号之類的

在鎖的調用順序不是很明顯的情況下,在持有鎖的情況下調用其他外部方法一定要注意,可以通過開放調用,避免發生死鎖的危險,即使用同步代碼塊保護僅僅保護那些共享變量即可,但這種降低鎖粒度的方法可能會使得原本大的代碼塊失去原子性,解決辦法為:将服務的狀态改為關閉之前一直持有鎖,狀态改變之後,其他線程也就能夠看到關閉資訊進而不會再次執行關閉操作。。。

死鎖的診斷與避免:    通過trylock設定定時器來避免死鎖;通過線程轉儲資訊來分析死鎖;多個線程不可以同時使用同一個JDBC連接配接

饑餓與慢響應、活鎖

避免活鎖的辦法:在重試機制中引入随機性

第十一章 性能與可伸索性

性能的衡量名額:運作速度、處理能力

如何評估?如何權衡?

amdahl定律

線程引入的開銷:上下文切換、記憶體同步、

現代的JVM都可以自動優化鎖和記憶體重排序

減少鎖的競争:減少鎖的持有時間、減低鎖的請求頻率、使用帶有協定機制的獨占鎖

1、快入快出

2、将由一個鎖保護的多個變量分解為多個鎖保護的單個變量

對一組獨立對象上的鎖分段

3、使用并發容器代替獨占鎖等方法,如讀寫鎖、不可變對象、原子變量

輕易别用對象池

減小上下文切換開銷