- 博客(67)
- 收藏
- 关注
原创 面试准备-1
两个线程使用同一个全局变量会有不一致的问题,比如a线程把全局变量加1,b线程读的时候,如果还是从缓存中读的,那么会没有发现这个更新,就会产生不一致的问题。
2024-09-02 11:16:00
72
原创 SpringBoot自动配置和执行过程
1. 加载容器(加载配置文件)2. 根据配置完成Bean的初始化(扫描配置范围内的五大类注解) 3. 将被五大类注解修饰的类注册到Spring容器中 (将对象交给Spring IoC容器管理)4.注入Bean对象(@Autowired、@Resource)Spring Boot的自动配置是Spring Boot框架提供的一项特性,它在Spring容器启动后会自动加载一些配置类和Bean对象到IoC容器中,无需手动声明,从而简化了开发流程,减少了繁琐的配置操作。具体来说,Spri
2024-08-05 20:33:05
844
原创 Bean的作用域和生命周期
Bean的作用域我们先来看下面这段代码首先是一个Dog类 (此处使用lombok来完成setter、getter、toString方法)@Setter@Getterpublic class Dog { private String name;}然后在DogBeanConfig类里面写一个返回Dog的方法,并将这个方法的返回对象存入Spring容器@Componentpublic class DogBeanConfig { @Bean public
2024-08-03 14:51:18
886
原创 【Spring Boot】之统一功能处理
Component@Slf4j@Overridelog.info("登录拦截器校验...");//401 表示未认证登录// log.info("目标方法执行后");
2024-07-21 13:35:20
676
1
原创 动态SQL
动态SQL动态SQL动态 SQL 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接.标签在注册⽤⼾的时候,可能会有这样⼀个问题,如下图所⽰:注册分为两种字段:必填字段和⾮必填字段,那如果在添加⽤⼾的时候有不确定的字段传⼊,程序应该如何实现呢?这个时候就需要使⽤动态标签 来判断了,⽐如添加的时候性别 gender 为⾮必填字段,具体实现如下:注意 test 中的 gender,是传⼊对象中的属性,不是数据库字段。
2024-07-20 19:22:56
674
原创 XMl基本操作
使⽤Mybatis的注解⽅式,主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能,建议使⽤XML来配置映射语句,也就是将SQL语句写在XML配置⽂件中.之前,我们学习了,用注解的方式来实现MyBatis接下来我们学习XML的⽅式MyBatis XML的⽅式需要以下两步配置数据库连接字符串和MyBatis写持久层代码MyBatis XML配置⽂件配置连接字符串和MyBatis此步骤需要进⾏两项设置,数据库连接字符串设置和 MyBatis 的 XML ⽂件配置。写持久层代码。
2024-07-20 18:35:22
728
原创 博客系统测试报告
用户名以及密码已经在后端写入了数据库是已经存在的,登录成功后就会跳转到列表页面;执行用户注销操作后,也会回到登录页面。(2)测试用例展示a)界面b)输入正确的账号和密码(以用户"zhangsan"为例):预期结果:跳转到博客列表页。实际结果如下:之后,再补吧。
2024-06-07 09:49:38
307
原创 垃圾回收整理
垃圾是指在 运行程序中没有任何指针指向的对象, 这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致。
2024-06-04 23:34:08
651
原创 总结Linux 的常用命令
ls [选项] [目录或文件:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。-a列出目录下的所有文件,包括以开头的隐含文件。-d将目录象文件一样显示,而不是显示其下的文件。如:ls –d指定目录-k以k字节的形式表示文件的大小。ls –alk指定文件-l列出文件的详细信息。-r对目录反向排序。-t以时间排序。-R列出所有子目录下的文件。递归: pwd:显示用户当前所在的目录pwdLinux。
2024-06-03 00:02:26
1043
原创 Cookie和Session的区别、工作流程是什么?
就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系.就需要医院这边通过系统记录每个就诊卡和患者信息之间的关联关系。第二次访问的时候服务器就能知道该请求是否是已经登陆过了。这个唯一性字符串 称为 "sessionId".服务器需要清除的区分清楚每个请求是从属于哪个用户。我们很多时候是需要知道请求之间的关联关系的。此时患者的身份和就诊卡的关联就销毁。协议的客户端和服务器之间的这次通信。就可以理解成是同一个东西的不同叫法。服务器同一时刻收到的请求是很多的。信息中获取到对应的用户信息。
2024-05-27 13:55:11
539
原创 总结 HTTPS 的加密流程
http是为了解决http存在的问题而在http基础上加入了SSL/TSL,在HTTP/2中TCP三次握手后会进入SSL/TSL握手,当SSL/TSL建立链接后,才会进行报文的传输。
2024-05-21 22:58:26
827
原创 总结 HTTP 协议的基本格式
HTTP 协议目前有三个大版本:HTTP / 1 和 HTTP / 2 都是基于TCP 传输控制协议传输数据。最新版本的 HTTP / 3 是基于 UDP 协议的。当前互联网上传输数据大部分使用的版本是 HTTP / 1.1HTTP 协议具体是什么? ——应用层协议又是什么? 应用层协议可以理解为是组织数据的一种格式,需要发送方和接收方约定相应的格式.如何看到 HTTP 的报文格式呢?我们可以借助一些 “抓包工具” 来获取设备交互的数据,可以抓取 http 协议的数据包。如果只是针对 HTTP/HTTPS
2024-05-20 18:46:30
1217
1
原创 DNS解析
浏览器缓存——》系统hosts文件——》本地DNS解析器缓存——》本地域名服务器(本地配置区域资源、本地域名服务器缓存)——》根域名服务器——》主域名服务器——》下一级域名域名服务器 客户端——》本地域名服务器(递归查询) 本地域名服务器—》DNS服务器的交互查询是迭代查询。递归查询: 如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户端的身份,向其他根域名服务器继续发出查询请求报文,即替主机继续查询,而不是让主机自己进行下一步查询。
2024-05-17 12:10:21
976
原创 数据链路层
源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的;帧协议类型字段有三种值,分别对应IPARPRARP;帧末尾是CRC校验码。MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层,产生的限制。以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
2024-05-17 11:45:29
342
原创 IP协议详解
IP 数据包需要进行分包的主要原因是网络传输中的限制。网络传输有时会遇到带宽不足或路由器 MTU 尺寸的限制等情况,导致数据包过大,不能被成功地传输。在这种情况下,将数据包分为多个更小的片段来传输就是一种有效的解决办法。 通过将数据包分割成多个片段,IP 数据包分包可以解决这些问题。分割后的每个片段可以更容易地在网络中传输,因为它们更小。如果需要,它们可以同时通过不同的传输路径进行发送,从而提高数据的传输速度和可靠性。因此,IP 数据包分包是一种优化网络传输的有效方式。分包过程会保留原始IP数据包的一部分
2024-05-15 18:14:39
1081
原创 Iterable与Iterator
terator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。:为每个剩余元素执行给定的操作,直到所有的元素都已经被处理或行动将抛出一个异常:如果迭代器中还有元素,则返回true。:返回迭代器中的下一个元素:删除迭代器新返回的元素。注意:(1)Iterator只能单向移动。;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次next()方法,remove()方法只能被调用一次,如果违反这个规则将抛出一个异常。
2024-05-15 11:59:21
657
原创 不同路径| 和 不同路径||
机器人试图达到网格的右下角(在下图中标记为 “Finish” )。⼀个机器⼈位于⼀个 m x n ⽹格的左上⻆ (起始点在下图中标记为 “Start” )。根据「状态转移⽅程」的推导来看,填表的顺序就是「从上往下」填每⼀⾏,在填写每⼀⾏的时候。网格的左上角 (起始点在下图中标记为 “Start” )。在本题中,「添加⼀⾏」,并且「添加⼀列」后,只需将。位置的,也就是说,此时的⽅法数应该是 0。的位置)向下⾛⼀步,转移到。的位置)向右⾛⼀步,转移到。的位置)向下⾛⼀步,转移到。的位置)向右⾛⼀步,转移到。
2024-05-12 17:42:26
804
原创 柠檬水找零
题⽬描述在柠檬⽔摊上,每⼀杯柠檬⽔的售价为5美元。顾客排队购买你的产品,(按账单bills⽀付的顺序)⼀次购买⼀杯。每位顾客只买⼀杯柠檬⽔,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你⽀付5美元。注意,⼀开始你⼿头没有任何零钱。给你⼀个整数数组bills,其中bills[i]是第i位顾客付的账。如果你能给每位顾客正确找零,返回true,否则返回false。
2024-05-12 16:19:29
462
原创 总结 UDP 的报文结构和注意事项
UDP 传输的过程类似于寄信。,不需要建立连接;没有任何安全机制,发送端发送数据报以后,如果因为网络故障该段无法发到对方, UDP 协议层也不会给应用层返回任何错误信息,应用层交给 UDP 多长的报文, UDP 原样发送,既不会拆分,也不会合并;用 UDP 传输 100 个字节的数据:如果发送端一次发送100个字节,那么接收端也必须一次接收100个字节;而不能循环接收10次,每次接收10个字节。大小不能变UDP只有接收缓冲区,没有发送缓冲区:UDP没有真正意义上的。
2024-05-11 14:39:57
854
原创 计算两个字符串间的最大的相同位数
链接--题目牛牛手里有一个字符串A,羊羊的手里有一个字符串B,B的长度大于等于A,所以牛牛想把A串变得和B串一样长,这样羊羊就愿意和牛牛一起玩了。而且A的长度增加到和B串一样长的时候,对应的每一位相等的越多,羊羊就越喜欢。比如"abc"和"abd"对应相等的位数为2,为前两位。牛牛可以在A的开头或者结尾添加任意字符,使得长度和B一样。现在问牛牛对A串添加完字符之后,不相等的位数最少有多少位?第一行为字符串A,第二行为字符串B,A的场地小于等于B的长度,B的长度小于等于50.字符均为小写字母。
2024-05-10 00:08:46
193
原创 总结 File 类的用法
我们先来认识狭义上的文件(file)。针对硬盘这种持久化存储的I/O设备,当我们想要进行数据保存时,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念,就类似办公桌上的一份份真实的文件一般。文件除了有数据内容之外,还有一部分信息,例如文件名、文件类型、文件大小等并不作为文件的数据 而存在,我们把这部分信息可以视为文件的元信息同时,随着文件越来越多,对文件的系统管理也被提上了日程,如何进行文件的组织呢,一种合乎自然的想法出现了,就是按照层级结构进行组织。
2024-04-25 00:16:56
992
原创 总结 HashTable, HashMap, ConcurrentHashMap 之间的区别
HashMap: 线程不安全. key 允许为 nullHashtable: 线程安全. 使用 synchronized 锁 Hashtable 对象, 就是一把大锁,锁冲突极高,效率较低. key 不允许为 null.ConcurrentHashMap: 线程安全. 使用 synchronized 锁每个链表头结点, 锁冲突概率低, 充分利用 CAS 机制. 优化了扩容方式. key 不允许为 null。
2024-04-16 22:29:04
843
原创 锁策略总结
自旋操作是一直让CPU空转,比较浪费CPU资源,因此,此处的自旋不会一直持续进行,而是达到一定的时间/重试次数,就不在自旋了,也就是所谓的"自适应".把value的值设为A的话,CAS判定value为A,此时value的值可能始终为A,也可能是value本来是A,被修改为了B,最后又还原成了A.4) 轮到线程 2 执行了 , 发现当前存款为 100, 和之前读到的 100 相同 , 但是当前版本号为 3, 之前读。3) 在线程 2 执行之前 ,张三 的朋友正好给张三转账 50, 账户余额变成 100!
2024-04-15 19:01:20
1100
原创 死锁的成因, 和解决方案.
此时这样一来,总有一个人拿不到筷子,那么上述情况,拿到编号为 4 筷子的哲学家就能拿编号为 5 筷子吃面了,吃完了放下两支筷子,接着右手边拿到 3 筷子的哲学家就拿起放下的 编号4 筷子进行吃面了,以此类推.....此时就发现,代码僵住了,其实也就是 t1 在等 t2 释放锁,而 t2 也在等 t1 释放锁,此时两个线程都无休止的阻塞等待下去了,最终导致,张三拿不到刀叉,小美也拿不到刀叉!于哲学家吃面的问题,对每根筷子进行编号,约定好,只能先拿左右手编号小的筷子,再拿编号大的筷子。
2024-04-13 17:58:22
574
原创 总结synchronized
synchronized具有原子性、可见性、有序性、可重入性在一次或多次操作中,要么所有的操作都执行并且不会受其他因素干扰而中断,要么所有的操作都不执行。【一次操作,要么完全成功,要么完全失败】是指一个线程对进行修改,另一个线程立即得到修改后的最新值。是指程序中代码的执行顺序,Java在和会对代码进行优化,会导致程序最终的执行顺序不一定就是我们编写代码时的顺序。synchronized的可重入性就是当一个线程调用synchronized代码持有对象锁的时候,如果调用了该对象的其他synchronized代码
2024-04-13 11:03:22
645
原创 线程池(详解)
除了上述这些线程池之外,标准库还提供了一个接口更丰富的线程池类看原码,:核心线程数,线程池启动时就会创建的线程数量。即使核心线程是空闲的,也不会被回收,除非调用了allowsCoreThreadTimeOut方法为true:最大线程数,线程池中最大的线程数量:线程超时时间,看源码可知,该参数的意义是线程从工作队列中取出任务的超时时间。其中,timed是指是否设置allowCoreThreadTimeOut为true,如果没有设置,则判断当前线程数是否大于核心线程数。
2024-04-10 00:35:49
759
原创 单例模式--理解
(1)单例模式常见的写法有两种:懒汉式、饿汉式(2)懒汉式:在需要用到对象时才实例化对象,正确的实现方式是:Double Check + Lock,解决了并发安全和性能低下问题(3)饿汉式:在类加载时已经创建好该单例对象,在获取单例对象时直接返回对象即可,不会存在并发安全和性能问题。(4)在开发中如果对内存要求非常高,那么使用懒汉式写法,可以在特定时候才创建该对象;(5)如果对内存要求不高使用饿汉式写法,因为简单不易出错,且没有任何并发安全和性能问题。
2024-04-07 19:51:42
1240
转载 线程安全问题
可以粗略理解成每个对象在内存中存储的时候都存有一块内存表示当前的锁定状态类似于厕所的有人无人").如果当前是无人状态那么就可以使用使用时需要设为有人状态如果当前是有人状态那么其他人无法使用只能排队。
2024-04-07 15:35:26
34
原创 volatile关键字的作用
那么在线程2修改stop值时(当然这里包括2个操作,修改线程2工作内存中的值,然后将修改后的值写入内存),会使得线程1的工作内存中缓存变量stop的缓存行无效,然后线程1读取时,发现自己的缓存行无效,它会等待缓存行对应的主存地址被更新之后,然后去对应的主存读取最新的值。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。在前面已经解释过,每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。
2024-04-01 22:15:43
329
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人