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

Java中ConcurrentHashMap是如何實(shí)現(xiàn)線程安全

 更新時(shí)間:2021年11月03日 16:14:48   作者:海擁  
ConcurrentHashMap是一個(gè)哈希表,支持檢索的全并發(fā)和更新的高預(yù)期并發(fā)。本文主要介紹了Java中ConcurrentHashMap是如何實(shí)現(xiàn)線程安全,感興趣的可以了解一下

ConcurrentHashMap是一個(gè)哈希表,支持檢索的全并發(fā)和更新的高預(yù)期并發(fā)。此類遵循與 Hashtable 相同的功能規(guī)范,并包含 Hashtable 的所有方法。ConcurrentHashMap 位于 java.util.Concurrent 包中。

語法:

public class ConcurrentHashMap<K,V>
extends AbstractMap<K,V>
implements ConcurrentMap<K,V>, Serializable

其中 K 指的是這個(gè)映射所維護(hù)的鍵的類型,V 指的是映射值的類型

ConcurrentHashmap 的需要:

  • HashMap雖然有很多優(yōu)點(diǎn),但不能用于多線程,因?yàn)樗皇蔷€程安全的。
  • 盡管 Hashtable 被認(rèn)為是線程安全的,但它也有一些缺點(diǎn)。例如,Hashtable 需要鎖定才能讀取打開,即使它不影響對象。
  • n HashMap,如果一個(gè)線程正在迭代一個(gè)對象,另一個(gè)線程試圖訪問同一個(gè)對象,它會(huì)拋出 ConcurrentModificationException,而并發(fā) hashmap 不會(huì)拋出 ConcurrentModificationException。

如何使 ConcurrentHashMap 線程安全成為可能?

  • java.util.Concurrent.ConcurrentHashMap類通過將map劃分為segment來實(shí)現(xiàn)線程安全,不是整個(gè)對象需要鎖,而是一個(gè)segment,即一個(gè)線程需要一個(gè)segment的鎖。
  • 在 ConcurrenHashap 中,讀操作不需要任何鎖。

示例 1:

import java.util.*;
import java.util.concurrent.*;

// 擴(kuò)展Thread類的主類
class GFG extends Thread {

 // 創(chuàng)建靜態(tài) HashMap 類對象
 static HashMap m = new HashMap();

 public void run()
 {

  // try 塊檢查異常
  try {

   // 讓線程休眠 3 秒
   Thread.sleep(2000);
  }
  catch (InterruptedException e) {
  }
  System.out.println("子線程更新映射");
  m.put(103, "C");
 }
 public static void main(String arg[])
  throws InterruptedException
 {
  m.put(101, "A");
  m.put(102, "B");
  GFG t = new GFG();
  t.start();
  Set s1 = m.keySet();
  Iterator itr = s1.iterator();
  while (itr.hasNext()) {
   Integer I1 = (Integer)itr.next();
   System.out.println(
    "主線程迭代映射和當(dāng)前條目是:"
    + I1 + "..." + m.get(I1));
   Thread.sleep(3000);
  }
  System.out.println(m);
 }
}

輸出:
主線程迭代映射和當(dāng)前條目是:101...A
子線程更新映射
Exception in thread "main" java.util.ConcurrentModificationException
       at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)
       at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516)
       at Main.main(Main.java:30)

輸出說明:

上述程序中使用的類擴(kuò)展了 Thread 類。讓我們看看控制流。所以,最初,上面的java程序包含一個(gè)線程。當(dāng)我們遇到語句 Main t= new Main() 時(shí),我們正在為擴(kuò)展 Thread 類的類創(chuàng)建一個(gè)對象。因此,每當(dāng)我們調(diào)用 t.start() 方法時(shí),子線程都會(huì)被激活并調(diào)用 run() 方法. 現(xiàn)在主線程開始執(zhí)行,每當(dāng)子線程更新同一個(gè)地圖對象時(shí),都會(huì)拋出一個(gè)名為 ConcurrentModificationException 的異常。    

現(xiàn)在讓我們使用 ConcurrentHashMap 來修改上面的程序,以解決上述程序在執(zhí)行時(shí)產(chǎn)生的異常。

示例 2:

import java.util.*;
import java.util.concurrent.*;

class Main extends Thread {
 static ConcurrentHashMap<Integer, String> m
  = new ConcurrentHashMap<Integer, String>();
 public void run()
 {
  try {
   Thread.sleep(2000);
  }
  catch (InterruptedException e) {
  }
  System.out.println("子線程更新映射");
  m.put(103, "C");
 }
 public static void main(String arg[])
  throws InterruptedException
 {
  m.put(101, "A");
  m.put(102, "B");
  Main t = new Main();
  t.start();
  Set<Integer> s1 = m.keySet();
  Iterator<Integer> itr = s1.iterator();
  while (itr.hasNext()) {
   Integer I1 = itr.next();
   System.out.println(
    "主線程迭代映射和當(dāng)前條目是:"
    + I1 + "..." + m.get(I1));
   Thread.sleep(3000);
  }
  System.out.println(m);
 }
}

輸出

主線程迭代映射和當(dāng)前條目是:101...A
子線程更新映射
主線程迭代映射和當(dāng)前條目是:102...B
主線程迭代映射和當(dāng)前條目是:103...C
{101=A, 102=B, 103=C}

輸出說明:
上述程序中使用的 Class 擴(kuò)展了Thread 類。讓我們看看控制流,所以我們知道在 ConcurrentHashMap 中,當(dāng)一個(gè)線程正在迭代時(shí),剩余的線程可以以安全的方式執(zhí)行任何修改。上述程序中主線程正在更新Map,同時(shí)子線程也在嘗試更新Map對象。本程序不會(huì)拋出 ConcurrentModificationException。

