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

Java中的ReadWriteLock讀寫鎖詳解

 更新時間:2023年12月18日 10:29:25   作者:暴躁的程序猿啊  
這篇文章主要介紹了Java中的ReadWriteLock讀寫鎖詳解,ReadWriteLock也是一個接口,提供了readLock和writeLock兩種鎖的操作機制,一個資源可以被多個線程同時讀,或者被一個線程寫,但是不能同時存在讀和寫線程,需要的朋友可以參考下

ReadWriteLock

ReadWriteLock也是一個接口,提供了readLock和writeLock兩種鎖的操作機制,一個資源可以被多個線程同時讀,或者被一個線程寫,但是不能同時存在讀和寫線程。

讀鎖:共享鎖 readLock

**寫鎖:**獨占鎖 writeLock

讀寫鎖 : 一個資源可以被多個讀的線程進行訪問 ,或者可以被一個寫的線程訪問,

但是不能同時存在讀和寫進程 ,讀寫互斥,讀讀共享。

讀的時候可以多個線程一起讀

寫的時候只能一個線程寫

使用示例:

向map中添加和讀取值

public class ReadWriteLock {
    public static void main(String[] args) {
        MyCache myCache = new MyCache();
        //十個寫線程
        for (int i = 0; i < 10; i++) {
            final int temp=i;
            new Thread(() -> {
            myCache.put(temp+"",temp+"");
            }, String.valueOf(i)).start();
        }
        //十個讀線程
        for (int i = 0; i < 10; i++) {
            final int temp=i;
            new Thread(() -> {
                myCache.get(temp+"");
            }, String.valueOf(i)).start();
        }
    }
}
/**
 * 自定義緩存
 */
class MyMap {
    private volatile Map<String, Object> map = new HashMap<>();
    //存入值
    public void put(String key, Object value) {
        System.out.println(Thread.currentThread().getName() + "寫入" + key);
        map.put(key, value);
        System.out.println(Thread.currentThread().getName() + "寫入完成");
    }
    //取值
    public void get(String key) {
        System.out.println(Thread.currentThread().getName() + "讀取" + key);
        Object o = map.get(key);
        System.out.println(Thread.currentThread().getName() + "讀取完成");
    }
}

我們可以看到1寫入跟寫入完成之間插入了4線程 這是不對的

在這里插入圖片描述

于是我們加入讀寫鎖

加鎖

  lock.writeLock().lock();
  lock.readLock().lock();

解鎖

  lock.writeLock().unlock();
  lock.readLock().unlock();
class MyCacheLock {
    private volatile Map<String, Object> map = new HashMap<>();
    //讀寫鎖 :更加細粒度的控制
    private ReadWriteLock lock = new ReentrantReadWriteLock();
    //存入值  寫的時候只希望同時只有一個線程寫
    public void put(String key, Object value) {
        //加寫鎖
        lock.writeLock().lock();
        try {
            System.out.println(Thread.currentThread().getName() + "寫入" + key);
            map.put(key, value);
            System.out.println(Thread.currentThread().getName() + "寫入完成");
        } catch (Exception e) {
        } finally {
            lock.writeLock().unlock();
        }
    }
    //取值  讀所有人都可以讀
    public void get(String key) {
        //加讀鎖
        lock.readLock().lock();
        try {
            System.out.println(Thread.currentThread().getName() + "讀取" + key);
            Object o = map.get(key);
            System.out.println(Thread.currentThread().getName() + "讀取完成");
        } catch (Exception e) {
        } finally {
            lock.readLock().unlock();
        }
    }
}

在這里插入圖片描述

讀寫鎖的演變

一、無鎖

無鎖狀態(tài)多線程搶占資源 會出現(xiàn)問題

二、加鎖

synchronized和reentrantLock

都是獨占鎖 每次只能一個線程來操作

讀讀 一個線程 只能一個人讀

讀寫 一個線程

寫寫 一個線程

三、讀寫鎖

ReentrantReadWriteLock

讀讀可以共享,提升性能 同時多人讀

寫寫 一個線程

缺點:

1.造成鎖的饑餓,可能一直讀沒有寫的操作

2.寫的時候,自己線程可以讀,讀的時候,哪個線程都不可以寫

鎖降級

鎖降級:將寫入鎖降級為讀鎖 讀鎖不能升級為寫鎖

獲取寫鎖—>獲取讀鎖—>釋放寫鎖—>釋放讀鎖

示例

