成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java并發(fā)編程學(xué)習(xí)之顯示鎖Lock

zone / 1560人閱讀

摘要:顯示鎖和內(nèi)置鎖內(nèi)置鎖優(yōu)勢代碼簡潔不會(huì)因?yàn)闆]釋放鎖,導(dǎo)致鎖泄露。顯示鎖優(yōu)勢靈活性強(qiáng),鎖的獲取可以被中斷,可以嘗試獲取鎖。接口接口主要方法如下獲取鎖嘗試獲取鎖,表示未加鎖的情況。會(huì)進(jìn)行搶鎖操作,如果獲取不到鎖,也會(huì)進(jìn)入阻塞隊(duì)列等到喚醒。

顯示鎖和內(nèi)置鎖 內(nèi)置鎖(Synchronized)優(yōu)勢

代碼簡潔

不會(huì)因?yàn)闆]釋放鎖,導(dǎo)致鎖泄露。

顯示鎖(Lock)優(yōu)勢

靈活性強(qiáng),鎖的獲取可以被中斷,可以嘗試獲取鎖。

讀多寫少等場景。

用法

能用內(nèi)置鎖就用內(nèi)置鎖,不能用內(nèi)置鎖,才考慮用顯示鎖。

Lock接口

接口主要方法如下:

lock():獲取鎖

tryLock():嘗試獲取鎖,true表示未加鎖的情況。

unlock():釋放鎖

newCondition():創(chuàng)建一個(gè)Condition

Condition接口

接口主要方法如下:

await():等待,類似wait方法

signal():喚醒,類似notify方法

signalAll():喚醒全部,類似notifAll方法

使用形式
Lock lock = new ReentrantLock();
....
lock.lock();//獲取鎖
try{
    //業(yè)務(wù)邏輯
}finally{
    lock.unlock();//這邊要注意釋放,不然會(huì)導(dǎo)致鎖泄露
}
示例
public class LockDemo {
    Lock lock = new ReentrantLock();
    static int num = 0;

    public void addNum(int value) {
        lock.lock();
        try {
            int temp = num;
            num = num + value;
            Thread.sleep(100);
            System.out.println(value + "+" + temp + "=" + num);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    static class AddThread1 extends Thread {
        LockDemo lockDemo;

        public AddThread1(LockDemo lockDemo) {
            this.lockDemo = lockDemo;
        }

        @Override
        public void run() {
            lockDemo.addNum(1);
        }
    }

    static class AddThread2 extends Thread {
        LockDemo lockDemo;

        public AddThread2(LockDemo lockDemo) {
            this.lockDemo = lockDemo;
        }

        @Override
        public void run() {
            lockDemo.addNum(2);
        }
    }


    public static void main(String[] args) {
        LockDemo lockDemo = new LockDemo();
        AddThread1 addThread1 = new AddThread1(lockDemo);
        AddThread2 addThread2 = new AddThread2(lockDemo);
        addThread1.start();
        addThread2.start();
    }
}

運(yùn)行結(jié)果如下:

結(jié)果顯示,跟之前synchronized結(jié)果是一樣的,加鎖解鎖成功

公平鎖和非公平鎖

公平鎖:先進(jìn)來的線程先執(zhí)行

非公平鎖:后進(jìn)來的線程可能先執(zhí)行,效率較高。會(huì)進(jìn)行搶鎖操作,如果cas獲取不到鎖,也會(huì)進(jìn)入阻塞隊(duì)列等到喚醒。

ReentrantLock

構(gòu)造參數(shù)有兩個(gè),默認(rèn)是非公平鎖,如果傳參是true,則是公平鎖。

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75572.html

相關(guān)文章

  • java并發(fā)編程學(xué)習(xí)之再談公平和非公平

    摘要:在并發(fā)編程學(xué)習(xí)之顯示鎖里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在源碼分析的基礎(chǔ)上,我們看看和的區(qū)別在什么地方。而非公平鎖直接嘗試獲取鎖。 在java并發(fā)編程學(xué)習(xí)之顯示鎖Lock里有提過公平鎖和非公平鎖,我們知道他的使用方式,以及非公平鎖的性能較高,在AQS源碼分析的基礎(chǔ)上,我們看看NonfairSync和FairSync的區(qū)別在什么地方。 lock方法 ...

    warkiz 評論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之AQS

    摘要:原理全稱,當(dāng)線程去獲取資源的時(shí)候,會(huì)根據(jù)狀態(tài)值來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經(jīng)釋放,如果釋放,則獲取資源。 原理 全稱AbstractQueuedSynchronizer,當(dāng)線程去獲取資源的時(shí)候,會(huì)根據(jù)狀態(tài)值state來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經(jīng)釋放,如果釋放,則獲取資源。 AQS結(jié)構(gòu) ...

    Tikitoo 評論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之ConcurrentHashMap(JDK1.7)

    摘要:之前中提過,并發(fā)的時(shí)候,可能造成死循環(huán),那么在多線程中可以用來避免這一情況。默認(rèn),當(dāng)容量大于時(shí),開始擴(kuò)容并發(fā)數(shù),默認(rèn),直接影響和的值,以及的初始化數(shù)量。初始化的數(shù)量,為最接近且大于的辦等于的次方的值,比如,數(shù)量為,,數(shù)量為。 之前HashMap中提過,并發(fā)的時(shí)候,可能造成死循環(huán),那么在多線程中可以用ConcurrentHashMap來避免這一情況。 Segment Concurrent...

    piglei 評論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之線程的生命周期-wait,notify,notifyall(六)

    摘要:不釋放持有的鎖,釋放鎖。在調(diào)用方法前,必須持有鎖,調(diào)用喚醒,也要持有鎖。休眠一定時(shí)間后,進(jìn)入就緒狀態(tài)。這兩個(gè)都能被方法中斷當(dāng)前狀態(tài)。用法方獲取鎖判斷條件,不滿足繼續(xù)滿足執(zhí)行其他業(yè)務(wù)方獲取鎖改變條件通知為什么是而不是會(huì)一直循環(huán),直到條件滿足。 sleep和wait sleep是Thread類的方法,wait是Object的方法。 sleep可以到處使用,wait必須是在同步方法或者代碼...

    Terry_Tai 評論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之cas(一)

    摘要:線程把的值放在中。線程執(zhí)行,得到的為。,,獨(dú)占鎖,會(huì)導(dǎo)致其他所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖??梢娦?,不保證原子性。樂觀鎖,不適用鎖的情況下實(shí)現(xiàn)多線程的變量同步。性能問題在并發(fā)量較高的情況下,如果一直不成功,會(huì)一直增加的開銷。 cas原理 cas全稱Compare and swap,比較和交換的意思。原子操作,需要硬件的支持。三個(gè)基本操作數(shù):內(nèi)存地址V,舊的預(yù)期值A(chǔ),要修改...

    ConardLi 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<