最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實例講解Java 自旋鎖

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

  一直以來不是怎么清楚自旋鎖,最近有點時間,好好的學習了一下;

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

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

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

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

  栗子:

package TestMain;


import lombok.extern.slf4j.Slf4j;

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

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

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

    }
  }

  //解鎖的方法
  public void myUnlock() {
    Thread currentThread = Thread.currentThread();
    //CAS比較原子引用中是不是線程A,是的話就更新為null,此時在上面while中一直在自旋的線程B就可以跳出來了
    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();


  }
}

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

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

相關文章

  • @NonNull導致無法序列化的問題及解決

    @NonNull導致無法序列化的問題及解決

    這篇文章主要介紹了@NonNull導致無法序列化的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • MyBatis中基于別名typeAliases的設置

    MyBatis中基于別名typeAliases的設置

    這篇文章主要介紹了MyBatis中基于別名typeAliases的設置,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java讀取網(wǎng)絡文件的實例代碼

    Java讀取網(wǎng)絡文件的實例代碼

    這篇文章主要介紹了Java讀取網(wǎng)絡文件的實例代碼,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • SpringBoot開發(fā)項目,引入JPA找不到findOne方法的解決

    SpringBoot開發(fā)項目,引入JPA找不到findOne方法的解決

    這篇文章主要介紹了SpringBoot開發(fā)項目,引入JPA找不到findOne方法的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Boot 自定義數(shù)據(jù)源DruidDataSource代碼

    Spring Boot 自定義數(shù)據(jù)源DruidDataSource代碼

    這篇文章主要介紹了Spring Boot 自定義數(shù)據(jù)源DruidDataSource代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • java 文件名截取方法

    java 文件名截取方法

    在實際開發(fā)應用中會應到截取文件名,本文將介紹java中文件名的截取,需要了解的朋友可以參考下
    2012-11-11
  • Java enum實現(xiàn)自增賦值方式

    Java enum實現(xiàn)自增賦值方式

    這篇文章主要介紹了Java enum實現(xiàn)自增賦值方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java實現(xiàn)批量下載選中文件功能

    Java實現(xiàn)批量下載選中文件功能

    這篇文章主要介紹了Java實現(xiàn)批量下載選中文件功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • Spring下Filter過濾器配置全局異常處理的詳細步驟

    Spring下Filter過濾器配置全局異常處理的詳細步驟

    這篇文章主要介紹了Spring下Filter過濾器配置全局異常處理的詳細步驟,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 使用@Autowired可以注入ApplicationContext

    使用@Autowired可以注入ApplicationContext

    這篇文章主要介紹了使用@Autowired可以注入ApplicationContext問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評論

民权县| 普洱| 崇左市| 陆河县| 桑日县| 集贤县| 湾仔区| 上饶县| 东平县| 汾阳市| 富阳市| 南充市| 大连市| 汕尾市| 游戏| 黔西县| 保德县| 封丘县| 蛟河市| 宣威市| 沙湾县| 靖江市| 堆龙德庆县| 阿坝县| 施甸县| 滦南县| 安国市| 涞水县| 吉林省| 陈巴尔虎旗| 淅川县| 天等县| 青阳县| 东港市| 青龙| 青海省| 墨竹工卡县| 博乐市| 时尚| 云安县| 新密市|