亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

詳解java并發之重入鎖-ReentrantLock

2024-07-14 08:43:38
字體:
來源:轉載
供稿:網友

前言

目前主流的鎖有兩種,一種是synchronized,另一種就是ReentrantLock,JDK優化到現在目前為止synchronized的性能已經和重入鎖不分伯仲了,但是重入鎖的功能和靈活性要比這個關鍵字多的多,所以重入鎖是可以完全替代synchronized關鍵字的。下面就來介紹這個重入鎖。

正文

ReentrantLock重入鎖是Lock接口里最重要的實現,也是在實際開發中應用最多的一個,我這篇文章更接近實際開發的應用場景,為開發者提供直接上手應用。所以不是所有方法我都講解,有些冷門的方法我不會介紹或一句帶過。

一、首先先看聲明一個重入鎖需要使用到那幾個構造方法

public ReentrantLock() {        sync = new NonfairSync();    } public ReentrantLock(boolean fair) {        sync = fair ? new FairSync() : new NonfairSync();    }

推薦聲明方式

private static ReentrantLock lock = new ReentrantLock(true);private static ReentrantLock locka = new ReentrantLock();

重點說明:

ReentrantLock提供了兩個構造方法,對應兩種聲明方式。

第一種聲明的是公平鎖,所謂公平鎖,就是按照時間先后順序,使先等待的線程先得到鎖,而且,公平鎖不會產生饑餓鎖,也就是只要排隊等待,最終能等待到獲取鎖的機會。

第二種聲明的是非公平鎖,所謂非公平鎖就和公平鎖概念相反,線程等待的順序并不一定是執行的順序,也就是后來進來的線程可能先被執行。

ReentrantLock默認是非公平鎖,因為:公平鎖實現了先進先出的公平性,但是由于來一個線程就加入隊列中,往往都需要阻塞,再由阻塞變為運行,這種上下文切換是非常好性能的。非公平鎖由于允許插隊所以,上下文切換少的多,性能比較好,保證的大的吞吐量,但是容易出現饑餓問題。所以實際生產也是較多的使用非公平鎖。

非公平鎖調用的是NonfairSync方法。

二、加入鎖之后lock方法到底是怎么處理的(只講非公平鎖)
剛才我們說如果是非公平鎖就調用NonfairSync方法,那我們就來看看這個方法都做來什么。

static final class NonfairSync extends Sync {        private static final long serialVersionUID = 7316153563782823691L;         /**         * Performs lock.  Try immediate barge, backing up to normal         * acquire on failure.         */        final void lock() {            if (compareAndSetState(0, 1))                setExclusiveOwnerThread(Thread.currentThread());            else                acquire(1);        }         protected final boolean tryAcquire(int acquires) {            return nonfairTryAcquire(acquires);        }    }

重點說明:

讀前先知:ReentrantLock用state表示“持有鎖的線程已經重復獲取該鎖的次數”。當state(下文用狀態二子代替)等于0時,表示當前沒有線程持有鎖)。
第一步調用compareAndSetState方法,傳了第一參數是期望值0,第二個參數是實際值1,當前這個方法實際是調用了unsafe.compareAndSwapInt實現CAS操作的,也就是上鎖之前狀態必須是0,如果是0調用setExclusiveOwnerThread方法

private transient Thread exclusiveOwnerThread;         protected final void setExclusiveOwnerThread(Thread thread) {        exclusiveOwnerThread = thread;    }

可以看出setExclusiveOwnerThread就是線程設置為當前線程,此時說明有一名線程已經拿到了鎖。大家都是CAS有三個值,如果舊值等于預期值,就把新值賦予上,所以當前線程得到了鎖就會把狀態置為1。

第二步是compareAndSetState方法返回false時,此時調用的是acquire方法,參數傳1

tryAcquire()方法實際是調用了nonfairTryAcquire()方法。

