日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

如何線程安全的使用 HashMap

來源: 責編: 時間:2024-06-05 17:44:50 198觀看
導讀這篇文章,我們聊聊線程安全使用 HashMap 的四種技巧。圖片1.方法內部:每個線程創建單獨的 HashMap如下圖,tomcat 接收到到請求后,依次調用控制器 Controller、服務層 Service 、數據庫訪問層的相關方法。每次訪問服務層方

這篇文章,我們聊聊線程安全使用 HashMap 的四種技巧。h7x28資訊網——每日最新資訊28at.com

圖片圖片h7x28資訊網——每日最新資訊28at.com

1.方法內部:每個線程創建單獨的 HashMap

如下圖,tomcat 接收到到請求后,依次調用控制器 Controller、服務層 Service 、數據庫訪問層的相關方法。h7x28資訊網——每日最新資訊28at.com

每次訪問服務層方法 serviceMethod 時,都會在方法體內部創建一個單獨的 HashMap ,  將相關請求參數拷貝到 HashMap 里,然后調用 DAO 方法進行數據庫操作。h7x28資訊網——每日最新資訊28at.com

圖片圖片h7x28資訊網——每日最新資訊28at.com

每個 HTTP 處理線程在服務層方法體內部都有自己的 HashMap 實例,在多線程環境下,不需要對 HashMap 進行任何同步操作。h7x28資訊網——每日最新資訊28at.com

這也是我們使用最普遍也最安全的的方式,是 CRUD 最基本的操作。h7x28資訊網——每日最新資訊28at.com

2.配置數據:初始化單線程寫,后續只提供讀

系統啟動之后,我們可以將配置數據加載到本地緩存 HashMap 里 ,這些配置信息初始化之后,就不需要寫入了,后續只提供讀操作。h7x28資訊網——每日最新資訊28at.com

圖片圖片h7x28資訊網——每日最新資訊28at.com

上圖中顯示一個非常簡單的配置類 SimpleConfig ,內部有一個 HashMap 對象 configMap 。構造函數調用初始化方法,初始化方法內部的邏輯是:將配置數據存儲到 HashMap 中。h7x28資訊網——每日最新資訊28at.com

SimpleConfig 類對外暴露了 getConfig 方法 ,當 main 線程初始化 SimpleConfig 對象之后,當其他線程調用  getConfig 方法時,因為只有讀,沒有寫操作,所以是線程安全的。h7x28資訊網——每日最新資訊28at.com

3.讀寫鎖:讀讀不互斥,讀寫互斥,寫寫互斥

讀寫鎖是一把鎖分為兩部分:讀鎖和寫鎖,其中讀鎖允許多個線程同時獲得,而寫鎖則是互斥鎖。h7x28資訊網——每日最新資訊28at.com

它的規則是:讀讀不互斥,讀寫互斥,寫寫互斥,適用于讀多寫少的業務場景。h7x28資訊網——每日最新資訊28at.com

我們一般都使用 ReentrantReadWriteLock ,該類實現了 ReadWriteLock 。ReadWriteLock 接口也很簡單,其內部主要提供了兩個方法,分別返回讀鎖和寫鎖 。h7x28資訊網——每日最新資訊28at.com

public interface ReadWriteLock {    //獲取讀鎖    Lock readLock();    //獲取寫鎖    Lock writeLock();}

讀寫鎖的使用方式如下所示:h7x28資訊網——每日最新資訊28at.com

