国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
方式1. ?使用Hashtable
方式2. ?使用Collections.synchronizedMap(new Hashtable())
方式3. ?使用ConcurrentHashMap
首頁 Java java教程 Java中Map實(shí)作執(zhí)行緒安全的方式有哪些

Java中Map實(shí)作執(zhí)行緒安全的方式有哪些

Apr 19, 2023 pm 07:52 PM
java map

方式1. ?使用Hashtable

Map<String,Object> hashtable=new Hashtable<String,Object>();

這是所有人最先想到的,那為什麼它是執(zhí)行緒安全的?那就看看它的原始碼,我們可以看出我們常用的put,get,containsKey等方法都是同步的,所以它是線程安全的

public synchronized boolean containsKey(Object key) {
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                return true;
            }
        }
        return false;
    }

 public synchronized V get(Object key) {
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                return (V)e.value;
            }
        }
        return null;
    }
     public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }

        // Makes sure the key is not already in the hashtable.
        Entry<?,?> tab[] = table;
        int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
        @SuppressWarnings("unchecked")
        Entry<K,V> entry = (Entry<K,V>)tab[index];
        for(; entry != null ; entry = entry.next) {
            if ((entry.hash == hash) && entry.key.equals(key)) {
                V old = entry.value;
                entry.value = value;
                return old;
            }
        }

        addEntry(hash, key, value, index);
        return null;
    }

其實(shí)現(xiàn)原理是在增刪改查的方法上使用了synchronized鎖定機(jī)制,在多執(zhí)行緒環(huán)境下,無論是讀取數(shù)據(jù),或是修改數(shù)據(jù),在同一時(shí)刻只能有一個(gè)執(zhí)行緒在執(zhí)行synchronize方法,因?yàn)槭菍φ麄€(gè)表進(jìn)行鎖定。所以線程越多,對該map的競爭越激烈,效率越低,不建議使用。

方式2. ?使用Collections.synchronizedMap(new Hashtable())

其實(shí)作原理是使用工具類別裡面的靜態(tài)方法,把傳入進(jìn)來的Hashtable包裝成同步的,即在增刪改查的方法增加了synchronized所機(jī)制,其實(shí)作方式與Hashtable差不多,效率也差不多,不建議使用。

Map map = Collections.synchronizedMap(new Hashtable());

以下是JDK原始碼

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
        return new SynchronizedMap<>(m);
}
private static class SynchronizedMap<K,V>
        implements Map<K,V>, Serializable {
        private static final long serialVersionUID = 1978198479659022715L;
 
        private final Map<K,V> m;     // Backing Map
        final Object      mutex;        // Object on which to synchronize
 
        SynchronizedMap(Map<K,V> m) {
            this.m = Objects.requireNonNull(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();}
        }
        ......
    }

方式3. ?使用ConcurrentHashMap

? ? ? ? 其實(shí)作原理是Hashtable是整個(gè)表格加鎖,而ConcurrentHashMap是將表格進(jìn)行分段,初始情況下分成16段,每一段都有一把鎖,當(dāng)多個(gè)執(zhí)行緒存取不同的段時(shí),因?yàn)槿〉玫降逆i是不同的,所以可以並行的存取。效率比Hashtable高多了,建議使用。

以上是Java中Map實(shí)作執(zhí)行緒安全的方式有哪些的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

用Python生成序列產(chǎn)生關(guān)鍵字 用Python生成序列產(chǎn)生關(guān)鍵字 Jul 16, 2025 am 04:50 AM

yield關(guān)鍵字用於創(chuàng)建生成器,按需產(chǎn)生值,節(jié)省內(nèi)存。 1.替代return生成有限序列,如斐波那契數(shù)列;2.實(shí)現(xiàn)無限序列,如自然數(shù)列;3.處理大數(shù)據(jù)或文件讀取,逐行處理避免內(nèi)存溢出;4.注意生成器只能遍歷一次,可用next()或for循環(huán)調(diào)用。

了解PHP變量類型 了解PHP變量類型 Jul 17, 2025 am 04:12 AM

PHP有8種變量類型,常用包括Integer、Float、String、Boolean、Array、Object、NULL和Resource。要查看變量類型,可使用gettype()或is_type()系列函數(shù)。 PHP會(huì)自動(dòng)轉(zhuǎn)換類型,但建議關(guān)鍵邏輯用===嚴(yán)格比較。手動(dòng)轉(zhuǎn)換可用(int)、(string)等語法,但注意可能丟失信息。

變量的魔力 變量的魔力 Jul 16, 2025 am 03:26 AM

