自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring Bean 循环依赖

循环依赖指的是两个或多个Bean之间通过构造函数、Setter方法或字段注入相互依赖,形成一个闭环。例如,Bean A依赖于Bean B,同时Bean B又依赖于Bean A,这就构成了一个典型的循环依赖。

2024-07-23 23:54:00 757

原创 SQL中的LEFT JOIN、RIGHT JOIN和INNER JOIN

LEFT JOIN(左连接)返回左表(LEFT JOIN语句中指定的第一个表)的所有行,即使右表(第二个表)中没有匹配的行。如果右表中没有匹配的行,则结果中右表的部分将包含NULL值。RIGHT JOIN(右连接)返回右表(RIGHT JOIN语句中指定的第二个表)的所有行,即使左表(第一个表)中没有匹配的行。如果左表中没有匹配的行,则结果中左表的部分将包含NULL值。给班级表添加一个id=5,name=五班的数据然后执行下面的sqlINNER JOIN(内连接)返回两个表中都满足连接条件的行。

2024-07-23 23:39:10 595 1

原创 CopyOnWriteArrayList

是Java并发包中的一个非常有用的工具,它通过写时复制的机制为读多写少的并发场景提供了高效的线程安全解决方案。然而,它也有其局限性,特别是在内存占用和写操作成本方面。因此,在选择使用时,需要根据实际场景进行权衡。

2024-07-22 16:47:03 452

原创 ConcurrentHashMap

是Java并发编程中一个非常强大的工具,它通过分段锁(Java 8之前)和无锁算法(Java 8及以后)等机制,提供了高并发、线程安全的数据结构。随着Java版本的演进,的设计也在不断优化,以更好地满足高并发场景下的需求。理解并掌握的使用,对于进行高效的Java并发编程至关重要。

2024-07-22 16:38:45 466

原创 Mysql索引

在数据库管理和优化中,索引是一个非常重要的概念。MySQL作为一种流行的关系型数据库管理系统,其索引机制对于提高查询速度、优化数据检索性能具有至关重要的作用。

2024-07-21 16:59:12 759

原创 MVCC数据库并发控制技术

如果数据的创建事务ID小于ReadView中的最小活跃事务ID,或者数据的删除事务ID不为空且大于等于ReadView中的事务ID,则该数据对当前事务不可见。在MVCC中,每个事务都有一个唯一的事务ID(通常是一个递增的数值),并且数据库中的每一行数据都记录了创建和删除(或更新)该行的事务ID。:在MVCC的实现中,通常会在表的每一行数据后面添加几个隐藏列,用于存储该行的创建事务ID、删除事务ID(如果存在)以及一个指向该行旧版本的指针(如果有的话)。:当事务开始时,系统会为该事务分配一个唯一的事务ID。

2024-07-21 15:04:52 730

原创 HTTP协议的演进:从HTTP/1.0到HTTP/2.0

HTTP/2.0引入了帧(Frame)的概念,允许在单一的TCP连接上同时发送多个请求和响应。通过在一个TCP连接上传输多个HTTP请求和响应,减少了连接建立和关闭的开销,从而提高了网络利用率和性能。随着互联网技术的不断发展,HTTP协议作为Web通信的基础,也经历了从HTTP/1.0到HTTP/1.1再到HTTP/2.0的演进。除了GET和POST之外,HTTP/1.1还新增了PUT、DELETE、OPTIONS、HEAD等请求方式,为Web应用提供了更多的灵活性和功能选择。然而,它也存在一些不足之处。

2024-07-20 21:14:00 874 1

原创 RabbitMQ发布确认及交换机类型

当生产者(Producer)启用发布确认功能后,每次发送消息到RabbitMQ时,都会获得一个唯一的序列号(delivery tag),并从1开始递增。一旦消息被成功路由到至少一个匹配的队列,并且满足持久化条件(如果已配置),RabbitMQ会向生产者发送一个包含已确认消息序列号的basic.ack消息。RabbitMQ作为一款广泛使用的开源消息队列软件,其强大的路由功能得益于其灵活的交换机(Exchange)类型。这意味着消息的路由键必须与队列的绑定键完全匹配,消息才会被路由到该队列。

2024-07-20 14:54:06 825 1

原创 HashMap的putVal方法(源码分析)

通过对putVal方法的深入剖析,我们可以看到HashMap在插入键值对时所做的复杂而精细的处理。这些处理不仅保证了哈希表的高效性和可扩展性,还为其在各种场景下的应用提供了坚实的基础。希望这篇文章能够帮助你更好地理解HashMap的工作原理和使用方法。

2024-07-19 17:11:40 410

原创 Java线程池

Java线程池是并发编程中的一个重要工具,通过合理使用线程池,可以显著提高系统的性能和资源利用率。然而,要充分利用线程池的优势,需要深入理解其原理、掌握其使用方法,并遵循最佳实践。希望本文能为读者在使用Java线程池时提供一些有用的指导和参考。

2024-07-19 16:55:35 1075

原创 手动实现堵塞队列

