亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

ReentrantLock概況

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

Lock接口:

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

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

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

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

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

          void unlock();

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

Lock使用

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

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

ReentrantLock特性

輪詢鎖的和定時(shí)鎖

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

公平性

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

可中斷獲鎖獲取操作

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

讀寫(xiě)鎖ReadWriteLock

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

復(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.降級(jí)
5.升級(jí)

ReentrantReadWriteLock實(shí)現(xiàn)了ReadWriteLock接口,構(gòu)造器提供了公平鎖和非公平鎖兩種創(chuàng)建方式。讀寫(xiě)鎖適用于讀多寫(xiě)少的情況,可以實(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)文章

  • Springboot?多租戶SaaS搭建方案

    Springboot?多租戶SaaS搭建方案

    這篇文章主要介紹了Springboot?多租戶SaaS方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 一篇文章帶你搞定JAVA內(nèi)存泄漏

    一篇文章帶你搞定JAVA內(nèi)存泄漏

    今天小編就為大家分享一篇關(guān)于Java內(nèi)存泄漏問(wèn)題處理方法經(jīng)驗(yàn)總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2021-07-07
  • Java多線程編程中線程鎖與讀寫(xiě)鎖的使用示例

    Java多線程編程中線程鎖與讀寫(xiě)鎖的使用示例

    這篇文章主要介紹了Java多線程編程中線程鎖與讀寫(xiě)鎖的使用示例,鎖是控制程序多線程并發(fā)的重要手段,需要的朋友可以參考下
    2016-04-04
  • java通過(guò)反射創(chuàng)建對(duì)象并調(diào)用方法

    java通過(guò)反射創(chuàng)建對(duì)象并調(diào)用方法

    這篇文章主要介紹了java通過(guò)反射創(chuàng)建對(duì)象并調(diào)用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 深入理解Java中的接口

    深入理解Java中的接口

    下面小編就為大家?guī)?lái)一篇深入理解Java中的接口。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05
  • Spring Cloud Zuul路由網(wǎng)關(guān)服務(wù)過(guò)濾實(shí)現(xiàn)代碼

    Spring Cloud Zuul路由網(wǎng)關(guān)服務(wù)過(guò)濾實(shí)現(xiàn)代碼

    這篇文章主要介紹了Spring Cloud Zuul路由網(wǎng)關(guān)服務(wù)過(guò)濾實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java愛(ài)心代碼完整示例(脫單必備)

    java愛(ài)心代碼完整示例(脫單必備)

    最近看到個(gè)好玩的,就是用代碼實(shí)現(xiàn)愛(ài)心的形狀,對(duì)于不懂編程的人來(lái)說(shuō),這是一個(gè)很好的玩的東西,這篇文章主要給大家介紹了關(guān)于java愛(ài)心代碼的相關(guān)資料,需要的朋友可以參考下
    2023-07-07
  • 解決	Spring RestTemplate post傳遞參數(shù)時(shí)報(bào)錯(cuò)問(wèn)題

    解決 Spring RestTemplate post傳遞參數(shù)時(shí)報(bào)錯(cuò)問(wèn)題

    本文詳解說(shuō)明了RestTemplate post傳遞參數(shù)時(shí)報(bào)錯(cuò)的問(wèn)題及其原由,需要的朋友可以參考下
    2020-02-02
  • mybatis-plus用insertBatchSomeColumn方法批量新增指定字段

    mybatis-plus用insertBatchSomeColumn方法批量新增指定字段

    mybatisPlus底層的新增方法是一條一條的新增的,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus用insertBatchSomeColumn方法批量新增指定字段的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • servlet實(shí)現(xiàn)簡(jiǎn)單的權(quán)限管理和敏感詞過(guò)濾功能

    servlet實(shí)現(xiàn)簡(jiǎn)單的權(quán)限管理和敏感詞過(guò)濾功能

    JavaEE課要求用servlet和過(guò)濾器實(shí)現(xiàn)權(quán)限管理和敏感詞過(guò)濾功能,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評(píng)論