setState 和 compareAndSetState方法作用分析

AQS中有三個protected方法:getState, setState, compareAndSetState。

這三個方法是AQS中提供給自定義同步器來獲取state狀態的三個基本工具方法,那麼setState和compareAndSetState都是用來修改狀態的,兩者有什麼不一樣,爲什麼兩者能共存,其各自使用場景分別是什麼?

分析AQS和ReentrantLock的源碼可知:

  • compareAndSetState通常用於在獲取到鎖之前,嘗試加鎖時,對state進行修改,這種場景下,由於當前線程不是鎖持有者,所以對state的修改是線程不安全的,也就是說可能存在多個線程都嘗試修改state,所以需要保證對state修改的原子性操作,即使用了unsafe類的本地CAS方法;
  • setState方法通常用於當前正持有鎖的線程對state變量進行修改,不存在競爭,是線程安全的,所以此處沒必要用CAS保證原子性,修改的性能更重要。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章