首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ConcurrentHashMap的put方法

计算key的哈希值for自旋保证put成功如果没有初始化就初始化table有可能多个线程去调用initTable()方法去初始化,用cas加锁就行了,成功一次就行了通过与哈希取模计算数组下标,如果下标节点为...null,就通过cas放进数组当前下标的位置如果当前下标有值,并且发现当前节点正在做扩容迁移操作,就去帮助扩容如果既有值,又没在扩容,就锁住这个数组下标节点,开始进行put操作第一种情况当前节点是一个链表遍历整个链表判断...hash不存在,此时已经遍历到了最后一个节点e,然后把当前的key/value添加到链表e节点的后i面,尾插法第二种情况当前节点是红黑树将节点放入红黑树,具体怎么放的参考我另一篇同系列下的文章之红黑树put...进去之后,会对链表长度进行判断,如果链表的长度大于等于8,进行扩容或者转化为红黑树链表的扩容如果tab的长度小于64,则调用tryPresize()方法进行扩容链表的扩容的本质是16->32,将数组扩容一倍...,然后将老数组的数据迁移到新的数组如果为空就初始化数组,跟之前的initTable()方法一样如果已经是最大容量了,直接返回判断sizeCtl是否小于0,因为只有在扩容中的时候sizeCtl才会小于0变成

72010
您找到你想要的搜索结果了吗?
是的
没有找到

解析HashMap中的put方法

