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

Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖

 更新時間:2015年04月14日 09:08:38   投稿:junjie  
這篇文章主要介紹了Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖,本文講解了ReentrantLock概況、Lock接口、Lock使用、輪詢鎖的和定時鎖、公平性、可中斷獲鎖獲取操作等內(nèi)容,需要的朋友可以參考下

在Java5.0之前,只有synchronized(內(nèi)置鎖)和volatile. Java5.0后引入了顯示鎖ReentrantLock.

ReentrantLock概況

ReentrantLock是可重入的鎖,它不同于內(nèi)置鎖, 它在每次使用都需要顯示的加鎖和解鎖, 而且提供了更高級的特性:公平鎖, 定時鎖, 有條件鎖, 可輪詢鎖, 可中斷鎖. 可以有效避免死鎖的活躍性問題.ReentrantLock實(shí)現(xiàn)了

Lock接口:

復(fù)制代碼 代碼如下:

  public interface Lock {
          //阻塞直到獲得鎖或者中斷
          void lock();

          //阻塞直到獲得鎖或者中斷拋異常
          void lockInterruptibly() throws InterruptedException;

          //只有鎖可用時才獲得,否則直接返回
          boolean tryLock();

          //只有鎖在指定時間內(nèi)可用時才獲得,否則直接返回,中斷時拋異常
          boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

          void unlock();

          //返回一個綁定在這個鎖上的條件
          Condition newCondition();
  }

Lock使用

復(fù)制代碼 代碼如下:

        Lock lock = new ReentrantLock();
        lock.lock();
        try{
            //更新對象狀態(tài)
        }finally{
            //這里注意,一定要有finally代碼塊去解鎖
            //否則容易造成死鎖等活躍性問題
            lock.unlock();
        }
 

ReentrantLock特性

輪詢鎖的和定時鎖

可輪詢和可定時的鎖請求是通過tryLock()方法實(shí)現(xiàn)的,和無條件獲取鎖不一樣. ReentrantLock可以有靈活的容錯機(jī)制.死鎖的很多情況是由于順序鎖引起的, 不同線程在試圖獲得鎖的時候阻塞,并且不釋放自己已經(jīng)持有的鎖, 最后造成死鎖. tryLock()方法在試圖獲得鎖的時候,如果該鎖已經(jīng)被其它線程持有,則按照設(shè)置方式立刻返回,而不是一直阻塞等下去,同時在返回后釋放自己持有的鎖.可以根據(jù)返回的結(jié)果進(jìn)行重試或者取消,進(jìn)而避免死鎖的發(fā)生.

公平性

ReentrantLock構(gòu)造函數(shù)中提供公平性鎖和非公平鎖(默認(rèn))兩種選擇。所謂公平鎖,線程將按照他們發(fā)出請求的順序來獲取鎖,不允許插隊(duì);但在非公平鎖上,則允許插隊(duì):當(dāng)一個線程發(fā)生獲取鎖的請求的時刻,如果這個鎖是可用的,那這個線程將跳過所在隊(duì)列里等待線程并獲得鎖。我們一般希望所有鎖是非公平的。因?yàn)楫?dāng)執(zhí)行加鎖操作時,公平性將講由于線程掛起和恢復(fù)線程時開銷而極大的降低性能??紤]這么一種情況:A線程持有鎖,B線程請求這個鎖,因此B線程被掛起;A線程釋放這個鎖時,B線程將被喚醒,因此再次嘗試獲取鎖;與此同時,C線程也請求獲取這個鎖,那么C線程很可能在B線程被完全喚醒之前獲得、使用以及釋放這個鎖。這是種雙贏的局面,B獲取鎖的時刻(B被喚醒后才能獲取鎖)并沒有推遲,C更早地獲取了鎖,并且吞吐量也獲得了提高。在大多數(shù)情況下,非公平鎖的性能要高于公平鎖的性能。

可中斷獲鎖獲取操作

lockInterruptibly方法能夠在獲取鎖的同時保持對中斷的響應(yīng),因此無需創(chuàng)建其它類型的不可中斷阻塞操作。

讀寫鎖ReadWriteLock

​ReentrantLock是一種標(biāo)準(zhǔn)的互斥鎖,每次最多只有一個線程能持有鎖。讀寫鎖不一樣,暴露了兩個Lock對象,其中一個用于讀操作,而另外一個用于寫操作。

復(fù)制代碼 代碼如下:

public interface ReadWriteLock {
    /**
     * Returns the lock used for reading.
     *
     * @return the lock used for reading.
     */
    Lock readLock();