  1. 創建 ReentrantReadWriteLock 對象 , 當使用 ReadWriteLock 的時候,并不是直接使用,而是獲得其內部的讀鎖和寫鎖,然后分別調用 lock / unlock 方法 ;
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
  1. 讀取共享數據 ;
Lock readLock = readWriteLock.readLock();readLock.lock();try {   // TODO 查詢共享數據} finally {   readLock.unlock();}
  1. 寫入共享數據;
Lock writeLock = readWriteLock.writeLock();writeLock.lock();try {   // TODO 修改共享數據} finally {   writeLock.unlock();}

下面的代碼展示如何使用 ReadWriteLock 線程安全的使用 HashMap :h7x28資訊網——每日最新資訊28at.com

import java.util.HashMap;import java.util.Map;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockCache {      // 創建一個 HashMap 來存儲緩存的數據    private Map<String, String> map = new HashMap<>();    // 創建讀寫鎖對象    private ReadWriteLock rw = new ReentrantReadWriteLock();    // 放對象方法:向緩存中添加一個鍵值對    public void put(String key, String value) {        // 獲取寫鎖,以確保當前操作是獨占的        rw.writeLock().lock();        try {            // 執行寫操作,將鍵值對放入 map            map.put(key, value);        } finally {            // 釋放寫鎖            rw.writeLock().unlock();        }    }    // 取對象方法:從緩存中獲取一個值    public String get(String key) {        // 獲取讀鎖,允許并發讀操作        rw.readLock().lock();        try {            // 執行讀操作,從 map 中獲取值            return map.get(key);        } finally {            // 釋放讀鎖            rw.readLock().unlock();        }    }}

使用讀寫鎖操作 HashMap 是一個非常經典的技巧,消息中間件 RockeMQ NameServer (名字服務)保存和查詢路由信息都是通過這種技巧實現的。h7x28資訊網——每日最新資訊28at.com

另外,讀寫鎖可以操作多個 HashMap ,相比 ConcurrentHashMap 而言,ReadWriteLock 可以控制緩存對象的顆粒度,具備更大的靈活性。h7x28資訊網——每日最新資訊28at.com

4.Collections.synchronizedMap : 讀寫均加鎖

如下代碼,當我們多線程使用 userMap 時,h7x28資訊網——每日最新資訊28at.com

static Map<Long, User> userMap = Collections.synchronizedMap(new HashMap<Long, User>());

進入 synchronizedMap 方法:h7x28資訊網——每日最新資訊28at.com

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {       return new SynchronizedMap<>(m);}

圖片圖片h7x28資訊網——每日最新資訊28at.com

SynchronizedMap 內部包含一個對象鎖 Object mutex ,它本質上是一個包裝類,將 HashMap 的讀寫操作重新實現了一次,我們看到每次讀寫時,都會用 synchronized 關鍵字來保證操作的線程安全。h7x28資訊網——每日最新資訊28at.com

雖然 Collections.synchronizedMap 這種技巧使用起來非常簡單,但是我們需要理解它的每次讀寫都會加鎖,性能并不會特別好。h7x28資訊網——每日最新資訊28at.com

5.總結

這篇文章,筆者總結了四種線程安全的使用 HashMap 的技巧。h7x28資訊網——每日最新資訊28at.com

1)方法內部:每個線程創建單獨的 HashMaph7x28資訊網——每日最新資訊28at.com

這是我們使用最普遍,也是非??煽康姆绞?。每個線程在方法體內部創建HashMap 實例,在多線程環境下,不需要對 HashMap 進行任何同步操作。h7x28資訊網——每日最新資訊28at.com

2) 配置數據:初始化單線程寫,后續只提供讀h7x28資訊網——每日最新資訊28at.com

中間件在啟動時,會讀取配置文件,將配置數據寫入到 HashMap 中,主線程寫完之后,以后不會再有寫入操作,其他的線程可以讀取,不會產生線程安全問題。h7x28資訊網——每日最新資訊28at.com

3)讀寫鎖:讀讀不互斥,讀寫互斥,寫寫互斥h7x28資訊網——每日最新資訊28at.com

讀寫鎖是一把鎖分為兩部分:讀鎖和寫鎖,其中讀鎖允許多個線程同時獲得,而寫鎖則是互斥鎖。h7x28資訊網——每日最新資訊28at.com

它的規則是:讀讀不互斥,讀寫互斥,寫寫互斥,適用于讀多寫少的業務場景。h7x28資訊網——每日最新資訊28at.com

使用讀寫鎖操作 HashMap 是一個非常經典的技巧,消息中間件 RockeMQ NameServer (名字服務)保存和查詢路由信息都是通過這種技巧實現的。h7x28資訊網——每日最新資訊28at.com

4)Collections.synchronizedMap  : 讀寫均加鎖h7x28資訊網——每日最新資訊28at.com

Collections.synchronizedMap 方法使用了裝飾器模式為線程不安全的 HashMap 提供了一個線程安全的裝飾器類 SynchronizedMap。h7x28資訊網——每日最新資訊28at.com

通過 SynchronizedMap 來間接的保證對 HashMap 的操作是線程安全,而 SynchronizedMap 底層也是通過 synchronized 關鍵字來保證操作的線程安全。h7x28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-92144-0.html如何線程安全的使用 HashMap

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 2024 年你可以使用的十大 Node.js 現代特性

