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