自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WengJM的博客

绝知此事要躬行

  • 博客(132)
  • 收藏
  • 关注

原创 【软件测试】LoadRunner | 基本概念 | VUG录制脚本 | 脚本加强 | Controller设计测试场景 | Analysis产生测试报告

​ LoadRunner/ WebTours/ conf / httpd.conf 找到端口号为1080。Action:存放录制好的脚本:(编写代码)默认运行一次,也可以运行多次。vuser_end:程序退出时执行,运行时机是action运行完成之后执行。在Runtime Settings中 更改日志Log ,并且调整运行的次数。开始的事务和结束的事务之间的事务名称必须一致。​ 函数:lr_output_message。​ 函数:lr_log_message。​ 函数:web_reg_find。

2024-07-13 22:51:38 902

原创 【软件测试】性能测试 | 概念 | 常见术语 | 性能指标 | 分类 | 流程

​ 我们在日程的软件使用中,可能偶而会听到各种新闻,比如某某电商平台的无法正常购买、某某视频平台无法正常播放视频,或者某个软件突然无法打开了。也就是“崩了”。这些就是我们生活中能遇到的软件性能问题。测试人员借住性能测试工具,模拟系统在不同场景下,对应的性能指标是否达到预期。

2024-07-03 18:24:04 728

原创 【软件测试】Junit单元测试框架 | 注解 | 参数化 | 测试套件

Selenium3是自动化测试框架。运行几次,取决于csv有几行。Junit5是单元测试框架。会跑三次,每次拿一个数据。

2024-07-03 18:09:10 385

原创 【软件测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

Selenium是web应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言。由Selenium IDE, Webdriver,Selenium Grid组成。

2024-06-27 22:08:49 832

原创 【软件测试】测试分类 | 测试对象划分 | 是否查看代码划分 | 开发阶段划分 | 按照实施组织划分 | 是否运行划分 | 是否手工划分

开发文件:可行性研究报告、软件需求说明书、数据要求说明书、概要设计说明书、详细设计说明书、数据库设计说明书、模块开发卷宗。测试内容:模块之间的数据传输、模块之间的功能冲突、模块组装的正确性、全局数据结构、单模块缺陷对系统的影响。测试内容:模块接口测试、局部数据结构测试、路径测试、错误处理测试、边界测试。测试内容:界面、功能、可靠性、易用性、性能、兼容性、安全性、各类文档等。文件测试的关注点:文档的术语、文档的正确性、完整性、一致性、易用性。测试内容:界面、功能、可靠性、易用性、性能、兼容性、安全性等。

2024-06-27 22:05:15 547

原创 【软件测试】测试用例 | 根据需求设计 | 等价类 | 边界值 | 判定表 | 正交表 | 场景设计 | 错误猜测 | 面试题

朋友圈正文:只发送文字(最多多少字符、英文、中文、表情、文本连接)、只发送图片(图片大小、图片顺序、图片删除)、只发送视频(视频类型、大小、个数、是否发送成功)、文本+图片可以发送成功、文本+视频可以、图片+视频不行。性能:耐热性、耐寒性、腐蚀性、防摔性、抗压性、使用最长时间、使用最大次数。易用:过滤装置、拿着舒服、喝水方便、方便携带、使用方便、是否有吸管、防滑。对异常的处理、代码的规范 、语句覆盖、条件覆盖、语句条件覆盖、判定覆盖。界面:物体:外表、材质、大小,软件:界面、字体大小颜色、页面布局。

2024-05-30 19:25:20 995 1

原创 【软件测试】软件测试概念 | 测试用例 | BUG | 开发模型 | 测试模型 | 生命周期

软件测试就是找BUG,发现缺陷软件测试只是一个样本测试,具有不可穷尽性。软件测试就是验证软件产品特性是否满足用户的需求。在早期,更多的是将软件测试看做对软件产品的“检验” ,检查软件的每个功能是否正常运行正常验证软件功能执行的正确性,可以是否能正常工作。测试的活动是以测试人员“预期的结果(需求定义)”为依据,看是否符合需求测试:就是保障软件的质量用户需求:甲方提出来的需求,或者用户要完成的任务软件需求:功能需求,详细描述需要实现的软件功能软件需求是产品经理写的。