通过以上实现,我们成功创建了一个简单的阻塞队列,并使用wait和notify方法实现了线程间的协作。这种设计能有效地避免常见的并发问题,如数据竞争和死锁,提升了程序的可靠性和稳定性。在实际应用中,Java 的并发包提供了更高级的并发数据结构,如,它们已经封装了底层的并发控制机制,能够更方便地处理多线程情况下的数据交换操作。

2024-07-18 21:59:33 315

原创 单例模式~

确保一个类只有一个实例,并提供一个全局访问点来访问该实例。

2024-07-18 10:16:57 369

原创 原子操作实现原理

原子(atomic)本意是不能被进一步分割的最小粒子原子操作()意为“不可被中断的一个或一系列操作。

2024-07-17 11:29:34 400

原创 Synchronized

当前线程加锁,先不释放锁,等到有线程来请求锁,并且当前线程已经执行完毕,才会释放锁。当轻量级锁解锁时,存在锁的竞争,则会升级成为重量级锁,竞争失败的线程会进入堵塞队列。当锁被其他线程持有,该线程会一直通过自旋的方式来竞争锁。monitorenter和monitorexit。范里并没有详细说明。的,而方法同步是使用另外一种方式。monitorenter指令是在。

2024-07-17 10:57:25 580

原创 volatile相关知识

可见性:当一个线程修改一个共享变量时,其他的线程可以都可以直到到这个值被修改了。在每次访问volatile变量时,都会直接从主内存中读取最新值,而不会使用线程本地的缓存,从而避免了由于线程间的数据不一致而引发的问题。

2024-07-17 10:10:11 152

原创 初识并发编程

并发编程的目的是为了让程序运行得更快,但是,并不是启动更多的线程就能让程序最大限度地并发执行。在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如上下文切换的问题、死锁的问题,以及受限于硬件和软件的资源限制问题。

2024-07-17 09:38:02 1004

原创 使用线程dump排查死锁

当我们觉得程序可能出现死锁后一行一行排查代码效率是很低的,这时候就想,如果有个功具能直接告诉我线程到底在做什么事情,那效率就可可以有一个很大的提升了,在jdk安装目录下的bin中有一个。点击打开,在左侧找到你正在运行的程序。这样就可以明显的看到死锁产生的原因。

2024-07-17 09:02:04 210

原创 JVM知识点梳理

2024-07-16 22:03:36 124

原创 JVM(day4)类加载机制

加载。

2024-07-16 17:58:46 535

原创 JVM(day3)

大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。

2024-07-16 14:22:43 258

原创 JVM(day2)经典垃圾收集器

阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短;收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。同样是基于标记-复制算法实现的收集器,也是能够并行收集的多线程收集器,Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,”算法实现的收集器,会有大量空间碎片产生。

2024-07-15 23:36:13 847

原创 初识MQ(消息队列)

什么是MQMQ(message queue),字面意思一个存放消息的队列,遵循先进先出,那他有什么用,我们为什么要使用他呢?为什么要使用MQ流量削峰举个例子,当车流很少量少的时候,没有人管控也不会出什么问题,但当车流量一大起来,不管控的话就容易出乱子,这个时候交警和红绿灯的作用就体现出来了,而MQ充当的角色正是交警或者红绿灯的角色,当有大量的请求的时候,先处理部分请求,让另一部分进入队列等待处理。应用解耦以电商应用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦

2024-07-15 11:24:07 369

原创 Leetcode(经典题)day4

使用滑动窗口,当前窗口大小的数组的和比目标值小就加大窗口(r++),当前窗口大小的数组的和比目标值大或相等,就减小窗口大小(l++),并更新最小数组大小。

2024-07-14 18:39:43 298

原创 mysql事务隔离级别

A:再做一次查询,发现查到的数据与之前查到的又不一致了,查到了新加的,或者少了一些。A:再做一次查询,发现查到的数据与之前查到的一致(解决了不可重复读)A:再做一次查询,发现查到的是修改过的数据,与第一次查询结果不一致。A:再做一次查询,发现即使b没提交,A也能查到B操作过后的结果。A:再做一次查询,发现与上次一查询结果一致(解决了脏读)B:对数据进行新增(删除)操作。

2024-07-14 14:24:38 174

原创 Leetcode(经典题)day3-双指针

直接双指针对比就行。

2024-07-14 10:35:32 301

原创 Leetcode(经典题)day2

58. 最后一个单词的长度 - 力扣(LeetCode)第一次循环找到不为' '的起点,第二次循环第一次遇到‘ ’停止。index--;count++;

2024-07-13 23:28:19 705

原创 Leetcode(经典题)day1

和之前的删除有序数组中的重复项|相似,这里是要求最多出现两次,所以多加一个变量来记录出现次数即可,整体上还是使用双指针,比较容易解出。

2024-07-12 23:27:23 478

原创 JVM学习(day1)