VariableVariables是PHP中一種將變量值作為另一個(gè)變量名使用的特性,它通過$$var的形式實(shí)現(xiàn)動(dòng)態(tài)訪問變量、處理表單輸入和構(gòu)建靈活配置結(jié)構(gòu)等功能。例如$name="age";echo$$name相當(dāng)於輸出$age的值;常見使用場景包括:1.動(dòng)態(tài)訪問變量,如${$type.'_info'}可根據(jù)條件選擇不同變量;2.處理表單輸入時(shí)自動(dòng)賦值,但需注意安全隱患;3.構(gòu)建靈活的配置結(jié)構(gòu),通過字符串名稱獲取對應(yīng)值;使用時(shí)需注意代碼維護(hù)性、命名衝突和調(diào)試難度等問題,建議僅

探索基本的PHP語法 探索基本的PHP語法 Jul 17, 2025 am 04:11 AM

PHP基礎(chǔ)語法包括:1.使用包裹代碼;2.用echo或print輸出內(nèi)容,其中echo支持多參數(shù);3.變量無需聲明類型,以$開頭,常見類型有字符串、整數(shù)、浮點(diǎn)數(shù)、布爾值、數(shù)組和對象。掌握這些要點(diǎn)有助於快速入門PHP開發(fā)。

了解PHP文件 了解PHP文件 Jul 17, 2025 am 04:13 AM

PHP文件是一種服務(wù)器端腳本語言文件,用於動(dòng)態(tài)網(wǎng)頁開發(fā),能處理表單數(shù)據(jù)、連接數(shù)據(jù)庫、生成動(dòng)態(tài)內(nèi)容、控制訪問權(quán)限。它以.php結(jié)尾,代碼在服務(wù)器上執(zhí)行後返回結(jié)果給瀏覽器。要運(yùn)行PHP文件需安裝本地服務(wù)器環(huán)境如XAMPP,把文件放至服務(wù)器目錄並通過瀏覽器訪問。 PHP通常與HTML混合使用,建議學(xué)習(xí)前先掌握HTML、CSS、JavaScript及基本編程概念,多練習(xí)可快速上手。

常見的PHP變量錯(cuò)誤 常見的PHP變量錯(cuò)誤 Jul 17, 2025 am 04:08 AM

PHP變量使用常見錯(cuò)誤包括未定義變量、引用賦值不當(dāng)、類型比較不嚴(yán)謹(jǐn)和全局變量混亂。 1.忽略變量未定義會(huì)引發(fā)Notice錯(cuò)誤,應(yīng)使用isset()或empty()檢查;2.引用賦值修改變量會(huì)影響其他變量,應(yīng)在循環(huán)後unset()清理;3.使用==會(huì)導(dǎo)致類型自動(dòng)轉(zhuǎn)換,應(yīng)優(yōu)先使用===進(jìn)行全等判斷;4.全局變量易造成混亂,建議避免或封裝成類屬性以提高代碼清晰度。

了解PHP變量 了解PHP變量 Jul 17, 2025 am 04:11 AM

PHP變量以$開頭,命名需遵循規(guī)則,如不能以數(shù)字開頭、區(qū)分大小寫;變量作用域分為局部、全局和超全局;使用global可訪問全局變量,但建議用參數(shù)傳遞;可變變量和引用賦值需謹(jǐn)慎使用。變量是存儲(chǔ)數(shù)據(jù)的基礎(chǔ),正確掌握其規(guī)則和機(jī)制對開發(fā)至關(guān)重要。

進(jìn)行網(wǎng)絡(luò)掃描儀開發(fā) 進(jìn)行網(wǎng)絡(luò)掃描儀開發(fā) Jul 17, 2025 am 03:30 AM

開發(fā)Go網(wǎng)絡(luò)掃描器需把握四個(gè)核心點(diǎn):1.選擇合適的庫如net、gopacket;2.理解ICMP、TCP、SYN、UDP等底層協(xié)議;3.利用goroutine和channel設(shè)計(jì)並發(fā)機(jī)制並控制數(shù)量;4.確保掃描合規(guī)性避免濫用。網(wǎng)絡(luò)掃描基本方式包括ICMP探測主機(jī)存活、TCP/SYN/UDP端口檢測等,Go的net庫可實(shí)現(xiàn)基礎(chǔ)掃描,gopacket支持原始數(shù)據(jù)包操作。通過限制goroutine數(shù)量配合WaitGroup和緩衝channel可提升效率。注意事項(xiàng)包括合法授權(quán)、速率控制、避免公網(wǎng)大規(guī)模掃

See all articles