2024-05-30 19:20:12 1107 2

原创 【JVM】内存区域划分 | 类加载的过程 | 双亲委派机制 | 垃圾回收机制

栈里的局部变量,是跟随着栈帧的生命周期走的(方法执行结束,栈帧销毁,内存自然释放)。4.Extension ClassLoader,也不会立即扫描自己负责的目录(负责的是JDK中一些扩展的库,对应的目录),把查找的任务交给它的父亲(BootStrap ClassLoader)​ 代码中,会给定某个类的“全限定类名”(带有包名的,例如java.long.String/java.util.ArrayList)JVM就会根据这个类名,在一些指定的目录范围内,进行查找。反之,扫描后没有被标记的对象,就是“垃圾”。

2024-05-26 21:36:21 1073

原创 【Linux】常用基础命令 | 搭建云服务器优化环境 | 程序的部署

云服务器,一般都是Linux系统。日常用的安卓,本质上也是Linux。‘>’就是”重定向“ 把原本要打印在控制台的内容,写进test.txt。把程序放在云服务器上执行,访问的就是云服务器上的数据库,要确保数据库里有数据。rm命令相当危险,以至于/后多打一个空格,可能就会把所有东西删的一干二净。不同的发行商根据内核,搭配应用程序,就形成了不同的Linux发行版。Linux中,绝对路径以/开头。| 管道符,把前一个命令的输出,作为后一个命令的输入。3.修改.sh文件的可执行权限,让这些.sh都可执行。

2024-05-24 18:07:42 991

原创 【项目】教你手把手完成博客系统(三)显示用户信息 | 实现退出登录 | 实现发布博客

​ 在判定用户是否登录的逻辑中,要同时验证 会话存在 和 user这个Attributey也存在。只要破坏一个,就可以使登录状态发生改变。通过removeAttribute这样的方法,可以将user这个Attributey删除。通过点击,触发GET请求,服务器会把会话里的user这个Attribute进行删除。点击提交的时候,构造请求,把标题和正文都传输到服务器。在这几个页面的导航栏中,都有“注销”按钮。在博客列表页获取到是那个用户登录的。在博客详情页获取到是哪个用户书写的。这里采用form构造。

2024-05-24 16:40:26 1129

原创 【项目】教你手把手完成博客系统(二)获取博客列表 | 获取博客详情页 | 实现登录功能 | 强转登录

session是服务器内存中类似于Hash表的结构,如果服务器重启,hash表中原有的数据就没有了。​ 在博客详情页中,给服务器发送ajax请求,根据得到了blogId,查询数据库,得到博客的具体内容后返回给前端。2.使用令牌的方式(把用户信息在服务器加密,还是保存在浏览器这边)相当于服务器没有在内存中存储当前的用户身份。在博客列表页加载时,通过ajax给服务器发起请求,从服务器数据库拿到博客列表数据,并且显示到页面上。服务器处理登录请求,读取用户名和密码,并在数据库中查询,进行匹配。

2024-05-23 23:32:48 1141

原创 【项目】教你手把手完成博客系统(一) 实现思路 | 准备工作 | 封装操作 | 创建实体类

JDBC代码大同小异,因此会有一些数据库的框架来进一步的封装。在列表页左侧拿到的是当前登录用户的信息。在博客详情页,拿到的是文章作者的信息。创建两个类BlogDao和UserDao,来完成针对博客表和用户表的增删改查操作。2.博客详情页:点击列表的某个博客,就能进入对应的详情页,显示出博客的具体内容。每个表都需要一个专门的类来表示,表里的每一条数据,就会对应这个类中的一个对象。在博客编辑页,输入内容后,点击发布。点击博客详情的时候,可以从服务器拿到博客的完整数据。让页面从服务器(数据库)拿到博客的数据。

2024-05-23 23:26:14 735

原创 【LeetCode题解】双指针

