循环尝试,不释放CPU
自旋鎖
自旋鎖是采用讓當前線程不停地的在循環體內執行實現的,當循環的條件被其他線程改變時 才能進入臨界區
由于自旋鎖只是將當前線程不停地執行循環體,不進行線程狀態的改變,所以響應速度更快。但當線程數不停增加時,性能下降明顯,因為每個線程都需要執行,占用CPU時間。如果線程競爭不激烈,并且保持鎖的時間段,適合使用自旋鎖。
在Java1.5版本及以上的并發框架java.util.concurrent的atmoic包下的類基本都是自旋鎖的實現
AtomicInteger的實現:自旋鎖的實現原理是CAS,AtomicInteger中調用unsafe進行自增操作的源碼中的do-while循環就是一個自旋操作,如果修改過程中遇到其他線程競爭導致沒有修改成功,就在while里死循環,直至修改成功
自旋鎖的由來
???????計算機系統資源總是有限的,有些資源需要互斥訪問,因此就有了鎖機制,只有獲得鎖的線程才能訪問資源。鎖保證了每次只有一個線程可以訪問資源。當線程申請一個已經被其他線程占用的鎖,就會出現兩種情況。一種是沒有獲得鎖的線程會阻塞自己,等到鎖被釋放后再被喚起,這就是互斥鎖;另一種是沒有獲得鎖的線程一直循環在那里看是否該鎖的保持者已經釋放了鎖,這就是自旋鎖。
?
自旋鎖的優缺點
???????首先來對比一下互斥鎖和自旋鎖。 ??
互斥鎖:從等待到解鎖過程,線程會從sleep狀態變為running狀態,過程中有線程上下文的切換,搶占CPU等開銷。
自旋鎖:從等待到解鎖過程,線程一直處于running狀態,沒有上下文的切換。
???????自旋鎖不會引起調用者休眠,如果自旋鎖已經被別的線程保持,調用者就一直循環在那里看是否該自旋鎖的保持者釋放了鎖。由于自旋鎖不會引起調用者休眠,所以自旋鎖的效率遠高于互斥鎖。
???????雖然自旋鎖效率比互斥鎖高,但它會存在下面兩個問題:
1、自旋鎖一直占用CPU,在未獲得鎖的情況下,一直運行,如果不能在很短的時間內獲得鎖,會導致CPU效率降低。
2、試圖遞歸地獲得自旋鎖會引起死鎖。遞歸程序決不能在持有自旋鎖時調用它自己,也決不能在遞歸調用時試圖獲得相同的自旋鎖。
???????由此可見,我們要慎重的使用自旋鎖,自旋鎖適合于鎖使用者保持鎖時間比較短并且鎖競爭不激烈的情況。正是由于自旋鎖使用者一般保持鎖時間非常短,因此選擇自旋而不是睡眠是非常必要的,自旋鎖的效率遠高于互斥鎖。
總結
? ? ? ?由于自旋鎖只是在當前線程不停地執行循環體,不進行線程狀態的切換,因此響應速度更快。但當線程數不停增加時,性能下降明顯,因為每個線程都需要占用CPU時間。如果線程競爭不激烈,并且保持鎖的時間很短,則適合使用自旋鎖。
?
總結
以上是生活随笔為你收集整理的循环尝试,不释放CPU的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读写锁的由奢入俭“易”
- 下一篇: 可中断锁