文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-25 12:15

关注

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

语法:

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

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

ConcurrentHashmap 的需要:

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

示例 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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