5.因为dest后面直到cur之前的区间,都是0,换句话说,cur之间的非零已经交换到dest区间内了。3.[0,dest] 是非0,[dest+1,cur-1] 是0的区间,[cur,n-1]是待排区间。4.cur遇到0,向后移动。cur遇到非0数,和dest的下一个数进行交换,dest++,cur++2.dest:已处理的区间,非零元素的最后一个位置。时间复杂度 :o(n) 空间复杂度:o(1)1.因为成环后,可以用快慢指针来遍历这个环。2.当找到环的入口之后,判断这个入口是否为1。

2024-05-19 21:21:20 330

原创 【网络编程】Cookie和Session | 概念 | 核心方法 | 案例:实现用户登录

Cookie中保存的数据,也是键值对的格式(用户自定义的)最终还是要把这些键值对发送回服务器。​ 每个用户都有产生一份这样的数据,这些数据会被存储在服务器的数据库中。在服务器代码的逻辑展开执行的过程中,这些数据就会从数据库查询出来,先临时的保存在某个内存结构当中,后续如果有修改之类的操作。服务器会存储很多的Session,因此拿着cookie中的sessionId,就可以找到用户对应的Session。Session:是服务器临时存储数据的机制(不算持续化存储,持续化存储是数据库完成的)

2024-05-17 20:36:47 1060

原创 【MySQL】JDBC编程 | 概念 | JDBC的使用 | 引入驱动 | 代码编写 | 释放资源

​ JDBC : Java Database Connectivity (Java 数据库连接)是一组用于执行sql语句的Java API。是java中的数据库连接规范。)也称之为ORM框架,把数据库的表里的记录,映射到Java的对象。进行数据的操作时,直接修改对象的属性。executeQuery()返回的是 ResultSet(结果集合)。要想在程序中操作mysql,就需要先安装mysql的驱动包,把驱动包引入到项目中。​ DataSource 描述“数据源头” 也就是数据库服务器所在的位置。

2024-05-17 16:32:19 739

原创 【MySQL】MySQL的索引事务 | 索引的优缺点 | 使用 | 原理 | B+树 | 事务的特性 | 隔离级别

​ 虽然约定读的时候不能写,在读A文件的时候,不能写A文件。​ 数据库是按照行来组织数据的,创建索引的时候,是针对这一列进行创建。行中的数据的比较多的,相比之下id的数据比较少。同时,一次可以读取多个key,降低了硬盘读取文件的IO次数,进而降低了资源消耗。接下来事务A又修改了数据,导致B之前读到的数据变成了无效的数据。​ 在并发执行事务的过程中,事务A在内部多次读取同一个数据,出现不同的情况,就称为不可重复读。在实际开发中,查询的操作(读操作)的频率要远高于插入、删除、修改(写操作)的频率。

2024-05-16 14:28:34 1499

原创 【MySQL】 查询进阶 | 聚合查询 | 联合查询 | 聚合函数 | 笛卡尔积 | 内连接 | 外链接 | 自连接 | 子查询 | 合并查询

其中,有些数据可能是非法的(无意义的数据)。在进行多表查询的时候,就需要把有意义的数据筛选出来,过滤掉无意义的数据。筛序的条件叫做连接条件。有的时候,需要进行与行之间的比较。针对指定的列进行分组,把这一列中值相同的行,分到一组中,得到若干个组。筛选条件为: 学生表的id = 分数表的student_id。如果两个表中,里面的记录都是存在对应关系,内连接和外连接的结果就是一致的。把这一列的若干行,进行求和算数运算(只能针对数字类型使用 )如果存在不对于的记录,内连接和外连接就会出现差别。

2024-05-16 09:44:23 778

原创 【MySQL】表的增删改查 | CRUD | 新增 | 查询 | 修改 | 删除 | 数据库约束

从1开始,依次递增的分配主键的值。​ 有的时候,数据库中的数据,是有一定要求的。3.mysql的binlog功能,把mysql的各种操作,都通过日志记录下来,借住binlog,让另一个数据库按照binlog的内容执行(增量备份/实时备份)​ 这里的自动分配具有局限性,如果是单个的mysql服务器,是没有问题的。​ 客户端发送请求给服务器,查询出来之后,服务器把查询到的结果,在网络中通过响应返回给客户端,并在客户端上打印出来。​ 1.读取硬盘时,把硬盘的IO跑满了,此时程序的其他部分想访问硬盘,就会非常慢。

