1.AtomicReference
AtomicReference類提供了一個可以原子讀寫的對象引用變量。原子意味着嘗試更改AtomicReference的多個線程(例如:比較和交換操作),不會是AtomicReference最終達到不一致的效果。
AtomicReference有一個先進的方法compareAndSet(),它可以將引用和預期值(引用)進行比較,如果它們值相等,則在AtomicReference對象內設置一個新的引用。
2.概述
自旋鎖(spinlock):是指當一個線程在獲取鎖的時候,如果鎖已經被其他線程獲取,那麼該線程將循環等待,然後不斷地判斷鎖是否能夠被成功獲取,直到獲取到鎖纔會推出循環。
獲取鎖的線程一直處於活躍狀態,但是並沒有執行任何有效的任務,使用這種鎖會造成busy-waiting。
3.自選鎖存在的問題
1.如果某個線程持有鎖的時間過長,就會導致其他等待獲取鎖的線程進入循環等待,消耗CPU。使用不當會造成CPU使用率極高。
2.上面Java實現的自旋鎖是不公平的,即無法滿足等待時間最長的線程有限獲取鎖。不公平的鎖會存在“線程飢餓”問題。