AQS中有三個protected方法:getState, setState, compareAndSetState。
這三個方法是AQS中提供給自定義同步器來獲取state狀態的三個基本工具方法,那麼setState和compareAndSetState都是用來修改狀態的,兩者有什麼不一樣,爲什麼兩者能共存,其各自使用場景分別是什麼?
分析AQS和ReentrantLock的源碼可知:
- compareAndSetState通常用於在獲取到鎖之前,嘗試加鎖時,對state進行修改,這種場景下,由於當前線程不是鎖持有者,所以對state的修改是線程不安全的,也就是說可能存在多個線程都嘗試修改state,所以需要保證對state修改的原子性操作,即使用了unsafe類的本地CAS方法;
- setState方法通常用於當前正持有鎖的線程對state變量進行修改,不存在競爭,是線程安全的,所以此處沒必要用CAS保證原子性,修改的性能更重要。