我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中ConcurrentHashMap是怎么实现线程安全的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中ConcurrentHashMap是怎么实现线程安全的

这篇文章主要介绍“Java中ConcurrentHashMap是怎么实现线程安全的”,在日常操作中,相信很多人在Java中ConcurrentHashMap是怎么实现线程安全的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中ConcurrentHashMap是怎么实现线程安全的”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

语法:

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

其中 K 指的是这个映射所维护的键的类型,V 指的是映射值的类型

ConcurrentHashmap 的需要:

  • HashMap虽然有很多优点,但不能用于多线程,因为它不是线程安全的。

  • 尽管 Hashtable 被认为是线程安全的,但它也有一些缺点。例如,Hashtable 需要锁定才能读取打开,即使它不影响对象。

  • n HashMap,如果一个线程正在迭代一个对象,另一个线程试图访问同一个对象,它会抛出 ConcurrentModificationException,而并发 hashmap 不会抛出 ConcurrentModificationException。

如何使 ConcurrentHashMap 线程安全成为可能?

  • java.util.Concurrent.ConcurrentHashMap类通过将map划分为segment来实现线程安全,不是整个对象需要锁,而是一个segment,即一个线程需要一个segment的锁。

  • 在 ConcurrenHashap 中,读操作不需要任何锁。

示例 1:

import java.util.*;import java.util.concurrent.*;// 扩展Thread类的主类class GFG extends Thread { // 创建静态 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(    "主线程迭代映射和当前条目是:"    + I1 + "..." + m.get(I1));   Thread.sleep(3000);  }  System.out.println(m); }}

输出:
主线程迭代映射和当前条目是: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)

输出说明:

上述程序中使用的类扩展了 Thread 类。让我们看看控制流。所以,最初,上面的java程序包含一个线程。当我们遇到语句 Main t= new Main() 时,我们正在为扩展 Thread 类的类创建一个对象。因此,每当我们调用 t.start() 方法时,子线程都会被激活并调用 run() 方法. 现在主线程开始执行,每当子线程更新同一个地图对象时,都会抛出一个名为 ConcurrentModificationException 的异常。    

现在让我们使用 ConcurrentHashMap 来修改上面的程序,以解决上述程序在执行时产生的异常。

示例 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(    "主线程迭代映射和当前条目是:"    + I1 + "..." + m.get(I1));   Thread.sleep(3000);  }  System.out.println(m); }}

输出

主线程迭代映射和当前条目是:101...A
子线程更新映射
主线程迭代映射和当前条目是:102...B
主线程迭代映射和当前条目是:103...C
{101=A, 102=B, 103=C}

输出说明:
上述程序中使用的 Class 扩展了Thread 类。让我们看看控制流,所以我们知道在 ConcurrentHashMap 中,当一个线程正在迭代时,剩余的线程可以以安全的方式执行任何修改。上述程序中主线程正在更新Map,同时子线程也在尝试更新Map对象。本程序不会抛出 ConcurrentModificationException。

Hashtable、Hashmap、ConcurrentHashmap的区别

HashtableHashmapConcurrentHashmap
我们将通过锁定整个地图对象来获得线程安全。它不是线程安全的。我们将获得线程安全,而无需使用段级锁锁定 Total Map 对象。
每个读写操作都需要一个objectstotal 映射对象锁。它不需要锁。读操作可以不加锁执行,写操作可以用段级锁执行。
一次只允许一个线程在地图上操作(同步)不允许同时运行多个线程。它会抛出异常一次允许多个线程以安全的方式操作地图对象
当一个线程迭代 Map 对象时,其他线程不允许修改映射,否则我们会得到 ConcurrentModificationException当一个线程迭代 Map 对象时,其他线程不允许修改映射,否则我们会得到 ConcurrentModificationException当一个线程迭代 Map 对象时,其他线程被允许修改地图,我们不会得到 ConcurrentModificationException
键和值都不允许为 NullHashMap 允许一个空键和多个空值键和值都不允许为 Null。
在 1.0 版本中引入在 1.2 版本中引入在 1.5 版本中引入

