亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

實(shí)例講解Java 自旋鎖

 更新時(shí)間:2020年09月12日 14:11:10   作者:java小新人  
這篇文章主要介紹了Java 自旋鎖的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java并發(fā),感興趣的朋友可以了解下

  一直以來(lái)不是怎么清楚自旋鎖,最近有點(diǎn)時(shí)間,好好的學(xué)習(xí)了一下;

  所謂的自旋鎖在我的理解就是多個(gè)線程在嘗試獲取鎖的時(shí)候,其中一個(gè)線程獲取鎖之后,其他的線程都處在一直嘗試獲取鎖的狀態(tài),不會(huì)阻塞!??!那么什么叫做一直嘗試獲取鎖呢?就是一個(gè)循環(huán),比較經(jīng)典的是AtomicInteger中的一個(gè)updateAndGet方法,下圖所示(當(dāng)然也可以直接看unsafe類中的getAndAddInt等類似方法);

  我們可以看出在while循環(huán)中使用CAS去嘗試更新一個(gè)變量,如果更新失敗,就會(huì)一直在這個(gè)循環(huán)中一直在嘗試;成功的話,就可以到最后的return語(yǔ)句;

  由此我們可以大概知道如果自旋的線程過(guò)多,那么CPU的資源就會(huì)被大量消耗?。?!

  順便提一個(gè)東西叫做原子引用,官方提供了AtomicInteger,AtomicBoolean等原子類,那么如果我們自己定義的類也需要有原子性怎么辦呢?所以官方提供了一個(gè)AtomicReference類,可以將我們自己定義的類封裝一下,就成了我們自己的原子類,例如AtomicReference<Student> atomicReference = new AtomicReference<>();,然后我們對(duì)Student的實(shí)例進(jìn)行CAS各種CAS操作;

  栗子:

package TestMain;


import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

@Slf4j
public class TestMain80 {
  //一個(gè)Thread類的原子引用
  AtomicReference<Thread> atomicReference = new AtomicReference<>();

  //加鎖的方法
  public void myLock() {
    Thread currentThread = Thread.currentThread();
    log.info("myLock--Thread:{}", currentThread.getName());
    //這個(gè)就是自旋鎖的核心,利用CAS比較當(dāng)前原子引用中是否為null,如果是null,就把當(dāng)前線程A放到里面去,
    // 此時(shí)線程B再到這里,那么就會(huì)CAS失敗,一直在while循環(huán)中
    while (!atomicReference.compareAndSet(null, currentThread)) {

    }
  }

  //解鎖的方法
  public void myUnlock() {
    Thread currentThread = Thread.currentThread();
    //CAS比較原子引用中是不是線程A,是的話就更新為null,此時(shí)在上面while中一直在自旋的線程B就可以跳出來(lái)了
    atomicReference.compareAndSet(currentThread, null);
    log.info("myUnlock--Thread:{}", currentThread.getName());
  }

  public static void main(String[] args) {
    TestMain80 testMain80 = new TestMain80();

    //線程A,首先加鎖,然后等3秒中,然后釋放鎖
    new Thread(() -> {
      testMain80.myLock();
      try {
        TimeUnit.SECONDS.sleep(3);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      testMain80.myUnlock();
    }, "A").start();

    //主線程等1秒,保證A線程先執(zhí)行
    try {
      TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    //線程B,加鎖再釋放鎖
    new Thread(() -> {
      testMain80.myLock();
      testMain80.myUnlock();
    }, "B").start();


  }
}

  上面的就是一個(gè)自旋鎖的栗子,執(zhí)行結(jié)果中首先是執(zhí)行A線程的myLock方法,獲取鎖成功,之后的B線程雖然也會(huì)執(zhí)行mylock方法,但是會(huì)在while循環(huán)中一直阻塞,直到線程A調(diào)用了myUnlock方法釋放鎖,最后兩行才會(huì)打印出來(lái);

以上就是實(shí)例講解Java 自旋鎖的詳細(xì)內(nèi)容,更多關(guān)于Java 自旋鎖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java實(shí)現(xiàn)的冒泡排序算法示例

    java實(shí)現(xiàn)的冒泡排序算法示例

    這篇文章主要介紹了java實(shí)現(xiàn)的冒泡排序算法,結(jié)合實(shí)例形式分析了冒泡排序算法的具體操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-01-01
  • springboot整合JPA訪問(wèn)Mysql的實(shí)現(xiàn)方法

    springboot整合JPA訪問(wèn)Mysql的實(shí)現(xiàn)方法

    本文主要介紹了springboot整合JPA訪問(wèn)Mysql的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 使用Java的Spring框架編寫第一個(gè)程序Hellow world

    使用Java的Spring框架編寫第一個(gè)程序Hellow world

    這篇文章主要介紹了Java的Spring框架并用其開始編寫第一個(gè)程序Hellow world的方法,Spring是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • java 枚舉類中的valueOf用法說(shuō)明

    java 枚舉類中的valueOf用法說(shuō)明

    這篇文章主要介紹了java 枚舉類中的valueOf用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題

    Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題

    這篇文章主要介紹了Java如何解決發(fā)送Post請(qǐng)求報(bào)Stream?closed問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java SpringBoot實(shí)現(xiàn)AOP

    Java SpringBoot實(shí)現(xiàn)AOP

    AOP包括連接點(diǎn)(JoinPoint)、切入點(diǎn)(Pointcut)、增強(qiáng)(Advisor)、切面(Aspect)、AOP代理(AOP Proxy),具體的方法和類型下面文章會(huì)舉例說(shuō)明,感興趣的小伙伴和小編一起閱讀全文吧
    2021-09-09
  • java中orElse和orElseGet方法區(qū)別小結(jié)

    java中orElse和orElseGet方法區(qū)別小結(jié)

    這篇文章主要給大家介紹了關(guān)于java中orElse和orElseGet方法區(qū)別的相關(guān)資料,兩者之間的區(qū)別細(xì)微,但是卻在某些場(chǎng)景下顯的很重要,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 詳解Spring注解驅(qū)動(dòng)開發(fā)之屬性賦值

    詳解Spring注解驅(qū)動(dòng)開發(fā)之屬性賦值

    今天帶大家學(xué)習(xí)Spring注解驅(qū)動(dòng)開發(fā)的相關(guān)知識(shí),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • java json不生成null或者空字符串屬性(詳解)

    java json不生成null或者空字符串屬性(詳解)

    下面小編就為大家?guī)?lái)一篇java json不生成null或者空字符串屬性(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • Spring?boot整合jsp和tiles模板示例

    Spring?boot整合jsp和tiles模板示例

    這篇文章主要介紹了Spring?boot整合jsp模板和tiles模板的示例演示過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03

最新評(píng)論