欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java讀寫鎖ReadWriteLock的創(chuàng)建使用及測試分析示例詳解

 更新時(shí)間:2023年01月12日 15:27:35   作者:昵稱為空C  
這篇文章主要為大家介紹了Java讀寫鎖ReadWriteLock的創(chuàng)建使用及測試分析示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

簡介

摘要:本文主要介紹ReadWriteLock,可重入讀寫鎖的基本使用,該鎖只能在單服務(wù)實(shí)例中使用,不適合分布式多服務(wù)實(shí)例集群。

A ReadWriteLock維護(hù)一對(duì)關(guān)聯(lián)的locks,一個(gè)用于只讀操作,一個(gè)用于寫操作。read lock可以由多個(gè)閱讀器同時(shí)進(jìn)行,只要沒有作者 write lock 是獨(dú)家的。

基本意思可分為如下幾種場景

  • 寫鎖不存在、多次加讀鎖成功
  • 寫鎖存在、加讀鎖失敗、加寫鎖失敗
  • 讀鎖不存在、單次加寫鎖成功、多次加寫鎖只有第一個(gè)寫鎖能成功
  • 讀鎖存在、加讀鎖成功、加寫鎖失敗

基本方法介紹

創(chuàng)建讀寫鎖

ReadWriteLock readWriteLock = new ReentrantReadWriteLock();

使用讀鎖readLock().lock()

如果該鎖被寫鎖占有,則該方法會(huì)一直等待鎖

ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
readWriteLock.readLock().lock();

使用讀鎖readLock().tryLock();readLock().tryLock(6L, TimeUnit.SECONDS)

如果該鎖被寫鎖占有,第一個(gè)方法如果獲取不到鎖則返回false,第二個(gè)方法會(huì)等待你設(shè)置的時(shí)間,在你設(shè)置的時(shí)間范圍內(nèi)未獲取到鎖則返回false

ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
readWriteLock.readLock().tryLock();
readWriteLock.readLock().tryLock(6L, TimeUnit.SECONDS);

使用寫鎖writeLock().lock()

如果該鎖被寫鎖占有,則該方法會(huì)一直等待鎖

ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
readWriteLock.writeLock().lock();

使用讀鎖writeLock().tryLock();writeLock().tryLock(6L, TimeUnit.SECONDS)

如果該鎖被寫鎖占有,第一個(gè)方法如果獲取不到鎖則返回false,第二個(gè)方法會(huì)等待你設(shè)置的時(shí)間,在你設(shè)置的時(shí)間范圍內(nèi)未獲取到鎖則返回false

ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
readWriteLock.writeLock().tryLock();
readWriteLock.writeLock().tryLock(6L, TimeUnit.SECONDS);

使用案例

創(chuàng)建LockManager

該實(shí)例的讀方法用了等待6S

