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

java?讀寫鎖的使用及它的優(yōu)點

 更新時間:2022年05月10日 11:14:03   作者:??Java中文社群????  
這篇文章主要介紹了java?讀寫鎖的使用及它的優(yōu)點,讀寫鎖的特點就是是讀讀不互斥、讀寫互斥、寫寫互斥,下面具體使用分享需要的小伙伴可以參考一下

前言:

讀寫鎖(Readers-Writer Lock)顧名思義是一把鎖分為兩部分:讀鎖和寫鎖,其中讀鎖允許多個線程同時獲得,因為讀操作本身是線程安全的,而寫鎖則是互斥鎖,不允許多個線程同時獲得寫鎖,并且寫操作和讀操作也是互斥的??偨Y來說,讀寫鎖的特點是:讀讀不互斥、讀寫互斥、寫寫互斥。

1.讀寫鎖使用

在 Java 語言中,讀寫鎖是使用 ReentrantReadWriteLock 類來實現(xiàn)的,其中:

  • ReentrantReadWriteLock.ReadLock表示讀鎖,它提供了 lock 方法進行加鎖、unlock 方法進行解鎖。
  • ReentrantReadWriteLock.WriteLock表示寫鎖,它提供了 lock 方法進行加鎖、unlock 方法進行解鎖。

它的基礎使用如下代碼所示:

// 創(chuàng)建讀寫鎖
final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 獲得讀鎖
final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
// 獲得寫鎖
final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();
// 讀鎖使用
readLock.lock();
try {
    // 業(yè)務代碼...
} finally {
    readLock.unlock();
}
// 寫鎖使用
writeLock.lock();
try {
    // 業(yè)務代碼...
} finally {
    writeLock.unlock();
}

1.1 讀讀不互斥

多個線程可以同時獲取到讀鎖,稱之為讀讀不互斥,如下代碼所示:

// 創(chuàng)建讀寫鎖
final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 創(chuàng)建讀鎖
final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
Thread t1 = new Thread(() -> {
    readLock.lock();
    try {
        System.out.println("[t1]得到讀鎖.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t1]釋放讀鎖.");
        readLock.unlock();
    }
});
t1.start();
Thread t2 = new Thread(() -> {
    readLock.lock();
    try {
        System.out.println("[t2]得到讀鎖.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t2]釋放讀鎖.");
        readLock.unlock();
    }
});
t2.start();

以上程序執(zhí)行結果如下: 

1.2 讀寫互斥

讀鎖和寫鎖同時使用是互斥的(也就是不能同時獲得),這稱之為讀寫互斥,如下代碼所示:

// 創(chuàng)建讀寫鎖
final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 創(chuàng)建讀鎖
final ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
// 創(chuàng)建寫鎖
final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();
// 使用讀鎖
Thread t1 = new Thread(() -> {
    readLock.lock();
    try {
        System.out.println("[t1]得到讀鎖.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t1]釋放讀鎖.");
        readLock.unlock();
    }
});
t1.start();
// 使用寫鎖
Thread t2 = new Thread(() -> {
    writeLock.lock();
    try {
        System.out.println("[t2]得到寫鎖.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t2]釋放寫鎖.");
        writeLock.unlock();
    }
});
t2.start();

以上程序執(zhí)行結果如下: 

1.3 寫寫互斥

多個線程同時使用寫鎖也是互斥的,這稱之為寫寫互斥,如下代碼所示:

// 創(chuàng)建讀寫鎖
final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
// 創(chuàng)建寫鎖
final ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();
Thread t1 = new Thread(() -> {
    writeLock.lock();
    try {
        System.out.println("[t1]得到寫鎖.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t1]釋放寫鎖.");
        writeLock.unlock();
    }
});
t1.start();

Thread t2 = new Thread(() -> {
    writeLock.lock();
    try {
        System.out.println("[t2]得到寫鎖.");
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("[t2]釋放寫鎖.");
        writeLock.unlock();
    }
});
t2.start();

以上程序執(zhí)行結果如下: 