下一篇: 好坑,流水號重復竟然導致了一次生產事故!

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产日韩精品久久久| 亚洲一区二区成人| 国产精品久久久久91| 欧美日韩喷水| 欧美视频中文字幕| 国产欧美日韩| 伊人久久久大香线蕉综合直播| 国产午夜精品美女视频明星a级 | 中文有码久久| 午夜精品婷婷| 男女激情视频一区| 欧美先锋影音| 国产在线观看91精品一区| 欧美高清在线| 国产精品老牛| 在线不卡欧美| 99精品视频免费观看视频| 亚洲视频你懂的| 久久国产88| 欧美日韩国产一区二区三区地区 | 欧美视频专区一二在线观看| 国产女精品视频网站免费 | 欧美日本韩国一区| 国产精品欧美日韩久久| 国产午夜亚洲精品理论片色戒| 激情婷婷久久| 亚洲日本乱码在线观看| 亚洲欧美伊人| 欧美国产成人在线| 老司机午夜免费精品视频 | 欧美成人综合| 国产精品国产a级| 亚洲大片在线| 亚洲视频免费看| 欧美成人dvd在线视频| 国产欧美精品日韩精品| 99国产精品久久久久久久成人热| 欧美自拍偷拍| 欧美视频官网| 亚洲欧洲综合| 亚洲激情视频在线| 欧美一区在线视频| 欧美裸体一区二区三区| 国产无一区二区| 亚洲视频1区| 老牛影视一区二区三区| 欧美天天在线| 亚洲第一页自拍| 亚洲欧美激情精品一区二区| 久久亚洲影音av资源网| 欧美三级中文字幕在线观看| 黄色亚洲精品| 亚洲人成在线观看网站高清| 久久精品国语| 欧美日韩黄色一区二区| 黄色日韩网站| 一区二区三区视频免费在线观看| 久久爱另类一区二区小说| 欧美日韩另类综合| 国产一区二区黄色| 一区二区三区三区在线| 久热这里只精品99re8久| 国产精品一国产精品k频道56| 亚洲国产一区二区三区青草影视| 欧美在线视频一区二区| 国产精品视频成人| 亚洲精品欧洲| 欧美成人精品| 激情综合五月天| 久久精彩视频| 国产一区二区日韩| 欧美中文在线视频| 国产精品日韩专区| 亚洲欧美日韩综合| 国产精品私人影院| 午夜视频在线观看一区二区三区 | 国产精品尤物| 欧美亚洲视频一区二区| 国产精品日日摸夜夜添夜夜av| 在线亚洲欧美| 国产精品久久久久永久免费观看| 中日韩美女免费视频网址在线观看 | 午夜性色一区二区三区免费视频| 欧美日韩1234| 亚洲精品综合久久中文字幕| 另类图片综合电影| 亚洲电影天堂av| 久久久久国产精品www| 国产亚洲精品久久久| 欧美在线在线| 韩国女主播一区二区三区| 久久狠狠婷婷| 国产美女精品人人做人人爽| 欧美在线播放视频| 狠狠色狠狠色综合日日小说| 久久综合色一综合色88| 亚洲国产色一区| 欧美国产精品日韩| 亚洲精品专区| 欧美日韩在线三级| 亚洲欧美国产高清| 国产精品视频xxx| 欧美一区激情| 国内精品视频在线播放| 久久人人97超碰精品888 | 亚洲欧美日韩国产中文| 国产精品啊啊啊| 午夜影院日韩| 国产一区99| 美女免费视频一区| 91久久在线播放| 欧美激情一区二区三区高清视频| 亚洲深夜福利视频| 国产一区在线看| 欧美激情视频网站| 亚洲欧美日韩国产综合在线| 国产尤物精品| 欧美噜噜久久久xxx| 亚洲欧美日韩中文播放| 精品51国产黑色丝袜高跟鞋| 欧美激情欧美狂野欧美精品| 亚洲一区三区电影在线观看| 国内精品美女在线观看| 欧美女同视频| 欧美在线视频a| 亚洲精品一区二区三区99| 国产精品网站一区| 美女成人午夜| 亚洲伊人一本大道中文字幕| 激情成人中文字幕| 欧美午夜精品一区| 久久综合999| 亚洲在线观看| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产日韩在线播放| 欧美大片91| 亚洲欧美中文另类| 亚洲欧洲另类国产综合| 国产伦精品一区二区三区视频孕妇| 久久亚洲图片| 亚洲一区日本| 亚洲黄色在线观看| 国产视频亚洲| 欧美日韩亚洲一区二区三区在线| 久久精品综合一区| 亚洲一区二区视频在线观看| 在线看视频不卡| 国产欧美日韩视频一区二区| 欧美激情精品久久久久久| 欧美在线免费观看| 亚洲调教视频在线观看| 亚洲国产欧美一区| 国产一区深夜福利| 国产精品久久久久久久久久久久久久 | 亚洲专区一区二区三区| 亚洲激情视频网站| 国产一区二区三区免费在线观看| 欧美日韩视频在线一区二区| 男女精品视频| 久久久国产视频91| 午夜精品视频| 中文精品一区二区三区| 亚洲欧洲精品一区二区三区波多野1战4| 国产精品永久免费在线| 欧美日韩在线一区二区| 能在线观看的日韩av| 久久久99久久精品女同性| 亚洲男女毛片无遮挡| 99视频精品| 亚洲日本成人| 曰本成人黄色| 韩国亚洲精品| 国产午夜精品全部视频播放| 国产精品sss| 欧美日韩国产一区二区| 欧美国产激情| 欧美www在线| 美女精品国产| 久久综合九色欧美综合狠狠| 久久国产天堂福利天堂| 香蕉乱码成人久久天堂爱免费| 亚洲午夜av在线| 一区二区三区欧美视频| 日韩亚洲视频在线| 日韩视频在线观看国产| 亚洲精品国产视频| 91久久精品国产91久久性色tv| 曰韩精品一区二区| 一区精品在线| 黄色成人av网| 在线播放日韩欧美| 亚洲第一视频| 最近中文字幕日韩精品| 亚洲国产精品一区二区三区| 亚洲电影免费| 亚洲人成网站999久久久综合| 亚洲国产精品成人va在线观看| 在线不卡欧美| 亚洲国产片色| 亚洲精品资源| 日韩一级在线观看| 亚洲视频电影在线| 亚洲欧美一区二区激情| 亚洲欧美一区二区原创|