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

淺析Java如何在并發(fā)環(huán)境下生成一個只讀的map

 更新時間:2024年04月18日 08:39:42   作者:Layber  
這篇文章主要為大家詳細介紹了Java如何在并發(fā)環(huán)境下生成一個只讀的map,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

前言

在日常開發(fā)過程中,我們經(jīng)常會遇到一些資源初始化的情況,往往有些資源就是那種我初始化以后我們就不希望被改動,但是我們又擔心別人使用的時候不小心改動了,這時候我就在想,要是我們的JDK能提供一種不能被修改的容器改有多好,好死不死,jdk中還真有這樣的容器,map和list都有,這里以map為例子給大家講解一下!

一般用法

在項目中一些不被改變的資源,通常采用靜態(tài)代碼塊的形式去初始化,如下:

  private static Map<Integer, String> readOnlyMap;

  static {
        Map<Integer, String> callTimesMap = new HashMap<>();
        callTimesMap.put(1, "一呼");
        callTimesMap.put(2, "二呼");
        callTimesMap.put(3, "三呼");
        callTimesMap.put(4, "四呼");
        callTimesMap.put(5, "五呼");
        callTimesMap.put(6, "六呼");
        callTimesMap.put(7, "七呼");
        callTimesMap.put(8, "八呼");
        callTimesMap.put(9, "九呼");
        callTimesMap.put(10, "十呼");

        readOnlyMap = Collections.unmodifiableMap(callTimesMap);
    }

練習時長兩年半左右的Java練習生應該知道,這樣做的好處是由靜態(tài)代碼塊在Java虛擬機中的執(zhí)行時機所決定的,下面給大伙呱唧一下!

靜態(tài)代碼塊在Java中如何執(zhí)行

在Java中,靜態(tài)代碼塊由類加載器在加載類的過程中執(zhí)行。當類被第一次加載時,類加載器會執(zhí)行其中的靜態(tài)代碼塊,并且只會執(zhí)行一次。

創(chuàng)建只讀的容器

要創(chuàng)建只讀的容器其實也很簡單:

Collections.unmodifiableMap(callTimesMap);

這樣就可以實現(xiàn)了!

測試證明

      public static void main(String[] args) {
       //模擬并發(fā)環(huán)境
        new Thread(()->{
            readOnlyMap.put(11,"s");
        }).start();
        
         readOnlyMap.put(11,"s");
    }

測試結(jié)果:

Exception in thread "Thread-0" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableMap.put(Collections.java:1459)
    at com.zhuiyi.yicall.callout.statistic.impl.SessionStatisticServiceImpl.lambda$main$0(SessionStatisticServiceImpl.java:94)
    at java.lang.Thread.run(Thread.java:748)
    
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableMap.put(Collections.java:1459)
    at com.zhuiyi.yicall.callout.statistic.impl.SessionStatisticServiceImpl.main(SessionStatisticServiceImpl.java:96)

我們可以看到“Thread-0”和"main"線程都拋出了異常!這說明在并發(fā)條件下確實不允許寫,只允許讀!

只讀容器的底層實現(xiàn)原理

直接上源碼:

      private static class UnmodifiableMap<K,V> implements Map<K,V>, Serializable {
        private static final long serialVersionUID = -1034234728574286014L;

        private final Map<? extends K, ? extends V> m;

        UnmodifiableMap(Map<? extends K, ? extends V> m) {
            if (m==null)
                throw new NullPointerException();
            this.m = m;
        }

        public int size()                        {return m.size();}
        public boolean isEmpty()                 {return m.isEmpty();}
        public boolean containsKey(Object key)   {return m.containsKey(key);}
        public boolean containsValue(Object val) {return m.containsValue(val);}
        public V get(Object key)                 {return m.get(key);}

        public V put(K key, V value) {
            throw new UnsupportedOperationException();
        }
        public V remove(Object key) {
            throw new UnsupportedOperationException();
        }
        public void putAll(Map<? extends K, ? extends V> m) {
            throw new UnsupportedOperationException();
        }
        public void clear() {
            throw new UnsupportedOperationException();
        }
        //.....此處省略很多代碼
      }

從源碼中我們可以看出,UnmodifiableMap實現(xiàn)了map接口,所以它具有map的所有功能,同時最最重要的是他將所有會動到容器中的數(shù)據(jù)的方法都拋出異常了!