Hashtable、Hashmap、ConcurrentHashmap的區(qū)別

Hashtable Hashmap ConcurrentHashmap
我們將通過鎖定整個(gè)地圖對象來獲得線程安全。 它不是線程安全的。 我們將獲得線程安全,而無需使用段級(jí)鎖鎖定 Total Map 對象。
每個(gè)讀寫操作都需要一個(gè)objectstotal 映射對象鎖。 它不需要鎖。 讀操作可以不加鎖執(zhí)行,寫操作可以用段級(jí)鎖執(zhí)行。
一次只允許一個(gè)線程在地圖上操作(同步) 不允許同時(shí)運(yùn)行多個(gè)線程。它會(huì)拋出異常 一次允許多個(gè)線程以安全的方式操作地圖對象
當(dāng)一個(gè)線程迭代 Map 對象時(shí),其他線程不允許修改映射,否則我們會(huì)得到 ConcurrentModificationException 當(dāng)一個(gè)線程迭代 Map 對象時(shí),其他線程不允許修改映射,否則我們會(huì)得到 ConcurrentModificationException 當(dāng)一個(gè)線程迭代 Map 對象時(shí),其他線程被允許修改地圖,我們不會(huì)得到 ConcurrentModificationException
鍵和值都不允許為 Null HashMap 允許一個(gè)空鍵和多個(gè)空值 鍵和值都不允許為 Null。
在 1.0 版本中引入 在 1.2 版本中引入 在 1.5 版本中引入

到此這篇關(guān)于Java中ConcurrentHashMap是如何實(shí)現(xiàn)線程安全的文章就介紹到這了,更多相關(guān)Java ConcurrentHashMap線程安全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot整合Thymeleaf詳解

    Spring Boot整合Thymeleaf詳解

    這篇文章主要介紹了Spring Boot整合Thymeleaf詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Windows 下安裝配置 Eclipse詳細(xì)教程

    Windows 下安裝配置 Eclipse詳細(xì)教程

    Eclipse是一款非常優(yōu)秀的開源IDE,非常適合Java開發(fā),由于支持插件技術(shù),受到了越來越多的開發(fā)者的歡迎。配合眾多令人眼花繚亂的插件,完全可以滿足從企業(yè)級(jí)Java應(yīng)用到手機(jī)終端Java游戲的開發(fā)。本文將帶您手把手步入Eclipse的廣闊天地
    2016-09-09
  • 淺談Maven 項(xiàng)目中依賴的搜索順序

    淺談Maven 項(xiàng)目中依賴的搜索順序

    這篇文章主要介紹了淺談Maven 項(xiàng)目中依賴的搜索順序,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-09-09
  • Spring 異常單元測試的解決

    Spring 異常單元測試的解決

    這篇文章主要介紹了Spring 異常單元測試的解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • SpringBoot中的@Component注解源碼

    SpringBoot中的@Component注解源碼

    在SpringBoot中,@Component注解用于標(biāo)識(shí)一個(gè)類為Bean,并由Spring進(jìn)行管理,它需要配合@ComponentScan注解使用,后者負(fù)責(zé)掃描包含@Component的類,并進(jìn)行自動(dòng)裝配,本文給大家介紹SpringBoot中的@Component注解源碼,感興趣的朋友一起看看吧
    2024-01-01
  • SpringMVC事件監(jiān)聽ApplicationListener實(shí)例解析

    SpringMVC事件監(jiān)聽ApplicationListener實(shí)例解析

    這篇文章主要介紹了SpringMVC事件監(jiān)聽ApplicationListener實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 一文了解Spring中攔截器的原理與使用

    一文了解Spring中攔截器的原理與使用

    在web開發(fā)中,攔截器是經(jīng)常用到的功能。它可以幫我們預(yù)先設(shè)置數(shù)據(jù)以及統(tǒng)計(jì)方法的執(zhí)行效率等等。今天就來詳細(xì)的談一下spring中的攔截器,需要的可以參考一下
    2022-06-06
  • SpringBoot?將配置文件掛到?jar?包外面的操作方法

    SpringBoot?將配置文件掛到?jar?包外面的操作方法

    在 SpringBoot 中,可以將配置文件放在 jar 包外面,這樣可以方便地修改配置而不需要重新打包和部署,這篇文章主要介紹了SpringBoot?如何將配置文件掛到?jar?包外面,需要的朋友可以參考下
    2023-03-03
  • maven項(xiàng)目下solr和spring的整合配置詳解

    maven項(xiàng)目下solr和spring的整合配置詳解

    這篇文章主要介紹了maven項(xiàng)目下solr和spring的整合配置詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • review引發(fā)的有關(guān)于單例模式的思考

    review引發(fā)的有關(guān)于單例模式的思考

    一次代碼調(diào)試中發(fā)現(xiàn)一個(gè)情況,即我在查看memcached的connection時(shí),發(fā)現(xiàn)總是維持在100來個(gè)左右,當(dāng)然這看似沒什么問題,因?yàn)閙emcached默認(rèn)connection有1024個(gè)。
    2013-04-04

最新評論

宜阳县| 云梦县| 高阳县| 托里县| 海口市| 贞丰县| 镇赉县| 黄冈市| 南陵县| 中牟县| 辛集市| 永和县| 商都县| 大同县| 东乌珠穆沁旗| 如东县| 昆山市| 揭阳市| 锡林郭勒盟| 岢岚县| 客服| 中卫市| 儋州市| 濮阳市| 民乐县| 水城县| 榆树市| 福清市| 大厂| 灌阳县| 道孚县| 闵行区| 突泉县| 子洲县| 佛坪县| 丰城市| 龙里县| 乌拉特前旗| 板桥市| 澄城县| 扶沟县|