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

Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解

 更新時(shí)間:2019年09月06日 09:30:33   作者:慢慢來  
這篇文章主要介紹了Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

讀寫鎖ReentrantReadWriteLock概述

讀寫鎖ReentrantReadWriteLock,使用它比ReentrantLock效率更高。

讀寫鎖表示兩個(gè)鎖,一個(gè)是讀操作相關(guān)的鎖,稱為共享鎖;另一個(gè)是寫操作相關(guān)的鎖,稱為排他鎖。

1、讀和讀之間不互斥,因?yàn)樽x操作不會(huì)有線程安全問題

2、寫和寫之間互斥,避免一個(gè)寫操作影響另外一個(gè)寫操作,引發(fā)線程安全問題

3、讀和寫之間互斥,避免讀操作的時(shí)候?qū)懖僮餍薷牧藘?nèi)容,引發(fā)線程安全問題

多個(gè)Thread可以同時(shí)進(jìn)行讀取操作,但是同一時(shí)刻只允許一個(gè)Thread進(jìn)行寫入操作。

讀操作和讀操作共享

請(qǐng)看例子

ThreadDomain44類和main方法

public class ThreadDomain44 extends ReentrantReadWriteLock
{
  public void read()
  {
    try
    {
      readLock().lock();
      System.out.println(Thread.currentThread().getName() + "獲得了讀鎖, 時(shí)間為" +
          System.currentTimeMillis());
      Thread.sleep(10000);
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
    finally
    {
      readLock().unlock();
    }
  }
  public static void main(String[] args)
  {
    final ThreadDomain44 td = new ThreadDomain44();
    Runnable readRunnable = new Runnable()
    {
      public void run()
      {
        td.read();
      }
    };
    Thread t0 = new Thread(readRunnable);
    Thread t1 = new Thread(readRunnable);
    t0.start();
    t1.start();
  }
}

輸出結(jié)果如下

Thread-0獲得了讀鎖, 時(shí)間為1564018325618
Thread-1獲得了讀鎖, 時(shí)間為1564018325618

盡管加了Thread.sleep(10000);兩個(gè)線程幾乎同時(shí)執(zhí)行l(wèi)ock()后面的方法。說明readLock().lock()允許多個(gè)線程執(zhí)行并且能提高執(zhí)行效率。

寫操作和寫操作互斥

請(qǐng)看例子

public class ThreadDomain45 extends ReentrantReadWriteLock {
  public void write()
  {
    try
    {
      writeLock().lock();
      System.out.println(Thread.currentThread().getName() + "獲得了寫鎖, 時(shí)間為" +
          new Date());
      Thread.sleep(10000);
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
    finally
    {
      writeLock().unlock();
    }
  }

  public static void main(String[] args)
  {
    final ThreadDomain45 td = new ThreadDomain45();
    Runnable readRunnable = new Runnable()
    {
      public void run()
      {
        td.write();
      }
    };
    Thread t0 = new Thread(readRunnable);
    Thread t1 = new Thread(readRunnable);
    t0.start();
    t1.start();
  }
}

輸出結(jié)果

Thread-1獲得了寫鎖, 時(shí)間為Tue Jul 30 11:26:21 CST 2019
Thread-0獲得了寫鎖, 時(shí)間為Tue Jul 30 11:26:31 CST 2019

可以看到,后獲得鎖的Thread-0等待了十秒,說明寫和寫互斥

讀操作和寫操作互斥/寫操作和讀操作互斥

例子如下

public class ThreadDomain46 extends ReentrantReadWriteLock {
  public void write()
  {
    try
    {
      writeLock().lock();
      System.out.println(Thread.currentThread().getName() + "獲得了寫鎖, 時(shí)間為" +
          new Date());
      Thread.sleep(10000);
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
    finally
    {
      writeLock().unlock();
    }
  }

  public void read()
  {
    try
    {
      readLock().lock();
      System.out.println(Thread.currentThread().getName() + "獲得了讀鎖, 時(shí)間為" +
          new Date());
      Thread.sleep(10000);
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
    finally
    {
      readLock().unlock();
    }
  }

  public static void main(String[] args)
  {
    final ThreadDomain46 td = new ThreadDomain46();
    Runnable readRunnable = new Runnable()
    {
      public void run()
      {
        td.read();
      }
    };
    Runnable writeRunnable = new Runnable()
    {
      public void run()
      {
        td.write();
      }
    };
    Thread t0 = new Thread(readRunnable);
    Thread t1 = new Thread(writeRunnable);
    t0.start();
    t1.start();
  }
}

輸出結(jié)果如下

Thread-0獲得了讀鎖, 時(shí)間為Tue Jul 30 11:49:15 CST 2019
Thread-1獲得了寫鎖, 時(shí)間為Tue Jul 30 11:49:26 CST 2019

可以看到Thread-0獲得讀鎖執(zhí)行完10s后Thread-1才獲得了寫鎖,說明讀操作和寫操作互斥。
另一種輸出結(jié)果如下

Thread-1獲得了寫鎖, 時(shí)間為Tue Jul 30 14:14:07 CST 2019
Thread-0獲得了讀鎖, 時(shí)間為Tue Jul 30 14:14:17 CST 2019

可以看到Thread-1獲得寫鎖執(zhí)行完10s后Thread-0才獲得了讀鎖,說明寫操作和讀操作互斥。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java如何實(shí)現(xiàn)通過證書訪問Https請(qǐng)求

    Java如何實(shí)現(xiàn)通過證書訪問Https請(qǐng)求

    這篇文章主要介紹了Java如何實(shí)現(xiàn)通過證書訪問Https請(qǐng)求,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java 數(shù)據(jù)庫連接池 DBCP 的介紹

    Java 數(shù)據(jù)庫連接池 DBCP 的介紹

    這篇文章主要給大家分享的是 Java 數(shù)據(jù)庫連接池 DBCP 的介紹, 是 Apache 旗下 Commons 項(xiàng)目下的一個(gè)子項(xiàng)目,提供連接池功能DBCP,下面來看看文章的具體介紹內(nèi)容吧,需要的朋友可以參考一下
    2021-11-11
  • Java開啟JMX遠(yuǎn)程監(jiān)控服務(wù)配置

    Java開啟JMX遠(yuǎn)程監(jiān)控服務(wù)配置

    這篇文章主要為大家介紹了Java開啟JMX遠(yuǎn)程監(jiān)控的服務(wù)配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 教你使用java實(shí)現(xiàn)去除各種空格

    教你使用java實(shí)現(xiàn)去除各種空格

    本文給大家匯總介紹了5種java中去除空格的方法,分別是String.trim()、str.replace(" ", "");、replaceAll(" +","");以及自定義的remove函數(shù),非常的簡(jiǎn)單實(shí)用,需要的小伙伴可以參考下。
    2015-03-03
  • Java責(zé)任鏈模式定義與用法分析

    Java責(zé)任鏈模式定義與用法分析

    這篇文章主要介紹了Java責(zé)任鏈模式定義與用法,結(jié)合具體實(shí)例分析了java責(zé)任鏈模式的功能、定義、使用方法、適用情況等,需要的朋友可以參考下
    2017-06-06
  • Java 八種基本類型和基本類型封裝類

    Java 八種基本類型和基本類型封裝類

    八種基本數(shù)據(jù)類型分別是:int、short、float、double、long、boolean、byte、char;下面跟隨腳本之家小編一起學(xué)習(xí)java八種基本類型和基本類型封裝類
    2017-09-09
  • Hadoop之Mapreduce序列化

    Hadoop之Mapreduce序列化

    本文主要帶我們了解Mapreduce序列化,序列化就是把內(nèi)存中的對(duì)象,轉(zhuǎn)換成字節(jié)序列(或其他數(shù)據(jù)傳輸協(xié)議)以便于存儲(chǔ)到磁盤(持久化)和網(wǎng)絡(luò)傳輸。想進(jìn)一步了解更多的小伙伴,可以參考閱讀本文
    2023-03-03
  • Java如何基于okhttp請(qǐng)求SSE接口流式返回詳解

    Java如何基于okhttp請(qǐng)求SSE接口流式返回詳解

    對(duì)于流式返回,Spring Boot提供了兩種不同的方式,下面這篇文章主要給大家介紹了關(guān)于Java如何基于okhttp請(qǐng)求SSE接口流式返回的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • MyBatis類型轉(zhuǎn)換模塊的實(shí)現(xiàn)

    MyBatis類型轉(zhuǎn)換模塊的實(shí)現(xiàn)

    MyBatis是一個(gè)持久層框架ORM框架,實(shí)現(xiàn)數(shù)據(jù)庫中數(shù)據(jù)和Java對(duì)象中的屬性的雙向映射,那么不可避免的就會(huì)碰到類型轉(zhuǎn)換的問題,本文主要介紹了MyBatis類型轉(zhuǎn)換模塊的實(shí)現(xiàn),感興趣的可以了解一下
    2023-09-09
  • C#中NAudio音頻庫的安裝與使用教程詳解

    C#中NAudio音頻庫的安裝與使用教程詳解

    NAudio為.NET平臺(tái)下的開源庫,采用ML-PL協(xié)議,它支持許多音頻操作,可實(shí)現(xiàn)多種API播放與錄制、多種不同音頻格式等功能,下面就跟隨小編一起學(xué)習(xí)一下NAudio的安裝與使用吧
    2023-11-11

最新評(píng)論

贵德县| 长垣县| 五常市| 三亚市| 武鸣县| 苍梧县| 海宁市| 花莲县| 疏勒县| 拉孜县| 邵东县| 方山县| 仁寿县| 泽普县| 黑河市| 建水县| 沙田区| 淅川县| 六枝特区| 扶沟县| 沁水县| 双辽市| 孟津县| 治多县| 霸州市| 阿拉善盟| 谢通门县| 盘山县| 徐汇区| 黎城县| 桃江县| 于都县| 玉山县| 缙云县| 西吉县| 大埔区| 封丘县| 旅游| 库车县| 南江县| 丽水市|