    /**
     * Returns the lock used for writing.
     *
     * @return the lock used for writing.
     */
    Lock writeLock();
}

可選擇實(shí)現(xiàn):

1.釋放優(yōu)先
2.讀線程插隊(duì)
3.重入性
4.降級
5.升級

ReentrantReadWriteLock實(shí)現(xiàn)了ReadWriteLock接口,構(gòu)造器提供了公平鎖和非公平鎖兩種創(chuàng)建方式。讀寫鎖適用于讀多寫少的情況,可以實(shí)現(xiàn)更好的并發(fā)性。
 
示例

復(fù)制代碼 代碼如下:

public class ReadWriteMap<K, V> {
    private Map<K, V> map;
    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    private final Lock readLock = lock.readLock();
    private final Lock writeLock = lock.writeLock();

    public ReadWriteMap(Map<K, V> map) {
        this.map = map;
    }

    public V get(K key) {
        readLock.lock();
        try {
            return map.get(key);
        } finally {
            readLock.unlock();
        }
    }

    public void put(K key, V value) {
        writeLock.lock();
        try {
            map.put(key, value);
        } finally {
            writeLock.unlock();
        }
    }
}

相關(guān)文章

  • 如何自定義feign調(diào)用實(shí)現(xiàn)hystrix超時、異常熔斷

    如何自定義feign調(diào)用實(shí)現(xiàn)hystrix超時、異常熔斷

    這篇文章主要介紹了自定義feign調(diào)用實(shí)現(xiàn)hystrix超時、異常熔斷的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • IDEA下lombok安裝及找不到get,set的問題的解決方法

    IDEA下lombok安裝及找不到get,set的問題的解決方法

    這篇文章主要介紹了IDEA下lombok安裝及找不到get,set的問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java后臺批量生產(chǎn)echarts圖表并保存圖片

    Java后臺批量生產(chǎn)echarts圖表并保存圖片

    這篇文章主要介紹了Java后臺批量生產(chǎn)echarts圖表并保存圖片,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • Spring IO Platform簡單介紹

    Spring IO Platform簡單介紹

    這篇文章主要介紹了Spring IO Platform簡單介紹,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • Spring基于注解讀取外部配置文件

    Spring基于注解讀取外部配置文件

    這篇文章主要介紹了Spring基于注解讀取外部配置文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • java實(shí)現(xiàn)圖片角度旋轉(zhuǎn)并獲得圖片信息

    java實(shí)現(xiàn)圖片角度旋轉(zhuǎn)并獲得圖片信息

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片角度旋轉(zhuǎn)并獲得圖片信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Java實(shí)現(xiàn)提取圖片邊緣的示例代碼

    Java實(shí)現(xiàn)提取圖片邊緣的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)提取圖片邊緣的功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-06-06
  • JAVA如何獲取jvm和操作系統(tǒng)相關(guān)信息

    JAVA如何獲取jvm和操作系統(tǒng)相關(guān)信息

    這篇文章主要介紹了JAVA獲取jvm和操作系統(tǒng)相關(guān)信息,使用Java自帶的類進(jìn)行獲取系統(tǒng)運(yùn)行的相關(guān)信息,在這整理記錄分享一下,需要的朋友可以參考下
    2022-10-10
  • Lambda表達(dá)式下訪問外部變量問題

    Lambda表達(dá)式下訪問外部變量問題

    這篇文章主要介紹了Lambda表達(dá)式下訪問外部變量問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解如何用Java實(shí)現(xiàn)對m3u8直播流抽幀

    詳解如何用Java實(shí)現(xiàn)對m3u8直播流抽幀

    抽幀(frame extraction)是指從視頻流中提取一些特定的幀,通常是關(guān)鍵幀或者隨機(jī)幀,以供后續(xù)處理。這篇文章主要為大家介紹了如何用Java實(shí)現(xiàn)對m3u8直播流抽幀,需要的可以參考一下
    2023-03-03

最新評論

庄河市| 桓仁| 尼勒克县| 石楼县| 宜阳县| 凯里市| 津南区| 清河县| 伊川县| 驻马店市| 浪卡子县| 呼伦贝尔市| 原平市| 太仆寺旗| 五寨县| 司法| 潞城市| 河曲县| 基隆市| 社会| 贡嘎县| 六盘水市| 洞口县| 乐清市| 博客| 年辖:市辖区| 阿鲁科尔沁旗| 延庆县| 清涧县| 万山特区| 青州市| 吴江市| 千阳县| 宝兴县| 阜平县| 弥勒县| 辰溪县| 巴里| 双鸭山市| 阿克陶县| 驻马店市|