国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java多線程進階(三)—— J.U.C之locks框架:ReentrantLock

jasperyang / 2561人閱讀

摘要:公平策略在多個線程爭用鎖的情況下,公平策略傾向于將訪問權授予等待時間最長的線程。使用方式的典型調用方式如下二類原理的源碼非常簡單,它通過內部類實現了框架,接口的實現僅僅是對的的簡單封裝,參見原理多線程進階七鎖框架獨占功能剖析

本文首發于一世流云的專欄:https://segmentfault.com/blog...
一、ReentrantLock類簡介

ReentrantLock類,實現了Lock接口,是一種可重入獨占鎖,它具有與使用 synchronized 相同的一些基本行為和語義,但功能更強大。ReentrantLock內部通過內部類實現了AQS框架(AbstractQueuedSynchronizer)的API來實現獨占鎖的功能。

1.1 類聲明

ReentrantLock類直接實現了Lock接口:

1.2 構造聲明

ReentrantLock類提供了兩類構造器:

ReentrantLock類的其中一個構造器提供了指定公平策略 / 非公平策略的功能,默認為非公平策略

公平策略:在多個線程爭用鎖的情況下,公平策略傾向于將訪問權授予等待時間最長的線程。也就是說,相當于有一個線程等待隊列,先進入等待隊列的線程后續會先獲得鎖,這樣按照“先來后到”的原則,對于每一個等待線程都是公平的。
非公平策略:在多個線程爭用鎖的情況下,能夠最終獲得鎖的線程是隨機的(由底層OS調度)。

注意:一般情況下,使用公平策略的程序在多線程訪問時,總體吞吐量(即速度很慢,常常極其慢)比較低,因為此時在線程調度上面的開銷比較大。

舉個例子:
假設采用公平策略,線程A首先獲取了鎖,線程B和線程C等待獲取鎖,如下圖:

當線程A釋放鎖時,線程B將經歷從 掛起->喚醒 的線程調度過程,線程調度非常耗時。

在線程B的 掛起->喚醒 階段:

如果采用非公平策略,那么線程C可以立即獲取鎖,線程C使用完并釋放鎖后,線程B可能才剛喚醒完成;此時線程B又可以去獲取鎖,這樣線程B和線程C的效率都得到提升,系統吞吐量提升;

如果采用公平策略,線程C即使可用,也要等到線程調度完成,整個系統的吞吐量降低。

因此,當線程持有鎖的時間相對較長或者線程請求鎖的平均時間間隔較長時,可以考慮使用公平策略。此時線程調度產生的耗時間隔影響會較小。

1.3 使用方式

ReentrantLock的典型調用方式如下:

class X {
    private final ReentrantLock lock = new ReentrantLock();
    // ...
    public void m() {
        lock.lock(); // block until condition holds
        try {
            // ... method body
        } finally {
            lock.unlock();
        }
    }
}
二、ReentrantLock類原理

ReentrantLock的源碼非常簡單,它通過內部類實現了AQS框架,Lock接口的實現僅僅是對AQS的api的簡單封裝,
參見AQS原理:Java多線程進階(七)—— juc-locks鎖框架:AQS獨占功能剖析(2)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71526.html

相關文章

  • Java線程進階(八)—— J.U.Clocks框架:AQS的Conditon等待(3)

    摘要:關于接口的介紹,可以參見多線程進階二鎖框架接口。最終線程釋放了鎖,并進入阻塞狀態。當線程被通知喚醒時,則是將條件隊列中的結點轉換成等待隊列中的結點,之后的處理就和獨占功能完全一樣。 showImg(https://segmentfault.com/img/remote/1460000016012490); 本文首發于一世流云的專欄:https://segmentfault.com/bl...

    ityouknow 評論0 收藏0
  • Java線程進階(一)—— J.U.C并發包概述

    摘要:整個包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據一系列常見的多線程設計模式,設計了并發包,其中包下提供了一系列基礎的鎖工具,用以對等進行補充增強。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發于一世流云專欄:https...

    anonymoussf 評論0 收藏0
  • Java線程進階(七)—— J.U.Clocks框架:AQS獨占功能剖析(2)

    摘要:開始獲取鎖終于輪到出場了,的調用過程和完全一樣,同樣拿不到鎖,然后加入到等待隊列隊尾然后,在阻塞前需要把前驅結點的狀態置為,以確保將來可以被喚醒至此,的執行也暫告一段落了安心得在等待隊列中睡覺。 showImg(https://segmentfault.com/img/remote/1460000016012467); 本文首發于一世流云的專欄:https://segmentfault...

    JayChen 評論0 收藏0
  • Java線程進階(九)—— J.U.Clocks框架:AQS共享功能剖析(4)

    摘要:好了,繼續向下執行,嘗試獲取鎖失敗后,會調用首先通過方法,將包裝成共享結點,插入等待隊列,插入完成后隊列結構如下然后會進入自旋操作,先嘗試獲取一次鎖,顯然此時是獲取失敗的主線程還未調用,同步狀態還是。 showImg(https://segmentfault.com/img/remote/1460000016012541); 本文首發于一世流云的專欄:https://segmentfa...

    CompileYouth 評論0 收藏0
  • Java線程進階(十)—— J.U.Clocks框架:基于AQS的讀寫鎖(5)

    摘要:關于,最后有兩點規律需要注意當的等待隊列隊首結點是共享結點,說明當前寫鎖被占用,當寫鎖釋放時,會以傳播的方式喚醒頭結點之后緊鄰的各個共享結點。當的等待隊列隊首結點是獨占結點,說明當前讀鎖被使用,當讀鎖釋放歸零后,會喚醒隊首的獨占結點。 showImg(https://segmentfault.com/img/remote/1460000016012293); 本文首發于一世流云的專欄:...

    dunizb 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<