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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java锁 -- 自旋锁

發布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java锁 -- 自旋锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.概念

????????自旋鎖:spinlock,是指嘗試獲取鎖的線程不會立即阻塞,而是采用循環的方式去嘗試獲取鎖,這樣的好處是減少線程上下文切換的消耗,缺點是循環會消耗CPU。

????????之前文章提到的比較并交換,底層使用的就是自旋,自旋就是多次嘗試,多次訪問,不會阻塞的狀態就是自旋。

2.源碼解釋(AtomicInteger?類)

3.自旋鎖的好處

????????循環比較直到成功為止,沒有類似wait的阻塞

4.自旋鎖代碼驗證:

public class SpinLockDemo {// 現在的泛型裝的是Thread,原子引用線程AtomicReference<Thread> atomicReference = new AtomicReference<>();public void myLock() {// 獲取當前進來的線程Thread thread = Thread.currentThread();System.out.println(Thread.currentThread().getName() + "\t come in ");// 開始自旋,期望值是null,更新值是當前線程,如果是null,則更新為當前線程,否者自旋while(!atomicReference.compareAndSet(null, thread)) {}}/*** 解鎖*/public void myUnLock() {// 獲取當前進來的線程Thread thread = Thread.currentThread();// 自己用完了后,把atomicReference變成nullatomicReference.compareAndSet(thread, null);System.out.println(Thread.currentThread().getName() + "\t invoked myUnlock()");}public static void main(String[] args) {SpinLockDemo spinLockDemo = new SpinLockDemo();// 啟動t1線程,開始操作new Thread(() -> {// 開始占有鎖spinLockDemo.myLock();try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}// 開始釋放鎖spinLockDemo.myUnLock();}, "t1").start();// 讓main線程暫停1秒,使得t1線程,先執行try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}// 1秒后,啟動t2線程,開始占用這個鎖new Thread(() -> {// 開始占有鎖spinLockDemo.myLock();// 開始釋放鎖spinLockDemo.myUnLock();}, "t2").start();} }

5.代碼輸出結果

打印輸出結果: t1 come in (--一秒后---) t2 come in (--五秒后---) t1 invoked myUnlock() t2 invoked myUnlock()

總結

以上是生活随笔為你收集整理的java锁 -- 自旋锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。