put方法的执行流程 我们直接通过一个程序来理解HashMap中put方法的执行流程,在put方法中,HashMap需要经历初始化、存值、扩容、解决冲突等等操作: public static void...接下来程序会执行put方法: public V put(K key, V value) { return putVal(hash(key), key, value, false, true);...} put方法又调用了putVal方法,并传入了key的hash,key,value等等参数,所以先来计算key的hash: static final int hash(Object key) {...所以,HashMap在第一次调用put方法时会创建一个总容量为16的Node类型数组(前提是调用无参构造方法),但实际上只有12的容量可以被使用,当第13个元素插入时,就需要考虑扩容。...,则将在第一次执行put方法时初始化一个总容量为16,实际可用容量为12的Node数组 当实际容量超过阈值时,HashMap会进行扩容,扩容至原容量的2倍 HashMap的put方法执行流程:首先判断当前

67310

8.并发容器ConcurrentHashMap#put方法解析

定位Segment的方法就是通过散列函数来定位,先通过hash方法对元素进行二次散列,这个算法较为复杂,其目的只有一个——减少散列冲突,使元素能均匀分布在不同的Segment上,提高容器的存取效率。...我们通过最直观最常用的put方法来观察ConcurrentHashMap是如何通过key值计算hash值在定位到Segment的: 1 //ConcurrentHashMap#put 2 public...Segment 11   return s.put(key, hash, value, false); 12 }   Segment.put方法就是将键、值构造为Entry节点加入到对应的Segment...不妨继续深入Segment.put方法 : 1 //Segment#put 2 final V put(K key, int hash, V value, boolean onlyIfAbsent...有关ConcurrentHashMap的get方法不再分析,过程总结为一句话:根据key值计算出hash值,根据hash值计算出对应的Segment,再在Segment下的HashEntry链表遍历查找

1.2K60

HashMap中的添加数据put方法:深入解析HashMap中的put方法——逐步揭秘数据添加过程

它的put方法是最常用的操作之一,本篇博客将深入探讨HashMap的put方法,逐步分解每个步骤,以便更好地理解数据的添加过程。 1....put方法首先会根据键的哈希码计算出存储桶(bucket)的位置。 2. 判断桶是否为空 一旦确定了存储位置,HashMap会检查该位置是否已经存在元素。...(1,1); //添加数据--->进入此方法 } } public V put(K key, V value...) { return putVal(hash(key), key, value, false, true); //继续进入方法 }...方法是一个复杂的过程,它涉及到了哈希桶的位置计算、冲突处理、链表转红黑树、键值对的替换与新增,以及在需要的情况下进行扩容等。

30310

安全研究 | 多种方式利用HTTP PUT方法漏洞

今天分享的文章是对HTTP PUT方法开启漏洞的多种应用讲析,在实战场景中,首先我们要确定目标网站是否启用了HTTP PUT方法,如果启用的话,我们就可以结合多种利用工具和相关方法,向目标网站上传Meterpreter...HTTP PUT方法介绍 HTTP PUT方法最早目的用于文件管理操作,可以对网站服务器中的文件实现更改删除的更新操作,该方法往往可以导致各种文件上传漏洞,造成严重的网站攻击事件。...GET\PUT\POST\GET等多种方法。...如下: 首先,我们需要确定目标机器是否开启HTTP PUT方法。...方法的漏洞利用 这里,我们还要说说用Metasploit本身来对PUT方法的漏洞利用,用其内置的auxiliary/scanner/http/http_put模块就能完成相关shell文件meter.php

5.9K30

Android自定义抛出异常的方法详解

前言 在android开发过程中,我们经常遇到异常的问题,崩溃抛出异常的时候,是非常令人烦闷的。...throw:抛出异常,一般是一个具体的异常。放置在方法体内,当代码执行此行并抛出一个具体的异常以后,此异常下面的逻辑代码均不会执行。...throws:抛出异常的声明,一般放在方法头,表示此方法的执行可能会引起某个异常,或某几个异常,throws 后面可以声明多个异常,如 : public static void function1()...throws Exception1, Exception2, Exception3{ } 而 throws引起的异常,一般由调用此方法方法去处理。...,要求是输入的 pointCount 要大于零,当输入的值不满足条件的时候,会抛出不安全异常,然后出现括号中提示,类似如下: ?

1.8K20

dotnet 6 已知问题 ManualResetEventSlim 的 Set 方法抛出空异常

当前这个问题在 .NET 7 修复 这是从我的埋点上报遥测收集到的异常信息,在线程池里面的调用堆栈,调用到 ManualResetEventSlim 的 Set 方法抛出了 System.NullReferenceException...而且通过异常的调用堆栈可以看到里面没有我编写的业务代码,大概可以证明是底层 dotnet 框架的问题 通过以上堆栈的 ThreadPoolWorkQueue.Dispatch 大概可以了解到属于线程池模块,在这里如果抛出了异常...应用程序进程是接不住的,将会闪退 换句话说就是遇到这个异常,约等于进程将会被炸掉 由于异常发生的次数太少,我也没有调查出来具体原因,而且进一步阅读 dotnet 仓库的源代码,我也没有找到任何可能在 Set 方法里面抛出的空异常...加上问号之后,将会先捕获 m_eventObj 对象作为一个变量,接着判断变量是否为空,不空才执行 Reset 方法,等同于以下代码 var eventObj = m_eventObj; if (eventObj

13120

审计Tomcat PUT方法任意文件写入(CVE-2017-12615)

欢迎关注我的微信公众号《壳中之魂》,查看更多网安文章 漏洞复现 产生原因 漏洞产生原因为web.xml里将readonly设置为了false(默认为true),导致了可以通过PUT写入任意文件 利用条件...>*.jspx 从中可以看出,除了.jsp和.jspx文件由JSPServlet处理,其他都由DefaultServelet处理(包括PUT...是由JSPServlet处理,所以无法触发漏洞 可以发现,即使即使readonly设置为false,tomcat也是不允许直接通过PUT方法上传jsp和jspx文件的,这是由于jsp和jspx文件是由org.apache.jasper.servlet.JspServlet...来处理,但是org.apache.jasper.servlet.JspServlet并不能处理PUT方法,所以要通过绕过来达到上传的目的 下面只对/绕过方法进行审计,针对%20、::$DATA绕过涉及到了...windows的特性过于复杂,可以查看参考文章 每一个Servlet的实现都要继承一个HttpServlet,在HttpServlet中有一个doPut方法来处理PUT方法,DefaulatServlet

96440

Java 阻塞队列 BlockingQueue 介绍: put,add 和 offer 三个方法

add(E element):将指定元素插入队列,如果队列已满,则抛出异常。offer(E element):将指定元素插入队列,如果队列已满,则返回 false。 下面将分别对这三个方法进行介绍。...put 方法put 方法是阻塞队列中的一种插入元素的方法,其特点是如果队列已满,则让线程进入等待状态,直到有空间可用。...,其特点是如果队列已满,则会抛出 IllegalStateException 异常。...该方法的定义为:javaCopy codeboolean add(E element)该方法接收一个待插入的元素,并将其放入队列中,如果队列已满,则会抛出异常。...put 方法会阻塞当前线程直至队列有空间可用,add 方法抛出异常,而 offer 方法会返回 false。根据实际需求选择合适的方法来使用阻塞队列,能够使多线程程序更加高效和安全。

51110

精讲RestTemplate第5篇-DELETE、PUT等请求方法使用详解

常用HTTP方法 RESTful风格语义(操作) GET 查询、获取数据 POST 新增、提交数据 DELETE 删除数据 PUT 更新、修改数据 HEAD 获取HTTP请求头数据 OPTIONS 判断...URL提供的当前API支持哪些HTTP method方法 在前面的章节,我已经为大家详细的介绍了RestTemplate的GET和POST的相关的使用方法,本节来为大家介绍DELETE、PUT、HEAD...二、使用 DELETE方法去删除资源 删除一个已经存在的资源,使用RestTemplate的delete(uri)方法。该方法会向URL代表的资源发送一个HTTP DELETE方法请求。...二、使用PUT方法去修改资源 修改一个已经存在的资源,使用RestTemplate的put()方法。该方法会向URL代表的资源发送一个HTTP PUT方法请求。...三、通用请求方法exchange方法 exchange方法是一个通用的方法,它可以发送GET、POST、DELETE、PUT等等HTTP方法请求。

1.7K40
领券