HashMap evict 放逐之旅

article/2025/8/16 20:11:55

HashMap evict 放逐之旅

  • 我不认识的evict
  • 小结

我不认识的evict

正在撸猫写代码的我,遇到了一个LinkedHashMap ConcurrentModifyException,真是让人头秃。问题排查过程也是费了一些力气(手动狗头),最后发现是我异步请求接口时,同步修改了同一个map,所以主流程代码在读这个map的时候,会偶发性的出现ConcurrentModifyException(如果有人感兴趣排查过程,评论区留言,后续更贴)。
就在我在解决这个问题的时候,就遇到了Map深复制这个情况,我需要copy一份map用于异步请求的时候用。智能的Intellij 告诉我,我可以在初始化的时候传入map,我一直很相信我的得力助手,所以就这样一顿操作,调试运行没有问题,晚上又可以早点下班了。
但深复制这个情况,我还是需要从源码的角度确认一下,就看了LinkedHashMap初始化的代码

public LinkedHashMap(Map<? extends K, ? extends V> m) {super();accessOrder = false;putMapEntries(m, false);}

各位看官这个m肯定没有问题,但是这第二个参数传了一个false,给的注释是

evict false when initially constructing this map, else true (relayed to method afterNodeInsertion).

机智的我查了一下这个单词的意思
evict单词解释
evict这个变量当在map初始化的时候是false,其他情况为true,传递给afterNodeInsection方法。

void afterNodeInsertion(boolean evict) { // possibly remove eldestLinkedHashMap.Entry<K,V> first;if (evict && (first = head) != null && removeEldestEntry(first)) {K key = first.key;removeNode(hash(key), key, null, false, true);}}protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {return false;
}

然后这removeEldestEntry给了一大串注释,我就总结一下:我提供了方式给你重写在添加一个新元素之后删除map中最老的元素。然后作者说了一句话

this is useful if the map represents a cache: it allows the map to reduce memory consumption by deleting stale entries.

对于这个Cache,我搜索了一下,发现LinkedHashMap 可以作为LRU算法实现的数据结构。

LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问到的数据淘汰

关于LRU算法,看官们可以自行学习了解。

小结

最后总结一下,evict这个变量当在map构造器传入指定map初始化的时候是false,其他情况为true,也即其他构造器创建map之后再调用put方法,该参数则为true。


http://chatgpt.dhexx.cn/article/MyqKvBOK.shtml

相关文章

Redis源码剖析之内存淘汰策略(Evict)

文章目录 何为Evict如何EvictRedis中的Evict策略源码剖析LRU具体实现LFU具体实现LFU计数器增长LFU计数器衰减 evict执行过程evict何时执行evict.c 总结 Redis作为一个成熟的数据存储中间件&#xff0c;它提供了完善的数据管理功能&#xff0c;比如之前我们提到过的 数据过期和…

WiredTiger系列2:Eviction详解

Eviction Evict的实质主要是将内存中的page淘汰出内存&#xff0c;简单来说&#xff0c;当cache里面的“脏页”达到一定比例或cache使用量达到一定比例时&#xff0c;wt就会触发相应的evict page线程来将pages&#xff08;包含干净的pages和脏pages&#xff09;按一定的算法&a…

onload事件

onload事件&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script type"text/javascript">//onload事件的方法function onloadFun(){alert(静态注…

onUnload事件

1. 首先JavaScript会使我们有能力创建动态页面然后JavaScript是可以被侦测到事件行为的然而在网页中的每一个元素都将可以来产生某些可以触发JavaScript的函数的事件就可以打个比方说我们在用户中里面点击某个按钮时的产生的某一个onClick 事件来触发某个函数之后就在事件中在H…

script标签的onload事件的触发时机

onload事件在资源被加载完成后会被触发。对于script标签&#xff0c;在外部js文件被加载后代码会被立即执行。那么&#xff0c;外部js文件中的代码和该script标签的onload回调函数&#xff0c;它们的执行顺序是怎样的呢&#xff1f;没有找到官方的说明文档&#xff0c;所以自己…

load事件

javaScript中最常用到的一个事件就是load。当页面完全加载后&#xff08;包括所有图像、javaScript文件、css文件等外部资源&#xff09;&#xff0c;就会触发window上边的load事件。 window&#xff1a; window.addEventListener(load, function(e) {console.log(页面完全加…

onload 和 onunload 事件

onload 和 onunload 事件会在用户进入或离开页面时被触发。onload 事件可用于检测访问者的浏览器类型和浏览器版本&#xff0c;并基于这些信息来加载网页的正确版本。onload 和 onunload 事件可用于处理 cookie。 onmousedown,onmouseup 以及 onclick 构成了鼠标点击事件的所有…