2.優(yōu)點分析

  • 提高了程序執(zhí)行性能:多個讀鎖可以同時執(zhí)行,相比于普通鎖在任何情況下都要排隊執(zhí)行來說,讀寫鎖提高了程序的執(zhí)行性能。
  • 避免讀到臨時數據:讀鎖和寫鎖是互斥排隊執(zhí)行的,這樣可以保證了讀取操作不會讀到寫了一半的臨時數據。

3.適用場景

讀寫鎖適合多讀少寫的業(yè)務場景,此時讀寫鎖的優(yōu)勢最大。

總結

讀寫鎖是一把鎖分為兩部分:讀鎖和寫鎖,其中讀鎖允許多個線程同時獲得,而寫鎖則是互斥鎖。它的完整規(guī)則是:讀讀不互斥、讀寫互斥、寫寫互斥。它適用于多讀的業(yè)務場景,使用它可以有效的提高程序的執(zhí)行性能,也能避免讀取到操作了一半的臨時數據。

到此這篇關于java 讀寫鎖的使用及它的優(yōu)點的文章就介紹到這了,更多相關Java讀寫鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Java中的線程模型與線程調度

    詳解Java中的線程模型與線程調度

    這篇文章主要介紹了詳解Java中的線程模型與線程調度的相關資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • java裁剪圖片并保存的示例分享

    java裁剪圖片并保存的示例分享

    在這篇文章中我們將學習如何用Java 對圖像進行剪裁并將剪裁出來的部分單獨保存到文件中
    2014-01-01
  • SpringBoot項目使用slf4j的MDC日志打點功能(最新推薦)

    SpringBoot項目使用slf4j的MDC日志打點功能(最新推薦)

    這篇文章主要介紹了SpringBoot項目使用slf4j的MDC日志打點功能,本文通過示例代碼給大家介紹非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • spring security認證異常后返回中文提示的問題

    spring security認證異常后返回中文提示的問題

    這篇文章主要介紹了spring security認證異常后返回中文提示的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • SpringMVC解析JSON請求數據問題解析

    SpringMVC解析JSON請求數據問題解析

    這篇文章主要介紹了SpringMVC解析JSON請求數據問題解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java Agent入門學習之動態(tài)修改代碼

    Java Agent入門學習之動態(tài)修改代碼

    這篇文章主要給大家分享了Java Agent入門學習之動態(tài)修改代碼的相關資料,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • 關于SpringBoot中Ajax跨域以及Cookie無法獲取丟失問題

    關于SpringBoot中Ajax跨域以及Cookie無法獲取丟失問題

    這篇文章主要介紹了關于SpringBoot中Ajax跨域以及Cookie無法獲取丟失問題,本文具有參考意義,遇到相同或者類似問題的小伙伴希望可以從中找到靈感
    2023-03-03
  • 關于SpringCloud中Ribbon的7種負載均衡策略解析

    關于SpringCloud中Ribbon的7種負載均衡策略解析

    這篇文章主要介紹了關于SpringCloud中Ribbon的7種負載均衡策略解析,服務端負載均衡器的問題是,它提供了更強的流量控制權,但無法滿足不同的消費者希望使用不同負載均衡策略的需求,而使用不同負載均衡策略的場景確實是存在的,需要的朋友可以參考下
    2023-07-07
  • 使用opencsv文件讀寫CSV文件

    使用opencsv文件讀寫CSV文件

    這篇文章主要為大家詳細介紹了用opencsv文件讀寫CSV文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 使用java實現(xiàn)日志工具類分享

    使用java實現(xiàn)日志工具類分享

    這篇文章主要介紹的Java代碼工具類是用于書寫日志信息到指定的文件,并且具有刪除之前日志文件的功能,需要的朋友可以參考下
    2014-03-03

最新評論

垫江县| 潜江市| 泸定县| 什邡市| 西昌市| 上饶县| 昭通市| 乌鲁木齐县| 十堰市| 遵化市| 惠州市| 丹巴县| 潍坊市| 长丰县| 焦作市| 晋江市| 柳林县| 古蔺县| 德庆县| 兴和县| 平湖市| 华容县| 鲜城| 肇源县| 灵台县| 林州市| 北流市| 西乡县| 高雄市| 南皮县| 永年县| 安多县| 垦利县| 安达市| 和田县| 突泉县| 郓城县| 独山县| 抚顺县| 襄垣县| 信阳市|