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

當(dāng)前位置:首頁 > 科技  > 軟件

如何線程安全的使用 HashMap

來源: 責(zé)編: 時間:2024-06-05 17:44:50 143觀看
導(dǎo)讀這篇文章,我們聊聊線程安全使用 HashMap 的四種技巧。圖片1.方法內(nèi)部:每個線程創(chuàng)建單獨的 HashMap如下圖,tomcat 接收到到請求后,依次調(diào)用控制器 Controller、服務(wù)層 Service 、數(shù)據(jù)庫訪問層的相關(guān)方法。每次訪問服務(wù)層方

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

圖片圖片pZx28資訊網(wǎng)——每日最新資訊28at.com

1.方法內(nèi)部:每個線程創(chuàng)建單獨的 HashMap

如下圖,tomcat 接收到到請求后,依次調(diào)用控制器 Controller、服務(wù)層 Service 、數(shù)據(jù)庫訪問層的相關(guān)方法。pZx28資訊網(wǎng)——每日最新資訊28at.com

每次訪問服務(wù)層方法 serviceMethod 時,都會在方法體內(nèi)部創(chuàng)建一個單獨的 HashMap ,  將相關(guān)請求參數(shù)拷貝到 HashMap 里,然后調(diào)用 DAO 方法進行數(shù)據(jù)庫操作。pZx28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片pZx28資訊網(wǎng)——每日最新資訊28at.com

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

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

2.配置數(shù)據(jù):初始化單線程寫,后續(xù)只提供讀

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

圖片圖片pZx28資訊網(wǎng)——每日最新資訊28at.com

上圖中顯示一個非常簡單的配置類 SimpleConfig ,內(nèi)部有一個 HashMap 對象 configMap 。構(gòu)造函數(shù)調(diào)用初始化方法,初始化方法內(nèi)部的邏輯是:將配置數(shù)據(jù)存儲到 HashMap 中。pZx28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

它的規(guī)則是:讀讀不互斥,讀寫互斥,寫寫互斥,適用于讀多寫少的業(yè)務(wù)場景。pZx28資訊網(wǎng)——每日最新資訊28at.com

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

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

讀寫鎖的使用方式如下所示:pZx28資訊網(wǎng)——每日最新資訊28at.com

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

下面的代碼展示如何使用 ReadWriteLock 線程安全的使用 HashMap :pZx28資訊網(wǎng)——每日最新資訊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 {      // 創(chuàng)建一個 HashMap 來存儲緩存的數(shù)據(jù)    private Map<String, String> map = new HashMap<>();    // 創(chuàng)建讀寫鎖對象    private ReadWriteLock rw = new ReentrantReadWriteLock();    // 放對象方法:向緩存中添加一個鍵值對    public void put(String key, String value) {        // 獲取寫鎖,以確保當(dāng)前操作是獨占的        rw.writeLock().lock();        try {            // 執(zhí)行寫操作,將鍵值對放入 map            map.put(key, value);        } finally {            // 釋放寫鎖            rw.writeLock().unlock();        }    }    // 取對象方法:從緩存中獲取一個值    public String get(String key) {        // 獲取讀鎖,允許并發(fā)讀操作        rw.readLock().lock();        try {            // 執(zhí)行讀操作,從 map 中獲取值            return map.get(key);        } finally {            // 釋放讀鎖            rw.readLock().unlock();        }    }}

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

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

4.Collections.synchronizedMap : 讀寫均加鎖

如下代碼,當(dāng)我們多線程使用 userMap 時,pZx28資訊網(wǎng)——每日最新資訊28at.com

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

進入 synchronizedMap 方法:pZx28資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片pZx28資訊網(wǎng)——每日最新資訊28at.com

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

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

5.總結(jié)

這篇文章,筆者總結(jié)了四種線程安全的使用 HashMap 的技巧。pZx28資訊網(wǎng)——每日最新資訊28at.com

1)方法內(nèi)部:每個線程創(chuàng)建單獨的 HashMappZx28資訊網(wǎng)——每日最新資訊28at.com

這是我們使用最普遍,也是非常可靠的方式。每個線程在方法體內(nèi)部創(chuàng)建HashMap 實例,在多線程環(huán)境下,不需要對 HashMap 進行任何同步操作。pZx28資訊網(wǎng)——每日最新資訊28at.com

2) 配置數(shù)據(jù):初始化單線程寫,后續(xù)只提供讀pZx28資訊網(wǎng)——每日最新資訊28at.com

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

3)讀寫鎖:讀讀不互斥,讀寫互斥,寫寫互斥pZx28資訊網(wǎng)——每日最新資訊28at.com

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

它的規(guī)則是:讀讀不互斥,讀寫互斥,寫寫互斥,適用于讀多寫少的業(yè)務(wù)場景。pZx28資訊網(wǎng)——每日最新資訊28at.com

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

4)Collections.synchronizedMap  : 讀寫均加鎖pZx28資訊網(wǎng)——每日最新資訊28at.com

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

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

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

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

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

下一篇: 好坑,流水號重復(fù)竟然導(dǎo)致了一次生產(chǎn)事故!

標(biāo)簽:
  • 熱門焦點
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達(dá)到了中國第一,同時還表示小米電視的巨屏風(fēng)暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網(wǎng)課,網(wǎng)課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點就是停滯的這幾年行業(yè)又有了新的發(fā)展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協(xié)調(diào)和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現(xiàn)手段有以下幾種方式:Object 類下
  • 掘力計劃第 20 期:Flutter 混合開發(fā)的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發(fā)實戰(zhàn)詳解》作者,掘金優(yōu)秀作者,Github GSY 系列目負(fù)責(zé)人戀貓的小郭分享了Flutter 混合開發(fā)的混亂之治。Flutter 基于自研的 Skia 引擎
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數(shù)據(jù)的地方,是數(shù)據(jù)源的一種,比如大家經(jīng)常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數(shù)據(jù),它既可以保
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術(shù),可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實現(xiàn)原理和應(yīng)用
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • 一個注解實現(xiàn)接口冪等,這樣才優(yōu)雅!

    場景碼猿慢病云管理系統(tǒng)中其實高并發(fā)的場景不是很多,沒有必要每個接口都去考慮并發(fā)高的場景,比如添加住院患者的這個接口,具體的業(yè)務(wù)代碼就不貼了,業(yè)務(wù)偽代碼如下:圖片上述代碼有
  • 消息稱小米汽車開始篩選交付中心:需至少120個車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業(yè)從業(yè)者、長三角一體化擁護者”的微博用戶 @長三角行健者 發(fā)文表示,據(jù)經(jīng)銷商集團反饋,小米汽車目前
Top 主站蜘蛛池模板: 富蕴县| 兴和县| 桃江县| 固始县| 芷江| 两当县| 景宁| 辉县市| 大田县| 通道| 铁岭县| 黔西县| 富裕县| 攀枝花市| 凤山市| 濉溪县| 嘉禾县| 资源县| 西宁市| 陕西省| 盈江县| 兰坪| 融水| 阿瓦提县| 桐梓县| 隆安县| 衡阳市| 长葛市| 黄冈市| 昌邑市| 河北区| 元谋县| 新蔡县| 娄烦县| 海淀区| 蕉岭县| 邳州市| 镇康县| 张家口市| 东兰县| 抚宁县|