今天小編給大家分享一下java怎么實現(xiàn)可重入的自旋鎖的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、鄖西網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計、商城網(wǎng)站定制開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為鄖西等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
說明
1、是指試圖獲得鎖的線程不會堵塞,而是通過循環(huán)獲得鎖。
2、優(yōu)點:減少上下文切換的消耗。
缺點:循環(huán)消耗CPU。
實例
public class ReentrantSpinLock { private AtomicReferenceowner = new AtomicReference<>(); // 可重入次數(shù) private int count = 0; // 加鎖 public void lock() { Thread current = Thread.currentThread(); if (owner.get() == current) { count++; return; } while (!owner.compareAndSet(null, current)) { System.out.println("--我在自旋--"); } } //解鎖 public void unLock() { Thread current = Thread.currentThread(); //只有持有鎖的線程才能解鎖 if (owner.get() == current) { if (count > 0) { count--; } else { //此處無需CAS操作,因為沒有競爭,因為只有線程持有者才能解鎖 owner.set(null); } } } public static void main(String[] args) { ReentrantSpinLock spinLock = new ReentrantSpinLock(); Runnable runnable = () -> { System.out.println(Thread.currentThread().getName() + "開始嘗試獲取自旋鎖"); spinLock.lock(); try { System.out.println(Thread.currentThread().getName() + "獲取到了自旋鎖"); Thread.sleep(4000); } 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(); } }
以上就是“java怎么實現(xiàn)可重入的自旋鎖”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。