首页 > 其他分享 >线程-线程不安全

线程-线程不安全

时间:2023-11-27 23:44:22浏览次数:31  
标签:hash HashMap 链表 安全 线程 多线程 死循环

线程不安全

例如:线程不安全的HashMap
在多线程环境下,使用HashMap进行put操作会引起死循环,
导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。例如,执行以下代码会引起死循环。

final HashMap<String, String> map = new HashMap<> (2);
Thread t = new Thread (() -> {
for (int i = 0; i < 10000; i++) {
new Thread (() -> map.put (UUID.randomUUID ().toString (), ""), "ftf" + i).start ();
}
}, "ftf");
t.start();
t.join();

1.HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,
一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry。
2.JDK1.8之前,为了提高rehash的速度,冲突链表是使用头插法,因为头插法是操作速度最快的,
找到数组位置就直接找到插入位置了,头插法在多线程下回引起死循环
3.JDK1.8之后开始加入红黑树,当链表长度大于8时链表就会转换成红黑树,这样就大大提高了在冲突链表查找的速度,同时因为链表的长度不可能大于8,
链表在rehash的消耗就小很多,所以JDK1.8使用尾插法也避免了死循环问题。

数据丢失问题

HashMap部分源码:

if ((p = tab[i = (n - 1) & hash]) == null) // 如果没有hash碰撞则直接插入元素

这是jdk1.8中HashMap中put操作的主函数, 注意这行代码,如果没有hash碰撞则会直接插入元素。


假设线程A和线程B同时进行put操作,刚好这两条不同的数据hash值一样,并且该位置数据为null,所以这线程A、B都会进入这行代码中。


假设一种情况,线程A进入后还未进行数据插入时挂起,而线程B正常执行,从而正常插入数据,然后线程A获取CPU时间片,此时线程A不用再进行hash判断了,问题出现:线程A会把线程B插入的数据给覆盖,发生线程不安全。
总结:

在jdk1.7中,在多线程环境下,扩容时会造成环形链或数据丢失。
在jdk1.8中,在多线程环境下,会发生数据覆盖的情况。

标签:hash,HashMap,链表,安全,线程,多线程,死循环
From: https://www.cnblogs.com/nxjblog/p/17860858.html

相关文章

  • 一些Linux下系统安全软件的最小可用知识(目前1个软件)
    ClamAV使用概述ClamAV杀毒是Linux平台最受欢迎的杀毒软件,ClamAV属于免费开源产品,支持多种平台。ClamAV是基于病毒扫描的命令行工具,但同时也有支持图形界面的ClamTK工具。ClamAV主要用于邮件服务器扫描邮件。它有多种接口从邮件服务器扫描邮件,支持文件格式有如:ZIP、RAR、TAR......
  • Linux多线程同步机制(下)
    @TOC前言一、读写锁多线程同步机制中的读写锁(Read-WriteLock)是一种特殊的锁机制,用于控制对共享资源的读写访问。读写锁允许多个线程同时读取共享资源,但在写操作时需要独占访问。读写锁的基本原则是:多个线程可以同时获取读锁,但只有一个线程可以获取写锁。当有线程持有写锁时,其他线......
  • HTTP 和 HTTPS 之间除了安全性区别外,还有哪些区别
    HTTP和HTTPS是两种常见的网络协议,它们都是用于在浏览器和服务器之间传输数据的。但是,它们之间也有一些重要的区别,这些区别涉及到数据的安全性、传输性能、使用成本和搜索排名等方面。本文将从以下几个方面来介绍HTTP和HTTPS的区别,本文内容大纲如下:数据的安全性HTTP协议......
  • 打造有效安全闭环,天翼云MDR来了!
    随着网络攻-防对抗形势愈演愈烈,传统的安全防护模式已难以应对频率暴增、昼夜不停的网络安全攻-击,提升组织安全防护能力势在必行。事实上,一些单位在网络安全建设工作中经验不足,在安全组件/设备采购方面大量投入,部署后却缺乏专人运营。这导致在安全事件发生时,组织不能及时发现并进行......
  • 用户密码安全存储
    用户密码安全存储关键字:AES加密,CBC,Java浏览器或者各种客户端实现注册功能时,对用户密码的存储,该如何保证密码的安全?关于方案客户端使用AES(本文使用AES加密)算法对密码进行加密,然后将加密后的密码通过BASE64编码发送给服务器。服务端收到后,BASE64解码,然后使用与客户端相同的密......
  • 线程池详解
    1.线程池作用提升资源使用率,避免无意义的线程重复创建销毁成本提升反应速度,已提前创建线程方便管理线程资源,如可控制并发量、批量中断等参数publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,......
  • Spring Boot 关闭 Actuator ,满足安全工具扫描
    应用被安全工具,扫描出漏洞信息【MSS】SpringBootActuator敏感接口未授权访问漏洞(Actuator)事件发现通告:发现时间:2023-11-2519:47:17攻击时间:2023-11-2518:56:44事件/告警类型:非授权访问/权限绕过告警设备:APT攻击IP:xxx被攻击IP/资产信息:xxx告警描述:SpringBootActuator......
  • 振弦式轴力计和振弦采集仪组成的安全监测解决方案
    振弦式轴力计和振弦采集仪组成的安全监测解决方案振弦式轴力计和振弦采集仪是一种常用的结构安全监测工具,可以用于评估建筑物、桥梁、隧道或其他结构的结构健康状态和安全性能。这种监测方案较为先进、精确,并且能够监测长期的结构反应,因此在工程领域中广泛应用。 下面是振弦......
  • 构建卓越Kubernetes安全之路:最佳实践与军规
    Kubernetes作为现代云原生计算的中流砥柱,其安全性是我们构建稳健应用生态的首要任务。在这篇博文中,我们将探讨构建卓越Kubernetes安全的道路,通过最佳实践和制定安全军规,确保您的集群免受威胁。1. 了解威胁与风险在开始构建安全之旅之前,深入了解可能的威胁和风险是关键一步。考虑容......
  • socket测试(多线程,课上测试)
    基于socket实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端服务器响应消息格式是“客户端IP:XXXX客户端PID:XXXX服务器tid:XXXX服务器实现者学号:XXXXXXXX当前时间:XX:XX:XX”注意服务器端要通过多线程实现,每次客户端链接到服务器,服务器就启动一个新线程和客户端连......