public final void acquire(int arg) {        if (!tryAcquire(arg) &&            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))            selfInterrupt();    } final boolean nonfairTryAcquire(int acquires) {            final Thread current = Thread.currentThread();            int c = getState();            if (c == 0) {                if (compareAndSetState(0, acquires)) {                    setExclusiveOwnerThread(current);                    return true;                }            }            else if (current == getExclusiveOwnerThread()) {                int nextc = c + acquires;                if (nextc < 0) // overflow                    throw new Error("Maximum lock count exceeded");                setState(nextc);                return true;            }            return false;        }

注釋上說的很明白,請求獨占鎖,忽略所有中斷,至少執行一次tryAcquire,如果成功就返回,否則線程進入阻塞--喚醒兩種狀態切換中,直到tryAcquire成功。詳情見鏈接tryAcquire()、addWaiter()、acquireQueued()挨個分析。

 好,到日前為止大家清楚了lock()方法到調用過程,清楚了,為什么只有得到鎖的當前線程才可以執行,沒有得到的會在隊列里不停的利用CAS原理試圖得到鎖,CAS很高效,也就是,為什么ReentrantLock比synchronized高效的原因,缺點是很浪費cpu資源。

三、所有線程都執行完畢后調用unlock()方法

unlock()方法是通過AQS的release(int)方法實現的,我們可以看一下:

public void unlock() {        sync.release(1);    }  public final boolean release(int arg) {        if (tryRelease(arg)) {            Node h = head;            if (h != null && h.waitStatus != 0)                unparkSuccessor(h);            return true;        }        return false;    }

tryRelease()是由子類實現的,我們來看一下ReentrantLock中的Sync對它的實現:

protected final boolean tryRelease(int releases) {            int c = getState() - releases;            if (Thread.currentThread() != getExclusiveOwnerThread())                throw new IllegalMonitorStateException();            boolean free = false;            if (c == 0) {                free = true;                setExclusiveOwnerThread(null);            }            setState(c);            return free;        }

先通過getState獲得狀態標識,如果這個標識和要釋放的數量相等,就會把當前占有鎖的線程設置為null,實現鎖的釋放,然后返回true,否則把狀態標識減去releases再返回false。

以上所述是小編給大家介紹的java并發之重入鎖-ReentrantLock詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩电影第一页| 亚洲精品国偷自产在线99热| 亚洲自拍偷拍色片视频| 九九热精品视频在线播放| 日韩在线中文字| 日韩精品福利在线| 97人人模人人爽人人喊中文字| 欧美日韩高清区| 精品久久香蕉国产线看观看gif| 性金发美女69hd大尺寸| 亚洲精品有码在线| 久久亚洲精品国产亚洲老地址| 有码中文亚洲精品| 亚洲国产精品999| 不用播放器成人网| 国产xxx69麻豆国语对白| 国产欧美婷婷中文| 91在线高清免费观看| 欧美精品在线看| 成人午夜激情网| 亚洲激情在线视频| 麻豆乱码国产一区二区三区| 欧美黄色性视频| 亚洲国产又黄又爽女人高潮的| 91视频免费网站| 国产成人短视频| 久久精品视频一| 一本久久综合亚洲鲁鲁| 91免费观看网站| 国产精品人成电影在线观看| 亚洲精选一区二区| 国产偷国产偷亚洲清高网站| 国产精品美女久久久久久免费| 毛片精品免费在线观看| 国产91在线高潮白浆在线观看| 国产精品第三页| 中文.日本.精品| 国产精品成人国产乱一区| 日韩av手机在线观看| 亚洲图中文字幕| 国产美女精品视频免费观看| 国产日韩欧美中文在线播放| 日韩电影免费在线观看中文字幕| 成人在线播放av| 国内伊人久久久久久网站视频| 成人国产精品一区| 亚洲精品天天看| 精品日本美女福利在线观看| 亚洲亚裔videos黑人hd| 成人免费观看49www在线观看| 精品久久中文字幕久久av| 成人在线观看视频网站| 欧美猛交免费看| 91wwwcom在线观看| 久久免费少妇高潮久久精品99| 久久久国产精品亚洲一区| 在线电影av不卡网址| 伊人久久大香线蕉av一区二区| 亚洲精品欧美极品| 亚洲天天在线日亚洲洲精| 欧美性生交xxxxx久久久| 国产精品自产拍高潮在线观看| 欧美高清视频在线播放| 亚洲精品国产福利| 日本一区二区三区在线播放| 98精品在线视频| www.日韩av.com| 日韩电影中文字幕一区| 欧美二区乱c黑人| 中文字幕亚洲无线码a| 一区二区福利视频| 98午夜经典影视| 亚洲美女在线视频| 国产ts人妖一区二区三区| 精品成人69xx.xyz| 国产精品久久久久久久av电影| 伊人久久久久久久久久| 色琪琪综合男人的天堂aⅴ视频| 亚洲视频在线观看免费| 久久久视频精品| 韩国一区二区电影| 欧美日本亚洲视频| 久久久www成人免费精品张筱雨| 亚洲亚裔videos黑人hd| 亚洲天堂影视av| zzjj国产精品一区二区| 国产精品av电影| 国产精品美女免费看| 青青草原成人在线视频| 欧美激情伊人电影| 欧美在线视频在线播放完整版免费观看| 亚洲午夜未删减在线观看| 国产精品久久久久久久久久尿| 欧美亚洲国产另类| 精品久久中文字幕久久av| 欧美性感美女h网站在线观看免费| 精品国产一区二区三区久久| 欧美国产第二页| 亚洲欧美另类国产| 国产美女久久久| 亚洲男人天堂2019| 欧美精品一区二区三区国产精品| 亚洲第一页自拍| 91免费看片在线| 国模精品视频一区二区三区| www.色综合| 日韩精品福利网站| 国产精品黄色影片导航在线观看| 久久97精品久久久久久久不卡| 国产成人涩涩涩视频在线观看| 成人淫片在线看| 亚洲xxxx妇黄裸体| 91亚洲人电影| 欧美午夜视频在线观看| 国产精品美女www爽爽爽视频| 91在线观看免费高清| 久久精品国产一区| 日韩中文字幕精品| 4438全国亚洲精品在线观看视频| 97超碰国产精品女人人人爽| 国产精品91在线观看| 91国产视频在线| 国a精品视频大全| 国产精品极品美女在线观看免费| 都市激情亚洲色图| 国产精品国产三级国产aⅴ浪潮| 欧美精品18videosex性欧美| 欧美猛男性生活免费| 欧美专区国产专区| 成人黄色免费片| 久久久久在线观看| 国产精品美女免费看| 亚洲欧美制服另类日韩| 欧美黄色三级网站| 91精品国产综合久久男男| 亚洲xxxx做受欧美| 欧美在线视频免费播放| 欧美精品日韩www.p站| 91精品国产91久久久久久久久| 国产精品爽爽爽爽爽爽在线观看| 欧美成人免费在线观看| 国产视频亚洲视频| xvideos国产精品| 91精品国产综合久久香蕉922| 亚洲欧美www| 欧美日韩久久久久| 亚洲欧美日韩国产成人| 91精品啪在线观看麻豆免费| 国产精品高精视频免费| 91在线观看免费| 92看片淫黄大片看国产片| 日韩精品免费综合视频在线播放| 91久久精品国产91性色| 色综合久久88| 97久久精品国产| 国产精品视频在线观看| 国产精品久久激情| 久久久精品在线观看| 欧美日韩亚洲精品内裤| 日韩国产中文字幕| 欧美成人午夜视频| 亚洲福利视频免费观看| 91精品免费看| 97视频在线观看网址|