自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 【MyBatis】(动态SQL <if> 标签 <trim>标签 <where>标签<set>标签<foreach>标签<include>标签)

在MyBatis中,我们可以使用特定的标签来实现这些功能,如< if >用于条件判断,< choose >、< when >和< otherwise >用于多条件选择,< trim >、< where >和< set >用于处理SQL语句的前缀和后缀,以及< foreach >用于迭代处理。它允许我们根据不同的条件动态的组装SQL语句,能够灵活的发挥SQL强大的功能,方便解决一些其他方法难以解决或解决方法繁琐的问题。在xml映射文件中配置的SQL,有时可能会存在很多重复的片段,此时就会存在很多冗余的代码。

2024-04-27 12:31:17 977

原创 【MyBatis】(MyBatis 其他查询操作 多表查询 #{} 和 ${} 排序功能 like 查询 #{} 和 ${} 的区别 数据库连接池)

在这个例子中,虽然拼接看起来是连续的,但在实际编程中,可能需要确保字符串连接后没有多余的空格或缺少必要的空格。: 每次执行SQL语句, 要先创建⼀个新的连接对象, 然后执⾏SQL语句, SQL语句执行完, 再关闭连接对象释放资源. 这种重复的创建连接, 销毁连接比较消耗资源。预编译SQL,编译⼀次之后会将编译后的SQL语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译(只是输⼊的参数不同), 省去了解析优化等过程, 以此来提高效率。中的内容是直接拼接到SQL语句中的,不会经过MyBatis的预编译处理。

2024-04-21 17:12:19 803

原创 【MyBatis】(什么是MyBatis MyBatis的写法 单元测试 使用MyBatis可能会遇到的问题 MyBatis基础操作 打印日志 参数传递 增删改查 XML 常见问题)

MyBatis是一种优秀的持久层框架,用于简化JDBC的开发持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的。

2024-04-20 19:17:20 735

原创 【SpringBoot配置文件 日志】(配置文件 配置文件的格式 properties 获取配置项 yml 获取配置项 单双引号区别 配置对象 配置集合 Spring日志 观察日志 使用 日志框架 )

总的来说,门面模式是一种非常有用的设计模式,它通过提供一个简单的统一接口来封装复杂的子系统,从而简化了客户端的使用,提高了系统的可维护性和安全性。SLF4J 就是其他⽇志框架的⻔⾯. SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 并不涉及到具体的⽇志逻辑实现。门面模式(外观模式),提供了一个统一的接口,用来访问子系统的一群接口,主要特征是定义了一个高层接口,让子系统更容易使用。数据保存在数据库中,是一种持久化的方式,日志保存在文件中,也是一种持久化的方式。现在我们想一键开关灯,是不是就很方便了。

2024-04-18 18:42:12 582

原创 【Spring IoC&DI】(Ioc详解 方法注解@Bean使用@Bean传递参数 扫描路径 DI详解 属性注入 构造方法注入 Setter注入 三种注入优缺点分析@Autowired存在问题)

Spring通过扫描项目来确定是否加注解, 但是把整个项目去扫描是不合理的,如果我们需要Spring帮我们做一些事情的时候,给他个提醒,然后让他去做,这样不就更高效吗?我们告诉Spring,BeanConfig这个类里面有需要它帮我们管理的对象,告诉的方式就是通过五大类注解,加了只后,Spring才会去扫描下面的方法。五大注解只能加在类上,并且只能加在自己的代码上,如果引入了一个第三方Jar包,也希望交给Spring管理,是没有办法加五大类注解的,此时我们可以使用。SpringBoot特点:约定大于配置。

2024-04-11 00:07:45 909

原创 【Spring IoC&DI】(Spring 容器Ioc Bean的存储@Controller@Service@Repository@Component @Configuration 类注解存在原因)

很明显可以发现:他们是继承关系,所以BeanFactory具有的功能ApplicationContext 都有,另一些功能就是别的类所赋予的了。观察运⾏结果, 发现成功从Spring中获取到Controller对象, 并执⾏Controller的doController⽅法。把对象交给IoC容器管理需要在类上加一个注解:@Component,Spring为了更好的服务Web开发,还提供了其他的注解。:环境相关,ApplicationContext 可以拿到环境相关的一些配置比如:jdk几。

2024-04-10 00:04:42 528

原创 【哈希表专题】(1. 两数之和 面试题 01.02. 判定是否互为字符重排 217. 存在重复元素 219. 存在重复元素 II 49. 字母异位词分组)

哈希表是什么:存储数据的容器作用:快速查找某个元素。O(1)当我们需要频繁的查找某一个数的时候,可以使用哈希表。如何用哈希表:题目链接: leetcode1. 两数之和解法一:暴力解法代码:该方法接收两个参数:一个整数数组和一个整数。方法的目的是在数组中找到两个数,使它们的和等于target,并返回这两个数的索引。解析:解法二:哈希表该方法接收两个参数:一个整数数组和一个整数。方法的目的是在数组中找到两个数,使它们的和等于,并返回这两个数的索引。首先,创建一个(名为)来存储数组中的元素及其对应的索引。

2024-04-04 20:03:34 618

原创 【Spring Web MVC】(MVC 响应 返回静态页面 返回数据@ResponseBody 返回HTML代码片段 返回JSON 设置状态码 设置Header)

Spring MVC会根据我们方法的返回结果自动设置响应状态码,程序员也可以手动指定状态码,通过Spring MVC的内置对象HttpServletResponse提供的方法来进行设置。@Controller返回视图,随着前后端分离,后端不处理数据,就返回页面所需要的数据。可以修饰类,也可以修饰方法,修饰类的时候表示这个类下的所有方法,返回的均为数据,修饰方法时,表示该方法返回的数据。如果一个类中所有方法返回的都是数据,我们就把这个注解加在类上。需求: ⽤⼾输⼊账号和密码, 后端进⾏校验密码是否正确。

2024-04-04 12:35:35 1159

原创 【Spring Web MVC】(MVC请求 传递JSON 获取URL中参数@PathVariable上传文件@RequestPart获取Cookie/Session获取Session Header)

在2024年3月31日的晚上7点25分16秒,一个名为“nio-8080-exec-2”的线程或会话遇到了一个关于缺少会话属性的警告。JSON是⼀种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个⼦集,采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。简单来说:JSON就是⼀种数据格式, 有⾃⼰的格式和语法, 使⽤⽂本表⽰⼀个对象或数组的信息, 因此。Http是无状态的,http没有记忆功能,现在请求和过一会请求,同样的请求参数,得到的结果是一样的。

2024-03-31 19:44:18 740

原创 【链表专题】(2. 两数相加 23. 合并 K 个升序链表 25. K 个一组翻转链表)

在这段代码中,"把不需要逆序的连接上"的步骤没有使用循环的原因是因为在之前的步骤中已经完成了所有需要逆序的分组操作。具体来说,由于我们已经按照每k个节点为一组进行了逆序排列,当我们执行到最后一组的时候,这组后面的节点都是不需要再逆序的。在循环中,首先从堆中取出一个元素(即链表的一个节点),然后将prev的下一个节点设置为这个取出的元素。将不需要逆序的部分连接到已逆序的链表后面。所以,这里的设计是先通过循环处理所有需要特殊处理的节点,然后通过一次简单的赋值操作完成剩余节点的连接,从而避免了不必要的循环。

2024-03-31 16:19:10 891

原创 【面经3】( 测试和开发区别 CPU占用高排查问题 缓存穿透、缓存击穿和缓存雪崩解决方法 编写测试用例 理解 JVM 虚拟机 软实力 慢查询的原因 Java 的注解 线上问题,该如何处理)

缓存击穿:指当一个缓存键(key)对应的数据在缓存中不存在,同时又有大量并发请求访问该缓存键时,这些请求会直接绕过缓存,查询数据库或其他存储系统,导致数据库压力增大。缓存击穿通常在缓存过期后发生。缓存穿透:指当一个查询请求访问一个不存在于缓存中且也不存在于数据库中的数据时,这个请求会无效地继续访问数据库,而不会被缓存。如果黑客故意发送大量非法请求,则缓存层无法起到过滤作用,可能导致数据库负载过大。

2024-03-27 22:50:38 951 1

原创 【Spring Web MVC】(什么是 Spring Web MVC? MVC 建立连接(客户端和服务器) 请求 传递单个参数 传递多个参数 传递对象 传递数组 传递集合)

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”

2024-03-27 22:34:03 947

原创 【软件测试】(测试的执行和BUG管理 发现BUG 产生争执 测试用例设计方法 等价类 边界值 模拟弱网 接口测试 水杯测试 发朋友圈测试 冒泡排序 zip命令测试 测试用例设计公式 黑盒 白盒 灰盒)

依据需求将输入(特殊情况下会考虑输出)划分为若干个等价类,从等价类中选出一个测试用例,如果这个测试用例测试通过,则认为所代表的等价类测试通过,这样就可以用较少的测试用例达到尽量多的功能覆盖,解决了不能穷举测试的问题。所以,黑盒测试又称之为数据驱动测试,只注重软件的功能。3、BUG定级要有理有据,BUG定级时,不仅要参考BUG级别,还要考虑BUG是否会影响到流程,往往用户的BUG级别和我们的是有区别的,需站在用户的角度定考虑定位级别。黑盒测试用到的测试方法有,等价类,边界值,因果图,场景法,错误猜测法等。

2024-03-24 23:42:37 926

原创 【软件测试】(软件测试和软件开发 软件测试和软件调试之间的区别 需求 测试用例 BUG 软件生命周期 瀑布模型 螺旋模型 增量、迭代 敏捷 V模型 W模型 描述bug bug级别 bug的生命周期)

软件测试就是找bug,发现缺陷,软件测试就是验收软件产品特性是否满足用户的需求。测试试图验证软件是“工作的”,也就是验证软件功能执行的正确性。测试的活动是以测试人员“预期的结果”为依据,这里的“预期结果”指的是需求定义。用户需求:可以简单理解为甲方提出的需求,如果没有甲方,那么就是终端用户使用产品时必须完成的任务。该需求一般比较简略。软件需求:或者叫功能需求,该需求会详细描述开发人员必须实现的软件功能。

2024-03-24 21:19:33 742

原创 【面经2】(selenium的元素定位 selenium处理多窗口 处理弹窗 二分查找 链表是否有环 手写sql URL解析过程 DNS协议解析顺序 登录注册页面的测试用例 查询pid命令)

我们有非常多的方案来选择划分点,但其实我们还是要选择中间的那个点来划分,这就涉及到我们概率学中的问题:求数学期望.在上面众多方案中,我们选择中间的那个点来划分时间复杂度是最好的.总之,在整个过程中,还涉及到一些其他的细节,比如HTTP重定向、缓存策略、异步加载等,这些都是为了提高网页加载效率和用户体验。需要注意的是,无法使用常规的元素定位方式来直接定位弹窗中的元素,必须通过切换到弹窗的操作来处理它们。这些定位方法在不同的测试场景和页面结构中各有优势,选择合适的方法可以提高测试的效率和准确性。

2024-03-20 23:54:42 851

原创 【二分查找专题】(二分查找算法简介 特点 学习侧重点 704. 二分查找 题目解析 算法原理 编写代码 朴素二分模版 34. 在排序数组中查找元素的第一个和最后一个位置 题目解析 算法原理 编写代码)

细节多,最容易写出死循环的算法题目链接:leetcode34. 在排序数组中查找元素的第一个和最后一个位置。

2024-03-20 14:48:08 299

原创 【Map和Set】(二叉搜索树 查找操作 插入操作 删除操作 Map的使用 Map.Entry<K, V> Set的说明)

可以在右树里找到最小值,放到要删除的节点,问题就转化成删除右树的最左边的最小值.此时这种情况的删除就变成了上面两种删除的情况.Map.Entry 是Map内部实现的用来存放键值对映射关系的内部类,该内部类中主要提供了。Map是一个接口类,该类没有继承自Collection,该类中存储的是结构的键值对,并且K一定是唯一的,不。3. cur不是root,cur是parent.right,则parent.right = cur.right。左数找最大,右树找最小。

2024-03-18 23:51:41 821

原创 【JVM】(内存区域划分 为什么要划分 具体如何分 类加载机制 类加载基本流程 双亲委派模型 类加载器 垃圾回收机制(GC))

JVM启动的时候会申请到一整个很大的内存区域,JVM是一个应用程序,要从操作系统这里申请内存,JVM就需要根据,把空间,分成几个部分,每个部分各自有不同的功能作用.java代码会被编译成.class文件(包含一些字节码),java程序要想运行起来,就需要让jvm读取到这些.class文件,并且把里面的内容,构造成类对象,保存到内存的方法区中。所谓的执行代码就是调用方法。书上和官方文档把类加载过程分成了5个步骤。属于类加载中,第一个步骤“加载”过程中国,其中的一个环节。负责根据全限定类名找到.class文

2024-03-17 16:37:58 993 1

原创 【面经1】(多表联合查询 内连接、外连接 求最大函数 列表元组区别 判断两个对象相等 PO模式 测试的流程 怎么进行测试用例设计 测试用例设计京东登录界面 将两个有序数组或链表合并为一个,不改变顺)

内连接也称为等值连接,只返回两个表中键值匹配的行,即只有在两个表中都有匹配的数据时才会返回。PO模式是自动化测试项目开发实践的最佳设计模式之一。它的主要用途是把一个具体的页面转换成编程语言当中的一个对象,页面特性转化成对象属性,页面操作转换成对象方法。在自动化测试当中,主要用来实现对页面操作和测试。PO模式的核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性、可读性。代码可读性高,减少冗余代码;

2024-03-17 13:50:56 943

原创 【滑动窗口专题】LeetCode209 LeetCode3 LeetCode1004 LeetCode1658 LeetCode904 LeetCode438 LeetCode30

优化: 先固定左边的left然后让right指向left,定义一个sum,让right向右移动,用sum存区间之和,当sum >= 7时,然后left++,right重新移到left的位置,再将right移动进行求和,我们发现此步骤很繁琐,所以我们干脆不移动right,将它放在原位置,光让left++,再求区间大小.问题转化:找出最长的子数组的长度(len),所有的元素的和正好等于sum - x(target)判断每个字符串里的每个字符出现的次数.将原始的问题转化为:找出最长的子数组,0的个数不超过k个.

2023-11-28 21:21:28 95

原创 【Spring】(Spring是什么 容器 IoC 传统程序开发 控制反转式程序 Spring IoC DI Spring创建和使用 创建Spring项目 存储Bean对象 获取并使用Bean)

举个例子:现在A类引用B类,B类引用C类,C类引用D类,之前的做法是在A类引用B类的时候直接去new,直接去new的话就存在一个问题,当它的构造方法发生变化的时候.整个调用链都要进行变化,当我们不再去new,而是把当前的对象传入进来,此时虽然说整个调用链依然是A类引用B类,B类引用C类,C类引用D类,但是当D发生改变的时候,整个调用链,A,B,C是不需要进行任何代码的修改,从而解决了代码的耦合性.Spring是一个IoC容器.IoC 是"控制反转"的意思,也就是说Spring是一个"控制反转"的容器.

2023-09-17 00:18:56 135

原创 【Servlet】(Servlet API HttpServletResponse 重定向 服务器版表白墙 准备工作 约定前后端交互接口 实现服务器端代码 调整前端页面代码 数据存入数据库)

此时数据是保存在服务器内存中的,重启页面数据还在,重启服务器数据就丢失了,再下步我们就需要让服务器把数据存储到数据库中.针对上面的问题解决思路:让服务器来存储用户提交的数据,由服务器保存,当有新的浏览器打开页面的时候,就从服务器获取数据.[新增] 在页面加载的时候, 发送 GET 请求,从服务器获取到数据并添加到页面中.post是点击提交按钮的时候发起,get是页面加载的时候发起.// 实现提交操作 点击提交 就把用户输入的提交到页面显示。// 创建新的div.row 把内容构造到这个div中即可。

2023-08-17 11:26:54 196 3

原创 【Servlet】(Servlet API HttpServlet 处理请求 HttpServletRequest 打印请求信息 前端给后端传参)

上面的destroy能不能被执行到有待商榷,如果是通过Smart Tomcat 的停止按钮,这个操作本质上是通过Tomcat的8005端口,主动停止,可以触发destroy.如果是直接杀进程,此时可能就来不及执行destroy就没了.因此不太推荐使用destroy.然后刷新在控制台就能看到doGet请求了.想要获取别的请求,直接在代码中改就可以了,需要注意的是我们在编写Servlet代码的时候,每次修改代码,要及得重新启动服务器.json是一种非常主流的数据格式,也是键值对结构.

2023-08-14 17:02:46 1608 2

原创 【Servlet】(Servlet程序 创建项目 引入依赖 创建目录 编写代码 打包程序 部署程序 验证程序 Smart Tomcat插件 访问出错 404 405 500 空白页面 无法访问此网站)

我们在浏览器地址栏中输入URL之后,浏览器就构造了一个对应的HTTP GET请求,发给了Tomcat,Tomcat就根据第一级路径,确定了具体的webapp,再根据第二级路径确定了具体调用哪个类,再通过GET/POST方法确定调用HelloServlet的哪个方法(doGet,doPost),此时Tomcat就执行对应的代码完成对应工作.打包和部署程序我们可以使用IDEA的Tomcat插件,把Tomcat集成到IDEA中,就省去手动打包,手动部署的过程,只需要按一下运行就可以自动打包部署.

2023-08-13 16:18:53 277

原创 【Tomcat】(Tomcat 下载Tomcat 启动Tomcat 简单部署 基于Tomcat进行网站后端开发)

Tomcat 是一个 HTTP 服务器.HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式. HTTP 服务器我们可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实现的一个开源免费,也是被广泛使用的 HTTP 服务器.第一级路径(blog),叫做application path / context path.将之前写的前端代码部署到服务器上,将文件复制粘贴进。然后重启Tomcat.再在网址栏输入。即可启动 Tomcat 服务器.

2023-08-13 05:46:54 692

原创 【HTTP】(HTTP协议 HTTP 请求 (Request) URL HTTP 响应详解 通过form表单构造HTTP请求 通过ajax表单构造HTTP请求 HTTPS 加密 证书 )

服务器(网站)在设立之初,就需要去专门的认证机构申请证书,审核通过就会给其颁发证书,服务器生成的公钥也就包含在这个证书中了,客户端像服务器请求公钥的时候,此时就不是请求单单一个公钥,而是把整个证书都请求过来.客户端拿到证书后,就可以对证书进行校验.如果发现证书是无效的,浏览器就会直接弹框警告.本质是浏览器给网页提供的本地存储数据的机制.网页默认是不允许访问你计算机的硬盘的.(保证安全).Cookie针对浏览器访问硬盘做出了明确的限制,Cookie就是通过键值对的方式来组织数据的.

2023-08-12 13:06:13 1324

原创 【网络原理】 (3) (网络层 IP协议 地址管理 路由选择 数据链路层 以太网 MTU 补充:DNS)

NAT要求公网IP必须是唯一的,私网IP可以在不同的局域网中重复出现,如果某个私网里的设备想访问公网的设备,就需要对应NAT设备(路由器),把IP地址进行映射,从而完成网络访问.反之,公网设备无法直接访问私网的设备,.不同局域网的私网设备没法直接相互访问.NAT机制能够有效的解决IP不够用的问题,但是带来的副作用就是网络环境更加复杂了.域名分级了,DNS服务器也是分级了,有一级域名的DNS服务器,还有二级域名,三级域名.查询DNS服务器就是分级来查询的.DNS是应用层的一个协议,也是当前互联网的基石.

2023-08-01 04:12:55 101

原创 【网络原理】 (2) (传输层 TCP内部工作机制 连接管理 TCP建立连接(三次握手) TCP断开连接(四次挥手) 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况)

滑动窗口的本质就是不等待的批量发送一组数据,然后使用一份时间来等待着一组数据的多个ACK了.把不需要等待就能直接发送的数据的最大的量称为"窗口大小".上图的窗口大小就是4000.当批量发送了窗口大小这些数据之后,发送方就要等待ACK了.注意:不是等所有的ACK到达了才继续往下发,而是到一个ACK,就继续往下发一条.这样就可以让我们等待的ACK始终都是4条.流量控制和拥塞控制共同决定发送方的窗口大小是多少.流量控制考虑的是接收方的处理能力.拥塞控制描述的是传输过程中,中间节点的处理能力.

2023-07-29 18:49:04 107

原创 【网络原理】 (1) (应用层 传输层 UDP协议 TCP协议 TCP协议段格式 TCP内部工作机制 确认应答 超时重传 连接管理)

网络原理部分我们主要学习TCP/IP协议栈这里的关键协议(TCP 和 IP),按照四层分别介绍.(物理层,我们不涉及).

2023-07-28 04:00:57 598

原创 【网络编程】(TCP流套接字编程 ServerSocket API Socket API 手写TCP版本的回显服务器 TCP中的长短连接)

为解决上面的问题,我们使用多线程,主线程负责进行accept.每次接收到一个连接,创建新线程 ,由这个新的线程负责处理这个新的客户端.每个线程是独立的执行流.每个独立的执行流是各自执行各自的逻辑,彼此之间是并发关系.不会出现一边阻塞而影响到另一边执行的情况.不能正确运行,没有\n是不行的.TCP协议是面向字节流的协议(字节流特性:一次读多少个字节都行).接收方无法知道我们一次要多多少字节,这就需要我们在数据传输中进行明确的约定.此处代码中,隐式约定了使用\n来作为当前代码的请求/响应分割约定.

2023-07-27 04:32:58 1102 2

原创 【网络编程】(Socket套接字 UDP数据报套接字编程 DatagramSocket API DatagramPacket API InetSocketAddress API 手写简单网络通信程序)

使用这个类表示一个socket对象.在操作系统中,把这个socket对象当成一个文件来处理.相当于是文件描述符表上的一项.普通文件对应的硬件设备是硬盘.socket文件对应的硬件设备是网卡.一个socket对象就可以和另外一台主机进行通信了.如果要和多个不同的主机通信,则需要创建多个socket.构造一个DatagramPacket以用来接收数据报,接收的数据保存在字节数组(第一个参数buf)中,接收指定长度(第二个参数length)表示UDP中传输的一个报文,构造这个对象,可以指定一些具体的数据进去.

2023-07-26 16:12:57 73

原创 【多线程】(6)(Callable接口 JUC的常见类 ReentrantLock 原子类 Semaphore CountDownLatch 线程安全集合类 多线程环境使用哈希表,ArrayList)

可以把信号量想象成是停车场的展示牌: 当前有车位 100 个. 表示有 100 个可用资源.当有车开进去的时候, 就相当于申请一个可用资源, 可用车位就 -1 (这个称为信号量的 P 操作)当有车开出来的时候, 就相当于释放一个可用资源, 可用车位就 +1 (这个称为信号量的 V 操作)如果计数器的值已经为 0 了, 还尝试申请资源, 就会阻塞等待, 直到有其他线程释放资源.信号量, 用来表示 “可用资源的个数”. 本质上就是一个计数器.此处的信号量是Java把操作系统原生的信号量封装了一下.

2023-07-19 20:54:50 110 1

原创 【多线程】(5)(常见的锁策略 CAS的应用场景 实现原子类 实现自旋锁 CAS 的 ABA 问题 Synchronized 原理 优化操作 锁升级/锁膨胀 锁消除 锁粗化)

CAS: 全称Compare and swap,字面意思:”比较并交换“.我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。比较 A 与 V 是否相等。(比较)如果比较相等,将 B 写入 V。(交换)返回操作是否成功。上述CAS的过程,并非是通过一段代码实现的,而是通过一条CPU指令完成的.也就是说CAS操作是原子的,就可以在一定程度上解决线程安全问题.小结:CAS可以理解成CPU给咱提供的一个特殊指令,通过指令就可以一定程度的处理线程安全问题.

2023-07-18 17:38:07 159

原创 【多线程】(4)(多线程案例 单例模式 饿汉模式 懒汉模式 阻塞式队列 阻塞队列实现 定时器使用 手写定时器 线程池 工厂模式 ThreadPoolExecutor构造方法参数 手写简单线程池)

创建线程/销毁线程,是交由操作系统内核完成的,从池子里获取/还给池,是咱们自己用户代码就能实现的,不必交给内核操作.相比于内核来说,用户态,程序执行的行为是可控的.要想做某个工作,就会非常干净利落的完成(从池子里取/还给池子).如果要是通过内核,从系统这里创建个线程,就需要通过系统调用,让内核来执行了(内核不只是给你一个应用程序服务,它是给所有的程序都要提供服务的).因此当使用系统调用执行内核代码的时候,无法确定内核都要做哪些工作,整体过程是"不可控"的.优先队列(PriorityQueue).

2023-07-17 23:20:46 85

原创 【多线程】(3)(synchronized 关键字 可重入 synchronized修饰方法 修饰代码块 Java标准库中线程安全类 volatile 关键字 wait 和 notify)

CPU读取寄存器比读取内存速度快很多,一次就会在CPU内部引入缓存cache,寄存器存储空间小,读写速度快,贵,中间有个cache,它存储空间居中读写速度居中,成本居中,内存的存储空间大,读写速度慢,便宜.当CPU要读取一个内存数据的时候,可能是直接读内存,也可能是读cache,还可能是读寄存器.比如t1,t2两个线程,希望t1先干活,等干的差不多了,再让t2来干.就可以让t2先wait(阻塞,主动放弃CPU),等t1干的差不多了,再通过notify通知t2,把t2唤醒让t2接着干.

2023-07-14 23:34:50 156

原创 【双指针专题】(LeetCode11 LeetCode15 LeetCode18 LeetCode202 LeetCode611 LeetCode:剑指Offer57.和为s的两个数字)

三层for循环的时间复杂度就是O(N^3)然后看常数级别的时间复杂度.check(i,j,k),里面的判断如果是采用最初始的判断三角形的方法.相当于最内层for循环,check这个语句执行三次,用这种判断策略的话整个算法的时间复杂度就是O(3 * N ^3).若我们先排序,然后仅需判断一次check(i,j,k)就可以了,这种策略我们需要加上排序的时间复杂度(N * logN),采用这种策略整个算法的时间复杂度就是O(N* logN + N ^3),因此优化后对暴力枚举这种方法的时间复杂度是非常大的.

2023-07-12 20:14:42 93 5

原创 【多线程】(2) (观察线程状态 线程的状态转移 观察线程的状态和转移 案例:单线程-串行执行 多线程-并发执行 观察线程中不安全的情况 线程安全概念 线程不安全的原因 解决线程不安全问题)

如果没有多线程,此时程序代码执行顺序就是固定的(只有一条路),代码顺序固定,程序的结果就是固定的.如果有了多线程,此时抢占式执行下,代码的执行的顺序会出现更多的变数.此时代码执行顺序的可能性就从一种情况变成了无数种情况.所以就需要保证这种无数种线程调度顺序的情况下,代码的执行结果都是正确的.状态是针对当前线程调度的情况来描述的.现在我们认为线程是调度的基本单位.所以状态更应该是线程的属性.(后面我们谈到的状态都是线程的状态)通过循环获取就能看到这里的交替状态了.当前获取到的状态完全取决于系统里的调度操作.

2023-06-24 17:37:03 49

原创 【多线程】(1) (进程和线程 多线程编程 创建线程 实现Runnable 匿名内部类继承Thread,Runable Lambda表达式 构造方法和属性 中断线程 等待,获取,休眠线程 )

是否是守护线程,是否是"后台线程",前台线程会阻止进程结束,前台线程的工作没做完,进程是不能结束的.后台线程不会阻止进程结束,后台线程的工作没做完,进程是可以结束的.代码里手动创建的线程默认都是前台的.包括main默认也是前台的.其他的JVM自带的线程都是后台线程,是后台线程就是守护线程.线程是解决并发编程的前提下,让创建,销毁,调度的速度更快点,它是一个"轻量级进程".线程"轻"的原因是:它把申请资源/释放资源的操作给省下了.多进程是再调用一些新的空间和成本,多线程可以做到公用资源.此时代码改动比较小.

2023-06-12 19:15:22 1172 2

原创 【MySQL】JDBC编程 (Java的数据库编程:JDBC 导入驱动包 MySQL Connector Java 编写JDBC代码 插入操作 查询操作)

是java发布程序的典型方式,java是通过.java源文件编译成.class文件,jvm来解释执行.class,所以我们要想发布一个程序给别人使用,只需要把程序.class文件拷贝给对方让他用他的jvm来解释执行就可以了.但是每个.java都一 一对应一个.class,如果代码里.java非常多,我们就把一大堆的.class打成压缩包(类似于.rar .zip),我们这块的压缩包就是.jar.此时把jar拷贝给对方,对方就可以使用jvm来运行了.(1)mysql的官方网站获取.

2023-06-08 15:51:55 2366

原创 【MySQL】索引事务 (索引 索引使用场景 B+树事务使用 事务的特性 隔离性 并发执行产生的问题和解决方法 脏读问题 不可重复读 幻读 隔离级别 read uncommitted ......)

事务A提交了数据,此时为版本1,然后事务B就开始读取这个数据,于是事务C又修改数据,修改完成后提交版本2,事务B本来在读版本1的数据,读着读着数据变样了突然变成了版本2,此时同一个事务2之内多次读数据,读出的结果是不同的(预期是一个事务总多次读取结果是一样的)这样的问题就叫做"不可重复读"(第二次读取的结果不能复现第一次的结果).数据库使用"串行化"这样的方式来解决幻读,彻底放弃并发处理事务,一个接一个的串行的处理事务.这样做并发程度是最低的(效率最慢),隔离性是最高的(准确性也是最高的).

2023-06-07 12:44:56 89

空空如也

空空如也

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

TA关注的人

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