2024-05-15 16:34:12 813

原创 【MySQl】MySQL概述 | 数据库的操作 | MySQL的编码问题 | 连接器的工作流程

数据库是一个广义的概念1.表示一门学科2.表示一类管理数据的软件3.表示某个具体的数据库软件4.表示部署了某个数据库软件的主机​ 一个数据库服务器上,可以把很多有业务联系的表,放在一起,构成一个逻辑上的“数据集合”数据库,是管理数据的软件->增删改查(CRUD)Oracle 、MySQL 、SQLServer 、SQLite 是关系型数据库,使用“表”来组织数据redis 、MongoDB、HBase 是非关系型数据库,使用“文档”/"键值对"来组织数据。

2024-05-15 16:26:35 915

原创 【网络编程】Servlet的前后端练习 | 表白墙 | 前后端交互 | 提交消息 | 获取消息

1.页面加载时,网页要从服务器这里获取到当前表白的数据。(让网页端给服务器发起http请求,服务器返回响应里就带着这些数据)2.点击提交的时候,网页把用户输入的信息,发送到服务器这边,服务器负责保存服务器要给页面提供两个http的接口:​ 网页加载的时候,给服务器发起一个ajax请求1.客户端先发起一个ajax请求2.服务器收到这个请求,处理请求并进行响应3.客户端收到响应,针对响应数据进行解析处理,把响应的信息构造成页面元素(html片段),并显示出来2.提交消息:​ 用户点击提交的时候,aja

2024-05-12 23:51:28 463

原创 【前端】JavaScript的WebAPI | DOM | 获取元素 | 事件 | 操作元素 | 操作节点

value:input的值;innerHTML 不光能获取到页面的 html 结构, 同时也能修改结构. 并且获取到的内容保留的空格和换行。WebAPI包含了DOM(操作页面结构)+BOM(操作浏览器),由W3C组织规定。1)使用appendChild将节点插入到指定节点的最后一个孩子之后。(标签节点、注释节点、文本、属性节点等),使用node表示。元素:页面中所有标签都称为元素,使用element表示。event是全局变量,获取当前事件当中的所有属性和信息。一个页面的结构是一个树形结构,称为DOM树。

2024-05-11 13:13:51 1023

原创 【网络编程】Servlet的API | HttpServlet | HttpServletRequest | jackson | HttpServletResponse

这个类对象就相当于一个类的图纸,后续要构造这个类的实例,都是基于类对象来进行的。​ Tomcat通过反射,在代码中new一个我们自己写的子类对象,这个子类对象在执行doGet的时候,会执行重写的doGet代码。​ 如果不重写service,在父类(HttpServlet)中,自己的service就会根据请求的方法,来分别调用doGet、doPost、doPut…2.把获取到的流对象,直接传给readValue,内部就会进行读取,按照json的格式解析成Map(键值对),{ ok:true }

2024-05-11 13:09:03 1059

原创 【网络编程】Servlet | Maven | 创建程序的七个步骤 | 部署方式 | 访问出错

resp.getWriter() 会获取到一个流对象, 通过这个流对象写入的数据会被 构造成一个 HTTP 响应的 body 部分, Tomcat 会把整个响应转成字符串, 通过 socket 写回给浏览器.Maven可以帮助我们管理好依赖关系,同时Maven的打包功能也非常强大,方便集成到自动化环境中。写代码的初心,是能够高效率的解决实际问题。以在HTTP响应报文中,要显示的告诉浏览器,返回的body的字符集是什么。当tomcat收到一个GET请求的时候,就有可能执行到这个子类的方法中。

2024-05-09 16:12:30 1371

原创 【网络编程】Tomcat | 目录结构 | HTTP服务器

