java锁 -- 自旋锁
生活随笔
收集整理的這篇文章主要介紹了
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锁 -- 自旋锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RemoteTestkit远程真机调试平
- 下一篇: mac outlook删除服务器邮件,设