91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是AQS、ReentrantLock

發布時間:2021-10-21 10:48:52 來源:億速云 閱讀:161 作者:iii 欄目:編程語言

這篇文章主要講解了“什么是AQS、ReentrantLock”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“什么是AQS、ReentrantLock”吧!

(一)AQS概述

Java并發編程的核心在于java.concurrent.util包,juc中大多數同步器的實現都圍繞了一個公共的行為,比如等待隊列、條件隊列、獨占獲取、共享獲取等,這個行為的抽象就是基于AbstractQueuedSynchronized(AQS)。AQS定義了多線程訪問共享資源的同步器框架。

簡單來講,AQS就好比一個行為準則,而并發包中的大多數同步器在這個準則下實現。

AQS具備以下的幾個特性:阻塞等待隊列、共享/獨占、公平/非公平、可重入、允許中斷。

如果你點開JUC發源碼,會發現大量同步器的實現,比如:Lock、Latch、Barrier等都基于AQS實現。

(二)幾個重要的知識點

在AQS中,我們需要記住幾個重要的知識點:

什么是AQS、ReentrantLock

1、AQS的實現通常是定義內部類Sync繼承AQS,將同步器的所有調用都映射到Sync對應的方法上。

2、AQS內部有個屬性叫state,表示資源的可用狀態。state有三種訪問方式getState()、setState()、compareAndSetState()

3、AQS定義了兩種資源的共享方式:獨占(Exclusive)如ReentrantLock、共享(Share)如Semaphore或CountDownLatch

4、AQS中定義了同步等待隊列,用于存放等待線程的一個隊列。

這幾個知識點會在后面的內容中使用到。

(三)ReentrantLock

我們通過ReentrantLock這個示例來更深入的了解AQS。我會通過上面四個知識點去講解ReentrantLock中AQS的使用。

1、首先進入ReentrantLock的源碼內部,直接就能看到ReentrantLock中定義的內部類Sync

什么是AQS、ReentrantLock

Sync繼承了AQS,按AQS去指定同步規則。

2、既然繼承了AQS,ReentrantLock內部也相當于有了state,這個state用來記錄上鎖的次數,ReentrantLock是個可重入鎖,如果多次上鎖,state會記錄上鎖的次數,需要釋放同樣次數的鎖才算把鎖釋放完。

3、ReentrantLock的資源是獨占的,AbstractQueuedSynchronized繼承了一個叫AbstractOwnableSynchronizer的抽象類:

什么是AQS、ReentrantLock

在這個類中,有個變量叫exclusiveOwnerThread,這個變量記錄著當前是哪個線程獨占了鎖。

4、同步等待隊列:由于ReentrantLock是個獨占的鎖,當有一個線程在使用這個鎖的時候,其他線程就要到隊列中去等待,這個隊列是一種基于雙向鏈表的隊列(類CLH隊列),節點中存放線程信息。

什么是AQS、ReentrantLock

(四)可重入鎖

在介紹AQS時,我們講到了AQS中有個狀態值state,這個值用來判斷當前資源的可用狀態。可重入鎖的意思就是對一個對象可以實現多次加鎖,state就用來記錄加鎖的次數。下面寫一段代碼:

public class ReentrantLockTest {
    //定義全局的鎖對象
    private static final Lock lock=new ReentrantLock(true);
    public static int count=0;
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                testlock();
            }
        },"線程A").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                testlock();
            }
        },"線程B").start();
    }

    private static void testlock() {
        lock.lock();
        count++;
        System.out.println(Thread.currentThread().getName()+"第一次加鎖"+count);
        lock.lock();
        count++;
        System.out.println(Thread.currentThread().getName()+"第二次加鎖"+count);
        count--;
        lock.unlock();
        System.out.println(Thread.currentThread().getName()+"第一次解鎖"+count);
        count--;
        lock.unlock();
        System.out.println(Thread.currentThread().getName()+"第二次解鎖"+count);
    }
}

生成兩個線程,讓他們去執行testlock方法,然后在testlock方法的開始和結束加鎖,保證同時只有一個線程可以執行里面的方法。最后的結果是線程有序執行:

什么是AQS、ReentrantLock

在代碼中,我們進行了兩次lock,這就是可重入鎖。我們通過斷點調試,來分析第二次加鎖后lock中的值,下面給出了說明。

什么是AQS、ReentrantLock

(五)公平鎖與非公平鎖

我們在用構造方法創建ReentrantLock的時候,可以傳入一個boolean類型的參數,true或false

private static final Lock lock=new ReentrantLock(true);

這里的true和false代表了創建的ReentrantLock對象是公平鎖還是非公平鎖

什么是AQS、ReentrantLock

感謝各位的閱讀,以上就是“什么是AQS、ReentrantLock”的內容了,經過本文的學習后,相信大家對什么是AQS、ReentrantLock這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

峡江县| 夏津县| 嫩江县| 偃师市| 健康| 绵阳市| 武宣县| 盘山县| 泸州市| 资讯| 新野县| 道孚县| 秀山| 肇东市| 东明县| 富顺县| 天等县| 深圳市| 蒙山县| 洞口县| 新郑市| 调兵山市| 阜城县| 巴彦县| 扎囊县| 甘孜县| 四川省| 海城市| 盐津县| 信丰县| 阜新| 将乐县| 永胜县| 陈巴尔虎旗| 平舆县| 西青区| 高安市| 崇信县| 磴口县| 靖宇县| 遂昌县|