即使不移动对象会使得收集器的效率提升一些,但因内存分配和访问相比垃圾收集频率要高得多,这部分的耗时增加,总吞吐量仍然是下降的。HotSpot虚拟机里面关注吞吐量的Parallel Scavenge收集器是基于标记-整理算法的,而关注延迟的CMS收集器则是基于标记-清除算法的,

2024-07-12 22:22:45 994

原创 双指针练习

【代码】双指针练习。

2024-07-11 22:25:32 285

原创 数据结构:二叉树

【代码】数据结构:二叉树。

2024-07-11 11:15:54 163

原创 数据结构:链表相关题目

判断环的过程和上一题一致,相遇让两个指针的其中一个从head开始与另一个指针一起每次走一步,再次相遇时的位置即为成环的位置。比较两个链表的值,将小的使用尾插法插到要返回的链表上,当一个链表为空时,直接将另一个链表剩下的直接插入要返回的链表。快慢指针:快指针追慢指针,相遇即为有环,如果走到null即为无环。设head到入口的距离为。入口到相遇点的距离为。相遇点到入口的距离为。

2024-07-11 10:25:22 515

原创 redis哨兵模式搭建

当需要运行多个Redis实例时,可以通过为每个实例使用不同的配置文件的方式来实现。另外注意:如果主机有密码的情况下需要找到下面这行配置取消注释并填上主机的密码。命令格式:info replication。复制redis目录下的。作用:检查redis节点的状态信息。将此配置文件复制到哨兵的工作目录。

2024-07-10 22:57:26 385

原创 redis相关知识记录

Redis⽀持五种主要数据结构:字符串(Strings)、列表(Lists)、哈希表(Hashes)、集合(Sets)和有序集合(Sorted Sets)。这些数据结构为开发者提供了灵活的数据操作⽅式,满⾜了不同场景下的数据存储需求。•字符串(Strings):最基本的数据类型,可以包含任何数据,如数字、字符串、⼆进制数据等。在Redis中,字符串是⼆进制安全的,这意味着它们可以有任何⻓度,并且不会因为包含空字符⽽被截断。•列表(Lists):简单的字符串列表,按照插⼊顺序排序。

2024-07-10 19:55:03 1414

原创 模拟防止重复提交

思路就是使用代理来执行方法,使用aop的思想对其进行切片,在执行方法前加一个分布式锁,这里分布式锁采用的是redis.nx,并加上一个过期时间防止死锁。整体只做了一个简单模拟,写的比较简单,有错误或不足的地方,还请指正,共同进步。gitee地址(需要自取)

2024-07-10 10:21:11 539

原创 简单仿写SpringIOC

整体与之前的仿写MVC的思路相差不大,不做过多描述。gitee地址(需要自取)

2024-07-10 10:07:05 315

原创 重写equals为什么要重写hashcode

而同一个对象需要在hash的同一个位置上,若重写equals之后不重写hashcode,在equals相等的时候,也就是我们认为在比较的两个对象是同一个对象,但可能这两个对象仅仅是内容一致,但实际上是两个不同的对象,在没有重写hashcode的情况下,两个不同的对象都处于自己的hash上,也就是两个不同的位置,这与我们的认知规则不符合。equals方法本身是判断两个对象是否是一个对象,equals为true,则表示两个对象应该在hash的同一个位置。所以重写equals之后要重写hashcode。

2024-07-10 09:59:10 231

原创 简单仿写MVC

整体思路流程,先对路径下的文件进行扫描,拿到.class后缀的文件,然后根据不同的注解进行不同的操作,将实例化对象和方法都存到map中,再从map中获取调用。具体详细的解释可以查看代码及其注释。Controller注解。

2024-07-09 13:25:42 426

原创 128陷阱

Integer的类中又一个cache数组,存放了范围[-128,127]的数据,如果int类型或者Integer类型的数据在这个范围中,则使用的是同一个,使用“==”结果则为true,若在这个范围之外,则是两个不同的对象,使用“==”结果则为false。

2024-07-08 14:00:24 118

原创 elasticsearch安装(centos7)

先给出网址上一篇博客安装了windows版本的elasticsearchCentos7安装步骤相比windows,linux需要注意的点就比较多了首先,同样先下载安装包,选择linux版本的并解压。这里我只安装了elasticsearch和elasticKibana,其他的就用了之前在windows下安装的。大致的步骤流程与windows一致,只是需要修改一些配置文件,所以这里就不赘述大体步骤了。先看elasticsearch,

2024-06-18 00:05:01 417

原创 Elasticsearch安装(windows)

但是我们发现,连接不到我们的elasticasearch,原因是我们没有打开elasticsearch的跨域。打开elasticsearch的conf文件下的 elasticsearch.yml添加以下代码。复制ik分词器的文件夹进入elasticsearch解压好的安装目录中的插件目录下。然后kibana也是一样,同样是启动bin目录下的kibana。先去上面的网站把windows的安装包下载下来并解压。访问----​​​​​​​。进入解压目录,打开cmd,,出现下面画面即为成功。

2024-06-17 23:19:06 438

空空如也

空空如也

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

TA关注的人

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