资讯专栏INFORMATION COLUMN

HashMap是非线程安全的,那么原因是什么呢?(HashMap的死锁)

lieeps / 2726人阅读

摘要:为了解决这个问题设计了一个阈值,其值为容量的,当所用容量超过了阈值后,就会自动扩充其容量。如果条件竞争发生了,那么就会产生死循环了。

由于HashMap的容量是有限的,如果HashMap中的数组的容量很小,假如只有2个,那么如果要放进10个keys的话,碰撞就会非常频繁,此时一个O(1)的查找算法,就变成了链表遍历,性能变成了O(n),这是Hash表的缺陷。

为了解决这个问题,HashMap设计了一个阈值,其值为容量的0.75,当HashMap所用容量超过了阈值后,就会自动扩充其容量。

在多线程的情况下,当重新调整HashMap大小的时候,就会存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历。如果条件竞争发生了,那么就会产生死循环了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75156.html

相关文章

  • 分享一份非常强势Android面试题

    摘要:马上步入金九银十了,是时候看一些面试题去鹅厂了,接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助和区别参考链接既然在很多方面能取代,为什么没把划上一条过时的横线答案可以沿着回收机制来回答。静态内部类的设计意图。 马上步入金九银十了,是时候看一些面试题去鹅厂了,接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助! ListView和RecyclerView区别 参考...

    opengps 评论0 收藏0
  • 【面试】Java相关

    摘要:可能会持有相同的值对象但键对象必须是唯一的。当有新任务到达时,线程池没有线程则创建线程处理,处理完成后该线程缓存秒,过期后回收,线程过期前有新任务到达时,则使用缓存的线程来处理。解决死锁问题的三种方法预防死锁检测死锁及避免死锁。 最近辞职准备面试,顺便整理一下面试题分享给大家,如有错误欢迎指出 01. 你对面向对象思想的理解? 面向对象编程简称OOP,是开发程序的一种方法、思想。面向...

    icattlecoder 评论0 收藏0
  • 超详细Java面试题总结(二)之Java基础知识篇

    摘要:超详细的面试题总结一之基本知识多线程和虚拟机创建线程有几种不同的方式你喜欢哪一种为什么继承类实现接口应用程序可以使用框架来创建线程池实现接口。死亡线程方法执行结束,或者因异常退出了方法,则该线程结束生命周期。死亡的线程不可再次复生。 超详细的Java面试题总结(一)之Java基本知识 多线程和Java虚拟机 创建线程有几种不同的方式?你喜欢哪一种?为什么? 继承Thread类 实现R...

    wangjuntytl 评论0 收藏0
  • Java 最常见 200+ 面试题全解析:面试必备(附答案)

    摘要:的简称,运行环境,为的运行提供了所需环境。分割字符串,返回一个分割后的字符串数组。线程安全是线程安全的,而是非线程安全的。迭代器取代了集合框架中的,迭代器允许调用者在迭代过程中移除元素。 本文分为十九个模块,分别是: Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Clou...

    hufeng 评论0 收藏0
  • 第10章:并发和分布式编程 10.1并发性和线程安全

    摘要:并发模块本身有两种不同的类型进程和线程,两个基本的执行单元。调用以启动新线程。在大多数系统中,时间片发生不可预知的和非确定性的,这意味着线程可能随时暂停或恢复。 大纲 什么是并发编程?进程,线程和时间片交织和竞争条件线程安全 策略1:监禁 策略2:不可变性 策略3:使用线程安全数据类型 策略4:锁定和同步 如何做安全论证总结 什么是并发编程? 并发并发性:多个计算同时发生。 在现代...

    instein 评论0 收藏0

发表评论

0条评论

lieeps

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<