Java之通過Collections.synchronizedMap創建線程安全的HashMap

1 問題

我們知道hashMap線程是不安全的,一般而言,我們怎么創建線程安全的HashMap呢?

?

?

?

?

?

2 解決辦法

我們可以使用Collections.synchronizedMap來創建HashMap,如下

static Map<String, String> results = Collections.synchronizedMap(new HashMap<String, String>());

?

?

?

?

?

?

3?Collections.synchronizedMap源碼部分實現

我們先看synchronizedMap如果創建

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

我們看下具體的SynchronizedMap類的部分

private static class SynchronizedMap<K,V>implements Map<K,V>, Serializable {// use serialVersionUID from JDK 1.2.2 for interoperabilityprivate static final long serialVersionUID = 1978198479659022715L;private final Map<K,V> m;     // Backing Mapfinal Object      mutex;    // Object on which to synchronizeSynchronizedMap(Map<K,V> m) {if (m==null)throw new NullPointerException();this.m = m;mutex = this;}SynchronizedMap(Map<K,V> m, Object mutex) {this.m = m;this.mutex = mutex;}public int size() {synchronized(mutex) {return m.size();}}public boolean isEmpty(){synchronized(mutex) {return m.isEmpty();}}public boolean containsKey(Object key) {synchronized(mutex) {return m.containsKey(key);}}public boolean containsValue(Object value){synchronized(mutex) {return m.containsValue(value);}}public V get(Object key) {synchronized(mutex) {return m.get(key);}}public V put(K key, V value) {synchronized(mutex) {return m.put(key, value);}}public V remove(Object key) {synchronized(mutex) {return m.remove(key);}}public void putAll(Map<? extends K, ? extends V> map) {synchronized(mutex) {m.putAll(map);}}public void clear() {synchronized(mutex) {m.clear();}}private transient Set<K> keySet = null;private transient Set<Map.Entry<K,V>> entrySet = null;private transient Collection<V> values = null;public Set<K> keySet() {synchronized(mutex) {if (keySet==null)keySet = new SynchronizedSet<K>(m.keySet(), mutex);return keySet;}}public Set<Map.Entry<K,V>> entrySet() {synchronized(mutex) {if (entrySet==null)entrySet = new SynchronizedSet<Map.Entry<K,V>>(m.entrySet(), mutex);return entrySet;}}public Collection<V> values() {synchronized(mutex) {if (values==null)values = new SynchronizedCollection<V>(m.values(), mutex);return values;}}public boolean equals(Object o) {if (this == o)return true;synchronized(mutex) {return m.equals(o);}}public int hashCode() {synchronized(mutex) {return m.hashCode();}}public String toString() {synchronized(mutex) {return m.toString();}}private void writeObject(ObjectOutputStream s) throws IOException {synchronized(mutex) {s.defaultWriteObject();}}}

SynchronizedMap 實現了Map接口的代理類,該類中對Map接口中的方法還是使用synchronized 同步關鍵字來保證對Map的操作是線程安全的

synchronized(mutex) {/*****/}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287796.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287796.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287796.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【經典珍藏版】手把手全程教你制作漂亮的720全景地圖(附PtGui軟件下載地址)

如今,在網絡異常發達的信息與智能測繪時代,我們可以在手機、筆記本電腦等多種設備上隨時隨地看到很漂亮的全景照片,仰以觀于天文,俯以察于地理,可以全景圖片視頻拍攝,可以任意放大縮小、漫游、重力感應、VR眼睛虛擬體驗等等,其樂無窮。作為一個GISer,采集地理信息,探索…

一篇文帶你從0到1了解建站及完成CMS系統編寫

學習目標 了解搭建一般網站的簡便方式了解最原始一般站點搭建了解內容管理站點搭建了解權限設計及完成了解使用設計模式減少代碼冗余了解前端拖拽頁面生成及生成了解自定義數據的創建了解動態生成的前端頁如何綁定自定義數據 開發環境 Windows7 *64 SP1php5.6apache/nginxth…

判斷輸入的整數是否為素數_C語言 | 判斷是否素數

“要成為絕世高手&#xff0c;并非一朝一夕&#xff0c;除非是天生武學奇才&#xff0c;但是這種人…萬中無一”——包租婆這道理放在C語言學習上也一并受用。在編程方面有著天賦異稟的人畢竟是少數&#xff0c;我們大多數人想要從C語言小白進階到高手&#xff0c;需要經歷的是…

Button的設置及各種屬性

&#xff08;1&#xff09;UIButton類繼承自UIControl&#xff0c;而UIControl繼承自UIView&#xff0c;因為UIView就是個矩形區域&#xff0c;所以UIButton實例化的對象其實都是一個矩形&#xff0c;雖然有各種圓角、增加聯系人、信息按鈕等等&#xff0c;給它們加個背景它們就…

『技術群里聊些啥』Task 不是你想 Cancel,想 Cancel 就能 Cancel

前言在群里看到有人問如何取消這個 Task 的執行&#xff1a;實際上這并不會取消S1eepMode1方法的執行&#xff1a;這是為什么呢&#xff1f;原因首先&#xff0c;讓我們看看s_cts.Cancel()都做了啥&#xff1a;public void Cancel() > Cancel(false);public void Cancel(boo…

SQL Server數據庫鎖的類型、用法及注意事項詳解

一、為什么要引入鎖 多個用戶同時對數據庫的并發操作時會帶來以下數據不一致的問題: 丟失更新:A,B兩個用戶讀同一數據并進行修改,其中一個用戶的修改結果破壞了另一個修改的結果,比如訂票系統 臟讀:A用戶修改了數據,隨后B用戶又讀出該數據,但A用戶因為某些原因取消了對數…

Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap簡單的區別

一、 HashMap 1&#xff09;底層實現 數組鏈表紅黑樹&#xff08;在JDK1.8中如果鏈表長度大于8的時候才轉換為紅黑樹) 2&#xff09;是否線程安全不支持線程的同步&#xff0c;線程不安全&#xff0c;如需同步&#xff0c;可用Collections的synchronizedMap方法或者使用Concu…

《零基礎看得懂的C語言入門教程 》——(八)了解基本數組還不是那么簡單

一、學習目標 了解數組的使用方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1a;&#xff08;二&#xff09;C語言沒那么難簡單開發帶你了解流程 第…

推導坐標旋轉公式(轉)

在《Flash actionScript 3.0 動畫教程》一書中有一個旋轉公式&#xff1a; x1cos(angle)*x-sin(angle)*y; y1cos(angle)*ysin(angle)*x; 其中x&#xff0c;y表示物體相對于旋轉點旋轉angle的角度之前的坐標&#xff0c;x1&#xff0c;y1表示物體旋轉angle后相對于旋轉點的坐標 …

任務管理平臺_jytask一個任務調度統一管理平臺

task介紹和使用https://gitee.com/yuejing/task 下的文檔&#xff1a;[doc/task介紹和使用.docx]task是什么&#xff1f;task是一個任務調度統一管理平臺。 目前主要是通過http來進行任務的調度&#xff0c;http支持簽名算法。一張圖能更加懂它是做什么的(一個集中管理任務的平…

設計一個支持百萬用戶的系統

設計一個支持數百萬用戶的系統是非常有挑戰性的, 這是一個需要不斷調整和優化的過程, 接下來的內容中, 我將構建一個系統, 從單個用戶開始&#xff0c;到最后支持數百萬的用戶。從單個服務開始 千里之行&#xff0c;始于足下&#xff0c;讓我們從最簡單的單個服務開始。所有的…

SQL Server T-SQL編程:數據庫用戶與安全設置

目錄 一、數據庫的注冊、用戶建立 二 、用戶安全設置:角色

原百萬訪問量博客http://blog.chinaunix.net/uid/20656672.html不再維護(10年前數百篇oracle/teradata性能優化、故障處理案例)...

原博客地址http://blog.chinaunix.net/uid/20656672.html不再維護&#xff08;數百篇oracle/teradata性能優化、故障處理原創文章&#xff09;轉載于:https://www.cnblogs.com/zhjh256/p/5497797.html

《零基礎看得懂的C語言入門教程 》——(九)C語言二維數組與循環嵌套

一、學習目標 了解二維數組的使用方法了解循環嵌套的使用方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1a;&#xff08;二&#xff09;C語言沒那么…

LRU算法

1 LRU算法 LRU(Least recently used,最近最少使用)根據數據的歷史訪問記錄來進行淘汰數據,思想是“如果數據最近被訪問過,那么將來被訪問的幾率也更高”。 2 具體實現過程 新數據插入到鏈表頭部; 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部; 當鏈表滿…

Scala-2.13.0 安裝及配置

Scala 簡介 Scala 是一門多范式&#xff08;multi-paradigm&#xff09;的編程語言&#xff0c;設計初衷是要集成面向對象編程和函數式編程的各種特性。 Scala 運行在Java虛擬機上&#xff0c;并兼容現有的Java程序。 Scala 源代碼被編譯成Java字節碼&#xff0c;所以它可以運…

檢測python進程是否存活

crontab -e */3 * * * * /data/log_realtime/check.sh > /data/log_realtime/check.log 2>&1 1 0 1 * * /data/jx3log_import_realtime/shutdown.sh 說明&#xff1a;每3分鐘檢查一次進程是否存在&#xff0c;每個月1號0點1分殺掉進程&#xff0c;重啟 check.sh cd …

中科大鏡像源_JETPACK4.4安裝軟件和備份鏡像的方法介紹

一、使用SDK Manager的文件夾安裝Jetson軟件(以NX為例)當JETPACK安裝出現錯誤的時候&#xff0c;可以嘗試下面的安裝辦法&#xff0c;前提是JETPACK4.4完整安裝(即本文第三節的下載已經完成)&#xff0c;并且選擇JETSON NX的相關的下載已經完成。安裝步驟&#xff1a;1、$cd /n…

站在前人的肩膀上重新透視C# SpanT數據結構

先談一下我對Span的看法&#xff0c; Span是指向任意連續內存空間的類型安全、內存安全的視圖&#xff0c;可操作的滑動窗口。Span和Memory都是包裝了可以在pipeline上使用的結構化數據的內存緩沖器,他們被設計用于在pipeline中高效傳遞數據。定語解讀這里面許多定語&#xff0…

集合學習

List集合&#xff1a;ArrayList集合基于動態數組結構&#xff0c;查詢優&#xff0c;LinkedList 基于鏈表結構 數據移動優。是一個有序的隊列集合 set集合&#xff1a;HashSet和TreeSet 。是一個無序不重復集合 Map集合&#xff1a;HashMap和TreeMap。是一個KEY-VALUE映射的集合…