日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

循环尝试,不释放CPU

發(fā)布時間:2024/4/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 循环尝试,不释放CPU 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

自旋鎖
自旋鎖是采用讓當(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),直至修改成功

package lock.spinlock;import java.util.concurrent.atomic.AtomicReference;/*** 描述: 自旋鎖*/ public class SpinLock {private AtomicReference<Thread> sign = new AtomicReference<>();public void lock() {Thread current = Thread.currentThread();while (!sign.compareAndSet(null, current)) {System.out.println("自旋獲取失敗,再次嘗試");}}public void unlock() {Thread current = Thread.currentThread();sign.compareAndSet(current, null);}public static void main(String[] args) {SpinLock spinLock = new SpinLock();Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "開始嘗試獲取自旋鎖");spinLock.lock();System.out.println(Thread.currentThread().getName() + "獲取到了自旋鎖");try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();} finally {spinLock.unlock();System.out.println(Thread.currentThread().getName() + "釋放了自旋鎖");}}};Thread thread1 = new Thread(runnable);Thread thread2 = new Thread(runnable);thread1.start();thread2.start();} }

自旋鎖的由來

???????計算機系統(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。