window的onload事件的用法

1.最简单的用法 注&#xff1a;奇葩&#xff0c;我没用过 2.在JS语句调用&#xff08;正确使用姿势&#xff09; 或使用jquery onload 事件会在页面或图像加载完成后立即发生。 3.window.onload()的加载问题 由于HTML加载时由上往下的&#xff0c;在HTML加载的时候&#…

JS中window.onload事件详解

window.onload出现的原因&#xff1f;  我们都知道页面的代码顺序是从上往下进行加载&#xff0c;很多时候我们要对页面中的某一个模块进行操作&#xff0c;这时候我们常常使用javascript代码来进行操作。为了能够保证操作的模块或对象在js代码之前就加载了&#xff0c;我们不…

浏览器的onload事件

如下代码&#xff0c;因为代码从上到下执行&#xff0c;btn节点还未创建好就去获取会报错 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge&q…

JavaScript的window.onload事件的理解

window.onload()的作用 window.onload() 方法用于在网页加载完毕后立刻执行的操作&#xff0c;即当 HTML 文档加载完毕后&#xff0c;立刻执行某个方法。window.onload() 通常用于 元素&#xff0c;在页面完全载入后(包括图片、css文件等等)执行脚本代码。 只有一个要执行的函…

I2C协议——I2C框图和I2C通信过程

1.软件模拟和硬件模拟的概念 所谓软件模拟&#xff0c;即直接使用 CPU 内核按照 I2C 协议的要求控制 GPIO 输出高低电平。如控制产生 I2C 的起始信号时&#xff0c;先控制作为 SCL 线的 GPIO 引脚输出高电平&#xff0c;然后控制作为 SDA 线的 GPIO 引脚在此期间完成由高电平至…

通信协议——I2C协议/IIC协议解析

目录 I2C协议概述 I2C通信原理 I2C通信时序 I2C协议概述 同步通信 半双工&#xff08;分时&#xff09; 串行传输 电平信号 特点&#xff1a;①有两根传输线&#xff08;时钟线SCL、双向数据线SDA&#xff09; ②主从模式&#xff1a;通信双方为主设备&#xff08;Master&…

I2C基础

I2C基础 1 基本介绍2 特点3 硬件连接4 通信4.1 控制器4.2 协议 5 SPI VS I2C 1 基本介绍 IC (Inter-Integrated Circuit)。内部集成电路。拥有两根线&#xff0c;一根数据线SDA和一根时钟线SCL。 这两条线都是漏极开路或者集电极开路结构&#xff0c;使用时需要外加上拉电阻&a…

I2C总线协议

1. 简介 I2C (Inter-Integrated Circuit&#xff09;&#xff0c;是一种串行通信总线&#xff0c;用于连接微控制器及其外围设备&#xff0c;实现主控制器和从器件间的主从双向通信&#xff0c;是一种同步半双工通信(两端时钟频率一致&#xff0c;双向通信&#xff0c;但不能同…

I2C协议最细致的讲解

I2C通讯协议(Inter—lntegrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 I2C物理层的特…

沧小海详解面试的必答题——I2C协议

目录 第一部分&#xff1a;I2C协议的概述 第二部分&#xff1a;I2C协议的阐述 第三部分&#xff1a;AT24C04简述 第四部分&#xff1a;基于verilog的程序设计&#xff08;暂无&#xff09; 对于大多从事FPGA行业的应届生来说&#xff0c;在面试过程中很可能会被问到关于I2C…

51单片机模拟I2C协议

什么是I2C 首先需要知道什么是I2C协议。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息&#xff08;摘自百度百科&#xff09;。I2C主要有两条线&#xff0c;一条SDA数据线&#xff0c;一条SCL时钟线。由…

I2C协议原理讲解

一、物理层&#xff1a; 1、I2C通讯设备之间的常用连接方式&#xff1a; 2、特点&#xff1a; (1) 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中&#xff0c; 可连接多个I2C通讯设备&#xff0c;支持多个通讯主机及多个通讯从机。 (2) 一个…

一文搞懂I2C协议-硬件基础

I2C是什么 I2C总线是由飞利浦在80年代初设计的&#xff0c;以允许位于同一电路板上的组件之间能够轻松通信。其大大简化了电路的设计&#xff0c;早期的电视机中很多地方用到了I2C这种通信方式。飞利浦半导体于2006年迁移到了NXP。I2C名称翻译为“ Inter IC”。有时&#xff0…