使用HTTP进行通信,涉及到HTTP客户端(浏览器、Postman、爬虫等待)和HTTP服务器。bin:放置的是tomca的一些相关可执行脚本(startup.bat、startup.sh…8080是Tomcat的端口号。tomcat的配置主要是通过xml的方式来提供。webapps中,每个目录都是一个webapp(包含了一个网站的后端代码和前端代码)一个程序的功能可能是非常丰富的,需要按需开启某些功能,通过配置文件进行修改。动态页面:根据用户输入的不同内容,产生不同的结果。静态页面:页面的内容是固定的。

2024-05-09 16:08:08 324

原创 【网络原理】HTTPS | 对称加密 | 非对称加密 | 中间人攻击 | 证书 | 公钥 | 私钥

公证机构通过审核,会向服务器颁发一个“证书”(包含域名、公钥、证书的过期时间、以及数字签名等)颁发证书的时候,公共机构就会针对证书中的各个属性,计算出校验和,并针对这个校验和用公证机构自己的私钥进行非对称加密,得到数字签名。就需要每个客户端在和服务器建立连接的时候,就把秘钥生成出来(涉及到随机数机制,确保密钥都不相同)客户端再把自己的密钥传输给服务器。​ 非对称加密中,有一对秘钥(公钥和私钥)可以使用公钥加密,私钥解密。通过引入第三方的“公证机构”,由“公证机构”证明的公钥,就是可以信任的公钥。

2024-05-08 10:24:31 1034

原创 【网络原理】HTTP协议 | 报文格式 | Fiddler抓包 | HTTP请求 | HTTP响应 | 构造HTTP请求

Cookie按照键值对和形式进行组织(键值对是由程序员自定义的和query string类似)后续再请求这个服务器的时候,就会把Cookie中的内容自动代入到请求中,再发给服务器。(这个资源可能是硬盘的数据、内存的数据、通过网络访问其他服务器拿到的数据、通过CPU计算出来的一些数据)这个目录结构怎么写,和后续服务器代码的编写程序密切相关。​ HTTP的响应也是文本格式的,这里的二进制乱码是因为被压缩了。​ 后续给服务器提交的请求,不同的Content-Type,服务器处理的逻辑的不同的。

2024-05-08 09:48:57 1014

原创 【网络原理】以太网协议 | 以太网数据帧格式 | DNS域名解析系统

由于MAC地址比IP地址能表示的范围大,所以目前MAC地址足够用,且每个设备都有唯一的MAC地址。IP数据报的分包拆包,大概率是因为MTU引起的,而不是触发64KB上限。​ 使用IP地址,来描述设备在网络上的位置。​ 最早的域名解析系统,是通过一个简单的文件来实现的 :hosts文件。​ 具体的转发:交换机内部也有一个数据结构叫“转发表”,类似于哈希的映射,不一定是软件实现的,可能是硬件实现的。​ 源MAC和目的MAC会根据转发的过程,每到达一个节点,向下一个节点走时,源MAC和目的MAC都会改变。

2024-04-30 13:43:33 851 1

原创 【网络原理】网络层IP协议 | IP报文格式 | IP地址 | 地址管理 | 路由选择

TTL的单位是次数。​ 内网IP无法在广域网上使用,在经过运营商路由器时(也是一个NAT设备),就会对数据包报头的源IP地址进行替换,转换成外网IP。​ IP数据报转发的时候,每个路由器都是无法知道网络的“全貌”的,只知道一些局部信息(一个路由器能够知道哪些设备和它是相连的)。​ 之前提到,UDP天然支持广播,使用UDP socket给这个地址发送UDP数据报,此时局域网内所有的设备,都能收到这个设备。如果一个IP地址,主机号全0,当前这个IP就表示“网络号”,代表当前的局域网,不能划分给主机。

2024-04-30 13:40:59 1749 1

原创 【网络原理】TCP协议 | TCP的报文格式 | 三次握手 | 四次挥手 | 可靠传输 | 确认应答 | 超时重传 | 滑动窗口 | 流量控制 | 拥塞控制 | 延时应答 | 捎带应答 | 粘包问题

上述重传中,没有额外的操作,哪个数据丢了,就重传哪个(快速重传),是滑动窗口下,超时重传的变种。让A先按照比较慢的速度发送数据(小的窗口),如果数据传输过程非常顺利,没有丢包,再一步步尝试使用更大的窗口,更高的速度进行发送。​ 假设当前的接收方缓冲区的大小是4000,拿到1000的数据后,通过ACK报文,把剩余的3000大小,返回给发送方。​ 此时,暂停发送数据后,A虽然不传输业务数据了,仍然会周期性的发送一个“窗口探测包”,并不携带业务数据,只是为了触发ACK,从而查询接收方的接收缓冲区剩余空间。

2024-04-29 10:56:43 1123 2

原创 【网络原理】UDP协议 | UDP报文格式 | 校验和 | UDP的特点 | 应用层的自定义格式

​ 应用层和程序员接触最密切,在应用层中,很多时候都是程序员“自定义”应用层协议的。而协议就是一种约定,程序员在代码中规定好,数据如何进行传输自定义协议:1.根据需求,明确要传输的信息。2.约定好信息按照什么格式来组织。

2024-04-29 10:40:04 2666

原创 【网络编程】TCP流套接字编程 | Socket类 | ServerSocket类 | 文件资源泄露 | TCP回显服务器 | 网络编程

如果客户端和服务器建立连接,服务器的应用程序不需要任何操作,系统内核直接完成了连接建立的流程(三次握手),完成流程后,就会在内核的队列中排队(每个ServerSocket都会有这个队列)。此时第二个客户端也过来建立连接,连接建立成功后,连接对象就会在内核的队列里面,等待accept把连接取出来,在代码中处理。​ 让两个循环能够“并发”执行,各执行各的,不会因为进入循环而影响另一个循环。​ 但是clientSocket,每个循环中,每有一个新的客户端来建立连接,都会创建出新的clientSocket。

2024-04-26 19:13:00 1585

原创 【网络编程】网络编程概念 | TCP和UDP的区别 | UDP数据报套接字编程 | Socket

通过网络,让两个主机之间能够进行通信。基于通信来完成一定的功能。​ 进行网络编程的时候,需要操作系统提供一组API,通过这些API来完成。这些API可以认为的应用层和传输层之间交互的路径。这些API称为Socket API。通过一套Socket API 可以完成不同主机、不同系统之间的网络通信。​ 传输层提供的网络协议主要有两个:TCP、UDP。这两个协议的特性差异很大,会导致使用这两种协议进行网络编程,会存在一定的差别。系统就分别提供了两套API。

2024-04-25 21:37:31 1478 1

原创 【网络原理】网络传输的基本流程 | 网络通信 | 协议分层 | 网络模型 | TCP/IP五层网络模型 | OSI七层网络模型 | IP | 端口号 | 本机环回

(上层协议调用下层协议,下层协议给上层协议提供支持)此时即使协议比较多,也可以完成相关工作。​ 上述描述的规则,就是此处我们约定的应用层协议。应用层协议中,具体用几个字段,字段的顺序,什么分隔符都可以由程序员根据具体的场景和具体的需求来自主决定。​ QQ应用程序,把用户A输入的“nb woc”,打包成一个应用层的数据报(这个数据报的格式,只有qq的程序员知道)​ 通过路由器,将多个局域网连接起来,在物理上组成很大范围的网络,就形成了广域网。​ 通过IP协议,对网络层数据报进行解析,去掉报头,拿到载荷。

2024-04-25 21:33:29 1214

原创 【文件IO】 文件系统的操作 | 文件类型 | File的构造和方法 | 字节流 | 字符流 | InputStream | OutStream

文件描述符表是一个顺序表的结构,一个进程每打开一个文件,就需要在这个表里分配一个元素,但是整个顺序表的大小是有上限的。大部分情况下,谈到的文件,都是指硬盘的文件。如果真的读到了字符,会返回0~65535(无符号 char能表示的范围),如果到达了流的末尾,就会返回-1,表示文件读完了。字符流可以自动的把文件中相邻的字节,转换成一个字符。2.一次会读取若干个字符,会把参数指定的cbuf数组填充满,填不满也没关系,读的是所有的数据。1.文本文件:文件中保存的数据都是字符串,保存的内容都是合法的字符。

2024-04-24 19:06:52 955

原创 【多线程】JUC的常见类 | Callable接口 | ReentranLock | 线程安全的集合类

​ 发现需要扩容的线程, 只需要创建一个新的数组, 同时只搬几个元素过去. 扩容期间, 新老数组同时存在. 后续每个来操作 ConcurrentHashMap 的线程, 都会参与搬家的过程. 每个操作负责搬运一小部分元素. 搬完最后一个元素再把老数组删掉. 这个期间, 插入只往新数组加. 这个期间, 查找需要同时查新数组和老数组。可以通过配置文件来描述配置的详细内容(文件本身不是很大),配置的内容就会被读到内存中,再由其他的线程,来读取这里的内容。只有在操作同一个链表上的内容时,才会发生线程安全问题。

2024-04-22 23:23:34 875 3

原创 【多线程】synchronized原理 | 锁升级| 锁消除 | 锁粗化 | 信号量 | CountDownLatch

在实际使用的过程中,如果发现锁冲突的情况比较多,synchronized就会升级成悲观锁(也就是重量级锁,基于挂起等待的方式实现)。当锁冲突出现的时候,偏向锁就会升级成轻量级锁,进行真正的加锁操作。​ 迪杰斯特拉提出的信号量,同时,他也是一位荷兰数学家,在数据结构的图中,要想获取两点之间的最短路径,就可以用迪杰斯特拉算法。线程池,优化的是创建新线程的效率(优化”找下一任“的效率),提前就创建好,直接拿来用,无缝衔接。偏向锁 的核心思想,就是“懒汉模式” 的一种体现,能不加锁就不加锁,因为加锁就意味着开销。

2024-04-22 23:18:47 896

原创 【多线程】CAS的应用 | CAS的概念 | 实现原子类 | 实现自旋锁 | ABA问题

Compare and swap 比较并交换。比较交换的是 内存 和 寄存器比如此时有一个内存 : M。还有两个寄存器A,B​ CAS ( M , A , B ) :如果M和A的值相同的话,就把M和B的值进行交换(交换的目的是为了把B赋值给M,M = B),同时整个操作返回 true。如果M和A的值不同的话,无事发生,同时整个操作返回false。//伪代码:CAS其实是一个CPU指令,一个CPU指令,就可以完成上述比较交换的逻辑。单个的CPU指令是原子的。

2024-04-21 22:00:53 936

原创 【多线程】常见的锁策略 | 乐观锁 | 轻量级锁 | 重量级锁 | 自旋锁 | 挂起等待锁 | 读写锁 | 可重入锁 | 公平锁

可重入锁,锁里面保存了当前是哪个线程加上的锁,同时维护了一个计数器,所以第二次加锁的时候,不会触发阻塞等待,而是自增计数器。要借助系统api来实现,一旦出现锁竞争,就会在内核中触发一系列动作(比如让这个线程进入阻塞状态,暂时不参与CPU的调度。​ 当很多线程去尝试加一把锁的时候,一个线程拿到锁,其他线程就会阻塞等待。​ 轻量级锁是指,锁的开销比较小,消耗的资源少。乐观锁通常是轻量级锁,可能存在特例,不绝对。是“锁的一种特性”,是一类锁,而不是具体的锁。​ 重量级锁是指,锁的开销比较大,消耗的资源多。

2024-04-21 21:57:17 684

原创 【多线程】定时器 | 线程池 | 实现MyTimer | 实现MyThreadPoll | 工厂模式 | 构造方法 | 参数种类

​ 假设一个线程的所有代码都是CPU密集型代码,线程池中的线程数量不应该超过N(CPU核心数),设置的比N大,cpu吃满了,无法提高效率,此时添加更多的线程反而增加调度的开销。换句话说,timer当中的任务,是有当中的扫描线程来执行的。所以在第一次判断时间时,在else中,当任务时间还没到的时候,进行wait阻塞,此时线程不会在CPU上调度,避免了忙等。​ 假设一个线程的所有代码都是IO密集型的,这个时候不吃CPU,此时设置的线程数,就可以超过N.一个核心可以通过调度的方式,来并发执行。

2024-04-18 21:13:54 1584

原创 【LeetCode每日一题】924. 尽量减少恶意软件的传播(并查集)

【代码】【LeetCode每日一题】924. 尽量减少恶意软件的传播(并查集)

2024-04-16 21:31:46 472

SSM框架练习题(选择+填空+编程题)

SSM框架练习题(选择+填空+编程题)

2023-11-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除