java線程鎖有幾種 多線程編程的時候,使用無鎖結構會不會比有鎖結構更加快?
多線程編程的時候,使用無鎖結構會不會比有鎖結構更加快?這是毫無疑問的,因為線程鎖定是資源密集型的!那么,如何避免鎖的性能下降呢?1、從業(yè)務上避免大量鎖結構!2. 使用ThreadLocal,可以保證每
多線程編程的時候,使用無鎖結構會不會比有鎖結構更加快?
這是毫無疑問的,因為線程鎖定是資源密集型的
!那么,如何避免鎖的性能下降呢?
1、從業(yè)務上避免大量鎖結構
!2. 使用ThreadLocal,可以保證每個線程中的數據不會互相污染
!3. 如果讀多寫少,請使用讀寫鎖
!4. 自旋鎖將挑戰(zhàn)CPU,盡管它是一個線程時間很少的鎖
!5. 鎖的粒度應盡可能?。悍椒▋鹊逆i不應占據整個方法
Java并發(fā)線程的阻塞和喚醒可分為以下幾類:基于JVM的對象頭實現。當多線程競爭相同的關鍵資源時,它們會根據不同的鎖定機制(自旋鎖、輕/重鎖)阻塞和喚醒。
我跳過這里一會兒。一般的實現原理是基于對象的同步隊列與AQS非常相似。
關注AQS(抽象隊列同步器),因為這是JDK和契約實現的基礎(如鎖、阻塞隊列、倒計時鎖等)。
AQS基本上是通過可變狀態(tài)和等待隊列實現的。CAS先修改狀態(tài),失敗后放入等待隊列,通過locksupport掛起線程。
當鎖所有者釋放鎖時,它將通過locksupport喚醒等待隊列中的后續(xù)節(jié)點,并讓它們再次嘗試獲取鎖(CAS修改狀態(tài))。
掌握AQS的原理對于理解JDK中的許多并發(fā)組件非常有幫助。