如下:

        public V put(K key, V value) {
            throw new UnsupportedOperationException();
        }
        public V remove(Object key) {
            throw new UnsupportedOperationException();
        }
        public void putAll(Map<? extends K, ? extends V> m) {
            throw new UnsupportedOperationException();
        }
        public void clear() {
            throw new UnsupportedOperationException();
        }

這樣就從源頭上控制了容器不支持寫,只支持讀!

思考:針對這樣的場景,是否還有別的實現(xiàn)方式?

答案肯定是有的,我們可以使用一個全局鎖,或者分布式鎖都能實現(xiàn)!

全局讀鎖:

    ReadWriteLock lock = new ReentrantReadWriteLock();
    
    public void readData() {
        lock.readLock().lock();
        try {
            // 執(zhí)行讀取操作callTimesMap
            
        } finally {
            lock.readLock().unlock();
        }
    }

如果使用分布式鎖或者全局鎖的話性能會變差,所以最好的解決方案就是直接創(chuàng)建一個不能被修改的容器,這樣效率是最高,也是最安全的!

到此這篇關(guān)于淺析Java如何在并發(fā)環(huán)境下生成一個只讀的map的文章就介紹到這了,更多相關(guān)Java并發(fā)生成只讀map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring學習筆記之RestTemplate使用小結(jié)

    Spring學習筆記之RestTemplate使用小結(jié)

    這篇文章主要給大家介紹了關(guān)于Spring學習筆記之RestTemplate使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • Elasticsearch算分優(yōu)化方案之rescore_query示例詳解

    Elasticsearch算分優(yōu)化方案之rescore_query示例詳解

    這篇文章主要為大家介紹了Elasticsearch算分優(yōu)化方案之rescore_query示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • SpringBoot利用觀察者模式實現(xiàn)聯(lián)動更新機制

    SpringBoot利用觀察者模式實現(xiàn)聯(lián)動更新機制

    觀察者模式(Observer Pattern)是一種軟件設計模式,在許多應用系統(tǒng)中,我們經(jīng)常需要處理多個表之間的關(guān)聯(lián)更新問題,本文將通過一個具體的案例,介紹如何在Spring Boot項目中利用觀察者模式來優(yōu)雅地解決這一需求,需要的朋友可以參考下
    2024-07-07
  • FeignMultipartSupportConfig上傳圖片配置方式

    FeignMultipartSupportConfig上傳圖片配置方式

    這篇文章主要介紹了FeignMultipartSupportConfig上傳圖片配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java-jwt通過公鑰字符串驗證解析token方式

    java-jwt通過公鑰字符串驗證解析token方式

    本文示例如何將公鑰字符串轉(zhuǎn)換為RSAPublicKey對象以校驗JWT token,解決了Java-JWT庫中公鑰格式不匹配的問題,并提供代碼測試方法
    2025-08-08
  • Java eclipse doc文檔生成流程解析

    Java eclipse doc文檔生成流程解析

    這篇文章主要介紹了Java eclipse doc文檔生成流程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot整合AOP及使用案例實戰(zhàn)

    SpringBoot整合AOP及使用案例實戰(zhàn)

    本文詳細介紹了Spring AOP中的切入點表達式,重點講解了execution表達式的語法和用法,通過案例實戰(zhàn),展示了AOP的基本使用、結(jié)合自定義注解以及環(huán)繞通知的實現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • java中的JSONP使用實例詳解

    java中的JSONP使用實例詳解

    json和JSONP這二者在開發(fā)中還是很常見的,本文重點給大家介紹下java中的jsonp使用實例詳解,需要的朋友參考下
    2017-04-04
  • 基于javaMybatis存進時間戳的問題

    基于javaMybatis存進時間戳的問題

    這篇文章主要介紹了javaMybatis存進時間戳的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java list foreach修改元素方式

    Java list foreach修改元素方式

    這篇文章主要介紹了Java list foreach修改元素方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11

最新評論

合肥市| 海伦市| 连州市| 依安县| 永新县| 新绛县| 博客| 绥化市| 科尔| 科尔| 武陟县| 商河县| 陇西县| 东平县| 乐都县| 辽宁省| 阳信县| 大港区| 麟游县| 荔浦县| 牟定县| 邯郸市| 永城市| 达尔| 宁晋县| 五原县| 隆林| 博客| 义马市| 乐山市| 荣成市| 建昌县| 岢岚县| 翼城县| 基隆市| 同德县| 沈丘县| 太仆寺旗| 揭东县| 沂水县| 文化|