- 博客(79)
- 收藏
- 关注

原创 【计算机网络】TCP三次握手和四次挥手
在不可靠的网络中,可能会出现包传输延迟变化大,存在重传的报文段、存在保温重排序等现象,三次握手可以防止因为已经失效的请求报文突然又传到服务器引起错误。三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的第一次握手:客户端什么都不能确认;服务端确认了对方发送正常,自己接收正常第二次握手:客户端确认了:自己发送、接收正常,对方发送、接收正常;服务端确认了:对方发送正常,自己接收正常。
2024-07-24 16:59:14
957

原创 银行家算法
银行家算法是一种避免死锁的著名算法,由艾兹格·迪科斯彻(Edsger Dijkstra)在1974年提出。它主要用于操作系统的资源分配系统中,通过确保系统在任何时候都不会进入一个死锁状态来实现资源的合理分配。
2024-07-17 10:53:04
1595
原创 SpringBoot自动装配的基本原理
启动类注解: SpringBoot应用的启动类上通常会有一个@SpringBootApplication注解(包含@Configuration,@EnableAutoConfiguration,@ComponentScan ),用来开启 Spring Boot 的各项功能。 自动配置类: 在SpringBoot的jar包中,包含了许多以META_INF/spring.factories文件指定的自动配置类,这些类通常会有@configuration注解,表明它们是用来定义Bean的配置类。 条件化配
2024-10-17 17:04:14
265
原创 Spring MVC的运行流程
用户向服务器发起请求,请求被前端控制器(DispatcherServlet )捕获 前端控制器对请求URL进行解析,得到请求资源标识符URI,调用处理器映射器(HandlerMapping )获得该处理器(Handler)配置的所有相关对象(包括 Handler对象以及 Handler对象对应的拦截器 ),最后以处理器执行链(HandlerExecutionChain)对象的形式返回给前端控制器 前端控制器根据获得的处理器,选择合适的处理器适配器(HandlerAdapter )。处理器适配器调用对应的
2024-10-17 16:28:53
473
原创 【JVM】G1垃圾收集器
筛选回收(Live Data Counting and Evacuation): 在这个阶段,G1 GC会根据每个Region的垃圾堆积情况和回收价值进行排序,并选择性地回收部分Region中的垃圾对象。最终标记(Final Marking): 为了处理在并发标记过程中新产生的对象引用关系,G1 GC会执行一次短暂的STW的最终标记。优点:更精细的控制、可预测的停顿时间、内存碎片的控制、优先级处理(设置回收区域、stop the world的容忍时间100ms)
2024-10-12 11:30:00
291
原创 【JVM】CMS垃圾收集器
重新标记:为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短。并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程,过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。并发清除:清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。初始标记:标记一下GC Roots能直接关联到的对象。获取最短回收停顿时间。
2024-10-12 10:00:00
196
原创 【JVM】垃圾回收算法
在发生Minor GC之前,虚拟机必须先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那这一次Minor GC可以确保是安全的。如果允许,那会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试进行一次Minor GC,尽管这次Minor GC是有风险的;首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。,然后直接清理掉边界以外的内存。空间浪费多、复制开销大。
2024-10-11 17:28:04
743
原创 【JVM】如何判断对象是否可以被回收
通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;缺点:无法解决对象相互循环引用的问题,对象A中引用了对象B,对象B中引用对象A。
2024-10-11 17:20:12
391
原创 事务的隔离级别
(一事务写时禁止其他事务读写、一事务读时禁止其他事务读写)含义解释:限制同一数据写事务禁止其他读写事务,读事务禁止其它写事务(允许读)。(一事务写时禁止其他事务读写、一事务读时禁止其他事务写)第一个事务正在查询符合条件的数据,这时,另一个事务又插入了一条符合数据的数据,第一个事务在第二次查询符合同一条数据时,发现多了一条前一次查询没有的数据,这就是幻读。一个事务正在对数据进行更新但更新未提交,另一个事务读取到了未提交数据,而前一个事务操作失败回滚,后一个事务就脏读了。(一事务写时禁止其他事务写)
2024-09-03 10:34:55
314
1
原创 事务的特性
事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
2024-09-03 10:17:28
263
原创 聚簇索引和非聚簇索引
如果对索引列的数据被修改时,那么对应的索引也将会被修改, 而且况聚集索引的叶子节点还存放着数据,修改代价肯定是较大的, 所以对于主键索引来说,主键一般都是不可被修改的。MYISAM 引擎的表的.MYI 文件包含了表的索引, 该表的索引(B+树)的每个叶子非叶子节点存储索引, 叶子节点存储索引和索引对应数据的指针,指向.MYD 文件的数据。文件就包含了该表的索引和数据,对于 InnoDB 引擎表来说,该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据。
2024-08-29 22:16:01
256
原创 MyBatis中#{}和 ${}的区别是什么?
使用#{}传入的参数会以字符串的形式进行匹配,而${}传入的参数是直接替换,数值类型像id可以直接替换,但是如果是姓名、性别这种直接替换会出错。我们经常使用的是#{},是因为这种方式可以防止SQL注入,#{}这种方式SQL语句是经过预编译的,它把#{}中间的参数转义成字符串。动态解析时候,会传入参数字符串:select * from table where name = 'zhangSan'#传入的参数在SQL中显示为字符串,会堆自动传入的数据加上双引号。而使用${}在动态解析时候,会传入参数字符串。
2024-08-29 18:19:45
506
1
原创 【JAVA基础】BIO、NIO、AIO有什么区别
指的是用户进程触发 IO 操作并等待或者轮询的去查看 IO 操作是否就绪。指用户进程触发IO操作以后便开始做自己的事情,而当 IO 操作已经完成的时候会得到 IO 完成的通知。IO 操作主要分为两个步骤,即发起 IO 请求和实际 IO 操作,同步与异步的区别就在于第二个步骤是否阻塞。
2024-08-05 11:15:25
429
原创 【JVM】对象的创建
另外一种是把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲(Thread Local AllocationBuffer,TLAB),哪个线程要分配内存,就在哪个线程的本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定。当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。
2024-07-31 09:27:56
180
原创 Linux下Docker的下载与安装
5、修改docker-ce.repo文件, 将baseurl和gpgkey替换为中科大的镜像源地址。4、查看该文件 cat /etc/yum.repos.d/docker-ce.repo。1、卸载旧版本(第一次安装可跳过)6、安装docker。
2024-07-30 14:46:08
641
原创 【JVM】运行时数据区域
不过无论从什么角度,无论如何划分,都不会改变Java堆中存储内容的共性,无论是哪个区域,存储的都只能是对象的实例,将Java堆细分的目的只是为了更好地回收内存,或者更快地分配内存。:本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。线程共享:堆和方法区。
2024-07-30 09:24:43
227
原创 【设计模式】原型模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。:这些模式关注对象之间的组合和关系,旨在解决如何构建灵活且可复用的类和对象结构。:这些模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。
2024-07-26 12:00:27
641
原创 【计算机网络】TCP 协议如何保证可靠传输
应用数据被割成 TCP 认为最适合发送的数据。TCP 给发送的每一个包进行,接收方对数据包进行排序,把有序数据传送给应用层。TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。TCP 的接收端会丢弃重复的数据。TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
2024-07-24 17:42:28
1095
原创 【设计模式】建造者模式
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。:这些模式关注对象之间的组合和关系,旨在解决如何构建灵活且可复用的类和对象结构。:这些模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。
2024-07-23 15:28:00
1015
原创 【数据库】Explain关键字
Explain 是 SQL 中的一个命令,它用于显示 SQL 查询的执行计划。执行计划是数据库系统如何执行查询的详细步骤,包括查询的各个部分如何被优化和执行。
2024-07-23 10:00:00
1403
原创 【数据库】联合索引在b+树如何存储
联合索引是一种数据库索引类型,它允许你基于表中两个或多个列的组合来创建索引。这种索引可以提高数据库查询的性能,特别是当查询条件涉及到这些列时。非叶子节点:存储索引关键字信息,是线性排列的,每个系欸但的数据排列顺序和创建索引字段的顺序一致。叶子节点:存储索引列的值和主键id,排列规则与非叶子节点一致。
2024-07-22 21:17:14
511
原创 【数据库】最左前缀原则
如User表的name和city加联合索引就是(name,city),而最左前缀原则指的是,如果查询的时候查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到。这里需要注意的是,查询的时候如果两个条件都用上,但是顺序不同,如 city = xx and name = xx,那么现在的查询引擎会自动优化为匹配联合索引的顺序,这样是能够命中索引的。由于最左前缀的原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重之后的个数,较多的放前面。order by子句也遵循此规则。
2024-07-22 17:25:47
297
原创 【数据库】那些操作会引起索引失效
例如:WHERE column1 = value1 OR column2 = value2,如果column1 和column2 都没有索引,或者没有同时为这两列创建复合索引,查询可能会全表扫描。如果JOIN条件的列没有索引,或者索引不适合当前的查询条件,可能会导致索引失效。如果排序或分组的列没有索引,或者索引不适合当前的查询条件,可能会导致索引失效。如果子查询的结果集很大,或者子查询的列没有索引,可能会导致索引失效。如果列没有索引,或者索引不适合当前的查询条件,可能会导致索引失效。
2024-07-21 21:22:59
474
原创 【设计模式】抽象工厂模式
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。
2024-07-21 11:46:58
982
原创 【设计模式】工厂模式
工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。简单工厂模式(Simple Factory Pattern):工厂方法模式(Factory Method Pattern):抽象工厂模式(Abstract Factory Pattern):每次增加一个产品时,都需要增加一个具体类和对应的工厂,使系统中类的数量成倍增加,增加了系统的复杂度和具体类的依赖。工厂模式包含以下
2024-07-20 23:34:21
624
原创 【并发编程】 JMM
jmm是Java内存模型,它确保了在并发编程中,不同线程对共享变量的访问能够按照一定的规则进行,以避免内存一致性错误。在 JDK1.2 之前,Java 的内存模型实现总是从(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可以把变量保存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成。
2024-07-20 09:00:00
265
原创 【并发编程】CAS
CAS,即Compare-And-Swap,是一种用于实现无锁编程的原子操作。它通常用于多线程环境中,确保对共享数据的安全访问和修改。CAS操作包含三个参数:内存位置(V)、预期原值(A)和新值(B)。:首先,CAS检查内存位置的当前值是否与预期原值A相等。:如果当前值与预期原值相等,CAS将内存位置的值更新为新值B。:CAS操作返回一个布尔值,指示操作是否成功。如果成功,返回true;如果失败,返回false。
2024-07-19 15:34:26
195
原创 [并发编程] synchronized锁的膨胀
锁膨胀的过程是自动的,JVM 会根据线程的争用情况来决定是否需要升级锁。锁主要存在四种状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级。(Lock Inflation)是指锁从一种较轻量级的锁状态逐渐升级到更重量级的锁状态的过程。:当线程第一次访问同步代码块时,JVM 会将锁标记为偏向锁,并偏向第一个获取锁的线程。:在轻量级锁和重量级锁之间,JVM 可能会尝试自旋锁。:如果轻量级锁竞争失败,或者线程在轻量级锁状态下被阻塞,JVM 会将锁升级为重量级锁。
2024-07-19 15:13:42
696
原创 死锁产生的条件以及解决死锁的几种方式
所谓死锁是指在多道程序系统中,一组进程中的每一个进程均无限期地等待被该组进程中的另一个进程所占有且永远不会释放的资源;不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。:这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)。:占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。按某一顺序申请资源,释放资源则反序释放。请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
2024-07-19 15:08:32
287
原创 【设计模式】单例模式
懒汉式适合单线程环境或资源消耗不是主要考虑因素的场景。饿汉式适合多线程环境,且单例对象的创建成本不高或需要尽早初始化的场景。双重检查锁定适合多线程环境,需要在需要时才创建实例,同时保证线程安全的场景。静态内部类适合多线程环境,需要延迟加载单例对象的场景。枚举适合需要单例对象,且对扩展性要求不高的场景,同时支持序列化。
2024-07-18 18:32:46
877
原创 【JVM】再谈引用--强、软、弱、虚
在Java中,引用类型主要有四种:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference),这4种引用强度依次逐渐减弱。
2024-07-17 11:11:35
380
原创 单核条件下会不会出现线程安全问题?
即使在单核处理器上,如果操作系统的调度策略允许多个线程交替执行,那么线程安全问题仍然可能发生。:两个或多个线程在等待对方释放资源,导致它们都无法继续执行。:多个线程同时读写同一内存位置,可能导致数据不一致。:线程的执行顺序影响程序结果,而这种顺序是不确定的。:一些线程由于资源分配不当而长时间得不到所需资源。
2024-07-17 10:18:45
413
原创 数据结构--树
是一种抽象数据类型,它是由节点组成的层次结构。每个节点包含数据和指向其他节点的链接(称为子节点)。二叉树:一个节点上可以分出两个叉多叉树:一个节点上可以分出多个叉下面是树的一些基本概念:1、节点:树当中存储数据的单元2、根节点:一种没有父节点的节点3、父节点:一个节点的上级节点叫做它的父节点,一个节点最多只能有一个父节点 子节点:一个节点的下级节点叫做它的子节点,一个节点可以有多个子节点4、叶子结点:没有子节点的节点5、节点的权:节点值。
2024-07-16 18:06:14
833
原创 数据结构--链表
链表是一种由节点组成的集合,每个节点包含数据部分(value)和只想下一个节点的链接(next)。JAVA中的LinkedList实现了List类,允许添加、删除和访问元素。
2024-07-15 10:34:14
378
原创 数据结构--ArrayList集合及其应用
remove(Object o) 从List集合中移除第一次出现的指定元素,移除成功返回true,否则返回false。get(i)==null : o.equals(get(i)))条件的最低索引i的元素时才会返回true。.set(int i, Object element) 使用元素element替换索引i位置的元素,并返回替换元素。.remove(int index) 移除列表中指定位置的元素,并返回被删元素,删除位置后面的元素(如果有)向前移。.size() 返回列表中的元素个数。
2024-07-15 10:03:19
1494
原创 JAVA基础--可变字符串StringBuffer与StringBuilder
StringBuffer 支持并发操作 线程安全 适合多线程 ,慢(两者都比String快)StringBuilder 不支持并发操作 线程不安全 适合单线程 快。
2024-07-14 21:52:12
220
原创 JAVA基础--String及其使用方法
1、裁剪子串substring(start,end),start从0开始;10、查找 indexOf()第一次的位置 lastIndexOf()最后一次的位置。StringBuilder:可变字符序列、效率高、线程不安全 支持并发操作。StringBuffer:可变字符序列、效率低、线程安全 不支持并发操作。4、获取字符串指定字符的编码值(代码点)codePointAt()3、获取字符串指定字符(代码单元)charAt()7、是否以什么字符串开头 startsWith()11、去除空格字符串 trim()
2024-07-14 21:42:21
165
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人