public class LockManager {
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    public void write(String message,Long sleep) {
        try{
            if(readWriteLock.writeLock().tryLock()){
                try{
                    Thread.sleep(sleep);
                    System.out.println(Thread.currentThread().getName()+",寫寫寫寫寫寫寫寫寫寫,message="+message);
                }catch (Exception ex){
                    System.out.println(Thread.currentThread().getName()+",寫入異常"+ex);
                }finally {
                    readWriteLock.writeLock().unlock();
                }
            }else{
                System.out.println(Thread.currentThread().getName()+",獲取寫鎖失敗");
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
    public void read(String message,Long sleep){
        try{
            if(readWriteLock.readLock().tryLock(6L, TimeUnit.SECONDS)){
                try{
                    Thread.sleep(sleep);
                    System.out.println(Thread.currentThread().getName()+",讀讀讀讀讀讀讀讀讀讀,message="+message);
                }catch (Exception ex){
                    System.out.println(Thread.currentThread().getName()+",讀取異常"+ex);
                }finally {
                    readWriteLock.readLock().unlock();
                }
            }else{
                System.out.println(Thread.currentThread().getName()+",獲取讀鎖失敗");
            }
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

測試無寫鎖,只有讀鎖

測試方法

第一個(gè)線程等待5S輸出,第二個(gè)線程等待4S輸出

@Test
public void testOnlyRead() throws Exception {
    LockManager lockManager = new LockManager();
    new Thread(()->lockManager.read("001",5000L)).start();
    new Thread(()->lockManager.read("002",4000L)).start();
    Thread.sleep(20000L);
}

輸出結(jié)果

Thread-2,讀讀讀讀讀讀讀讀讀讀,message=002
Thread-1,讀讀讀讀讀讀讀讀讀讀,message=001

測試無讀鎖,只有寫鎖

測試方法

第一個(gè)線程等待5S輸出,第二個(gè)線程等待4S輸出

@Test
public void testOnlyWrite() throws Exception {
    LockManager lockManager = new LockManager();
    new Thread(()->lockManager.write("001",5000L)).start();
    new Thread(()->lockManager.write("002",4000L)).start();
    Thread.sleep(20000L);
}

輸出結(jié)果

Thread-2,獲取寫鎖失敗
Thread-1,寫寫寫寫寫寫寫寫寫寫,message=001

測試先讀鎖,再寫鎖

測試方法

第一個(gè)線程等待5S輸出,第二個(gè)線程等待4S輸出

@Test
public void testReadWrite() throws Exception {
    LockManager lockManager = new LockManager();
    new Thread(()->lockManager.read("001",5000L)).start();
    new Thread(()->lockManager.write("002",4000L)).start();
    Thread.sleep(20000L);
}

輸出結(jié)果

Thread-2,獲取寫鎖失敗
Thread-1,讀讀讀讀讀讀讀讀讀讀,message=001

測試先寫鎖,再寫鎖

測試方法 (由于讀鎖獲取等待了6S,所以可以執(zhí)行成功)

第一個(gè)線程等待5S輸出,第二個(gè)線程等待4S輸出

@Test
public void testWriteRead() throws Exception {
    LockManager lockManager = new LockManager();
    new Thread(()->lockManager.write("001",5000L)).start();
    new Thread(()->lockManager.read("002",4000L)).start();
    Thread.sleep(20000L);
}

輸出結(jié)果

Thread-1,寫寫寫寫寫寫寫寫寫寫,message=001
Thread-2,讀讀讀讀讀讀讀讀讀讀,message=002

測試方法 (由于讀鎖獲取等待了6S,所以讀鎖獲取失敗)

第一個(gè)線程等待7S輸出,第二個(gè)線程等待4S輸出

@Test
public void testWriteRead2() throws Exception {
    LockManager lockManager = new LockManager();
    new Thread(()->lockManager.write("001",7000L)).start();
    new Thread(()->lockManager.read("002",4000L)).start();
    Thread.sleep(20000L);
}

輸出結(jié)果

Thread-2,獲取讀鎖失敗
Thread-1,寫寫寫寫寫寫寫寫寫寫,message=001

以上就是Java讀寫鎖ReadWriteLock的創(chuàng)建使用及測試分析示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java讀寫鎖ReadWriteLock的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解spring cloud hystrix 請(qǐng)求合并collapsing

    詳解spring cloud hystrix 請(qǐng)求合并collapsing

    這篇文章主要介紹了詳解spring cloud hystrix 請(qǐng)求合并collapsing,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • java使用Jsoup連接網(wǎng)站超時(shí)的解決方法

    java使用Jsoup連接網(wǎng)站超時(shí)的解決方法

    jsoup是一個(gè)非常好的解析網(wǎng)頁的包,用java開發(fā)的,提供了類似DOM,CSS選擇器的方式來查找和提取文檔中的內(nèi)容,提取文檔內(nèi)容時(shí)會(huì)出現(xiàn)超時(shí)的情況,解決方法可看下文
    2013-11-11
  • JHipster如何修改JDL中的entity

    JHipster如何修改JDL中的entity

    這篇文章主要介紹了JHipster如何修改JDL中的entity問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java web實(shí)現(xiàn)簡易收費(fèi)站

    java web實(shí)現(xiàn)簡易收費(fèi)站

    這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)簡易收費(fèi)站,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一
    2020-11-11
  • mybatis使用pagehelper插件過程詳解

    mybatis使用pagehelper插件過程詳解

    這篇文章主要介紹了mybatis使用pagehelper插件過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 23種設(shè)計(jì)模式(14)java迭代器模式

    23種設(shè)計(jì)模式(14)java迭代器模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java迭代器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java?多線程并發(fā)編程提高數(shù)據(jù)處理效率的詳細(xì)過程

    Java?多線程并發(fā)編程提高數(shù)據(jù)處理效率的詳細(xì)過程

    這篇文章主要介紹了Java?多線程并發(fā)編程提高數(shù)據(jù)處理效率,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Java中JDom解析XML_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java中JDom解析XML_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    JDOM是一種解析XML的Java工具包。DOM適合于當(dāng)今流行的各種語言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。下面通過本文給大家介紹Java中JDom解析XML的方法,感興趣的朋友一起學(xué)習(xí)吧
    2017-07-07
  • IntelliJ IDEA 2017.1.4 x64配置步驟(介紹)

    IntelliJ IDEA 2017.1.4 x64配置步驟(介紹)

    下面小編就為大家?guī)硪黄狪ntelliJ IDEA 2017.1.4 x64配置步驟(介紹)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 解決mybatis批量更新(update foreach)失敗的問題

    解決mybatis批量更新(update foreach)失敗的問題

    這篇文章主要介紹了解決mybatis批量更新(update foreach)失敗的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評(píng)論