public class Downgrade {
    public static void main(String[] args) {
        //可重入讀寫鎖對象
        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        //讀鎖
        ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
        //寫鎖
        ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
        //鎖降級
        //獲取寫鎖
        writeLock.lock();
        System.out.println("飛飛");
        //獲取讀鎖
        readLock.lock();
        System.out.println("read讀取");
        //解鎖
        writeLock.unlock();
        readLock.unlock();
    }
}

在這里插入圖片描述

但是我們不可以在讀鎖中獲取寫鎖

示例2:

public class Downgrade {
    public static void main(String[] args) {
        //可重入讀寫鎖對象
        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        //讀鎖
        ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
        //寫鎖
        ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
        //鎖降級
        //獲取讀鎖
        readLock.lock();
        System.out.println("read讀取");
        //獲取寫鎖
        writeLock.lock();
        System.out.println("飛飛");
        //解鎖
        writeLock.unlock();
        readLock.unlock();
    }
}

在這里插入圖片描述

不可以在讀鎖中寫 不會停止

到此這篇關(guān)于Java中的ReadWriteLock讀寫鎖詳解的文章就介紹到這了,更多相關(guān)ReadWriteLock讀寫鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring框架的環(huán)境搭建和測試實現(xiàn)

    Spring框架的環(huán)境搭建和測試實現(xiàn)

    這篇文章主要介紹了Spring框架的環(huán)境搭建和測試實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Java實現(xiàn)任務(wù)超時處理方法

    Java實現(xiàn)任務(wù)超時處理方法

    任務(wù)超時處理是比較常見的需求,Java中對超時任務(wù)的處理有兩種方式,在文中給大家詳細介紹,本文重點給大家介紹Java實現(xiàn)任務(wù)超時處理方法,需要的朋友可以參考下
    2019-06-06
  • Java中的字符串用法小結(jié)

    Java中的字符串用法小結(jié)

    這篇文章主要介紹了Java中的字符串用法,實例總結(jié)了java中關(guān)于字符串操作的各種常用的技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • MyBatis-Plus使用ActiveRecord(AR)實現(xiàn)CRUD

    MyBatis-Plus使用ActiveRecord(AR)實現(xiàn)CRUD

    本文將結(jié)合實例代碼,介紹MyBatis-Plus使用ActiveRecord(AR)實現(xiàn)CRUD,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • Java中Caffeine本地緩存項目實例

    Java中Caffeine本地緩存項目實例

    這篇文章主要介紹了Java中Caffeine本地緩存項目實例,Caffeine是一個高性能Java 緩存庫,使用Java8對Guava緩存重寫版本,在Spring Boot 2.0中將取代Guava,使用spring.cache.cache-names屬性可以在啟動時創(chuàng)建緩存,需要的朋友可以參考下
    2023-10-10
  • 如何在java中使用SFTP協(xié)議安全的傳輸文件

    如何在java中使用SFTP協(xié)議安全的傳輸文件

    這篇文章主要介紹了如何在java中使用SFTP協(xié)議安全的傳輸文件,幫助大家更好的理解和使用JSch,感興趣的朋友可以了解下
    2020-10-10
  • 分析設(shè)計模式之模板方法Java實現(xiàn)

    分析設(shè)計模式之模板方法Java實現(xiàn)

    所謂模板方法模式,就是一個對模板的應(yīng)用,就好比老師出試卷,每個人的試卷都是一樣的,這個原版試卷就是一個模板,可每個人寫在試卷上的答案都是不一樣的,這就是模板方法模式。它的主要用途在于將不變的行為從子類搬到超類,去除了子類中的重復(fù)代碼
    2021-06-06
  • 解決Properties屬性文件中的值有等號和換行的小問題

    解決Properties屬性文件中的值有等號和換行的小問題

    這篇文章主要介紹了解決Properties屬性文件中的值有等號有換行的小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • mybatis-xml映射文件及mybatis動態(tài)sql詳解

    mybatis-xml映射文件及mybatis動態(tài)sql詳解

    XML映射文件的名稱與Mapper接口名稱一致,并且將XML映射文件和Mapper接口放置在相同包下(同包同名),這篇文章主要介紹了mybatis-xml映射文件及mybatis動態(tài)sql的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 一文理清什么是BIO以及如何使用

    一文理清什么是BIO以及如何使用

    這篇文章主要介紹了什么是BIO以及如何使用,BIO英文全名是blockingIO,也叫做阻塞IO,是最容易理解、最容易實現(xiàn)的IO工作方式,本文就來通過一些簡單的示例為大家講講BIO吧,需要的朋友可以參考下
    2023-10-10

最新評論