到此,关于“Java中ConcurrentHashMap是怎么实现线程安全的”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中ConcurrentHashMap是怎么实现线程安全的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中ConcurrentHashMap是怎么实现线程安全的

这篇文章主要介绍“Java中ConcurrentHashMap是怎么实现线程安全的”,在日常操作中,相信很多人在Java中ConcurrentHashMap是怎么实现线程安全的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
2023-06-25

Java中使用ConcurrentHashMap实现线程安全的Map

在Java中,ConcurrentHashMap是一种线程安全的哈希表,可用于实现多线程环境下的Map操作。它支持高并发的读写操作,通过分段锁的方式实现线程安全,同时提供了一些高级功能,比如迭代器弱一致性和批量操作等。ConcurrentHashMap在高并发场景中具有重要的应用价值
2023-05-17

ConcurrentHashMap是如何实现线程安全的你知道吗

这篇文章主要介绍了ConcurrentHashMap是如何实现线程安全的你知道吗,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

Java中怎么实现线程安全

Java中怎么实现线程安全,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、使用synchronized关键字synchronized关键字可以修饰方法和代码块,它的语义是
2023-06-16

java中是如何实现集合的线程安全的

今天就跟大家聊聊有关java中是如何实现集合的线程安全的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。线程安全首先要明白线程的工作原理,jvm有一个main memory,而每个线程
2023-05-31

java中多线程和线程安全是什么

这篇文章给大家分享的是有关java中多线程和线程安全是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是进程?电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如下图中
2023-06-25

C#中怎么实现多线程安全

C#中怎么实现多线程安全,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#多线程控制进度条之多线程安全的问题:我们知道 Windows 编程中有一个必须遵守的原则,那就是在一个
2023-06-17

Java中线程安全的实现思路介绍

今天小编给大家分享的是Java中线程安全的实现思路介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。在 Java 多线程编程中,线程安全是一个非常重要的概念。 线程安全通常指程序在多
2023-07-06

Java并发编程之线程安全性怎么实现

今天小编给大家分享一下Java并发编程之线程安全性怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.什么是线程安全性
2023-06-29

Java线程安全中的有序性是什么

这篇文章主要介绍了Java线程安全中的有序性是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java线程安全中的有序性是什么文章都会有所收获,下面我们一起来看看吧。什么是有序性在开发中,我们通常按照从上到下
2023-07-05

Java线程安全中的原子性是什么

本篇内容介绍了“Java线程安全中的原子性是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!何为原子性原子性:一条线程在执行一系列程序指令
2023-07-05

java中实现线程安全的方式有哪些

要实现线程安全一般至少需要两个特性:原子性和可见性。实现方式:1)使用synchronize:它本具有原子性和可见性的,所以如果使用了synchronize修饰的操作,那么就自带了可见性,synchronized使用悲观锁来实现线程安全;2)使用原子类代替基本
java中实现线程安全的方式有哪些
2022-04-13

java中实现线程安全的方法有哪些

java中实现线程安全的方法有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和
2023-06-14

Java中线程安全有哪些实现思路

在Java多线程编程中,线程安全是一个非常重要的概念,本文主要介绍了Java中线程安全有哪些实现思路,非常具有实用价值,需要的朋友可以参考下
2023-05-20

Java语言中的线程安全问题是怎样的

Java语言中的线程安全问题是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java语言是一种支持多线程的语言,它通过同步(互斥)和协作(等待和唤醒)来完成。这里聊聊同步
2023-06-17

java多线程怎么保证线程安全

Java中有多种方式可以保证线程安全,以下是一些常见的方法:1. 使用synchronized关键字:使用synchronized关键字可以将代码块或方法标记为同步的,只有一个线程能够进入同步块或方法执行,其他线程需要等待。这样可以确保同一
2023-09-13

Java中Map实现线程安全的方式有哪些

这篇“Java中Map实现线程安全的方式有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中Map实现线程安全的方
2023-06-29

java线程不安全的原因是什么

今天就跟大家聊聊有关java线程不安全的原因是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录