自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM垃圾回收

在JVM中,垃圾回收主要指的是回收堆(Heap)内存中不再被使用的对象所占用的空间。JVM通过垃圾回收机制自动执行这一过程,以确保有效地利用内存资源。

2024-02-16 17:50:32 1202

原创 JVM内存模型

Java虚拟机(JVM)内存模型是Java运行时数据区的一种规范,它定义了Java虚拟机在执行Java程序时如何使用内存。了解JVM内存模型对于优化Java应用程序、提高性能、避免内存泄漏和解决内存溢出问题至关重要。本文将以JDK8为例,详细解析JVM内存模型的各个组成部分。

2024-02-14 20:47:48 427

原创 Java类加载

自定义类加载器需要继承 java.lang.ClassLoader 类,这个类有两个核心方法// loadClass() 实现了双亲委派机制Class<?= null) {} else {sun// loadClass() 实现了双亲委派机制 protected Class <?

2024-02-14 12:30:28 422

原创 Netty底层探究

Netty中的编解码是通过ChannelHandler来实现的。编码器用于将应用程序数据转换为字节,以便在网络上传输。解码器则用于将接收到的字节转换为应用程序数据。这些编解码器通常被添加到ChannelPipeline中,以便在数据传输过程中自动进行编解码操作。这种方式可以帮助简化网络通信过程中的数据处理和转换。网络中数据都是基于0101的二进制字节传输的。.发送方需要将数据编码转化为二进制字节,接收方收到二进制字节,再解码成数据.在网络通信中,由于数据传输的不确定性,可能会导致粘包和拆包的问题.

2024-01-31 23:28:07 230

原创 Netty入门使用

NIO 的类库和 API 繁杂,使用起来比较麻烦,需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。开发工作量和难度都非常大,例如客户端面临断线重连、网络闪断、心跳处理、半包读写、网络拥塞和异常流的处理等。Netty 对 JDK 自带的 NIO 的 API 进行了良好的封装,解决了上述问题。此外,Netty 拥有高性能、吞吐量更高,延迟更低,减少资源消耗,最小化不必要的内存复制等优点。

2024-01-31 23:27:23 453

原创 搞懂BIO与NIO

1. 每个连接对应一个线程,导致线程数量随着连接数增加而增加,可能导致资源消耗过大。2. 读取和写入操作是阻塞的,可能导致性能瓶颈,特别是在大量并发连接的情况下。3. 适用于连接数较少且通信量不大的场景,但在高并发情况下性能表现不佳。NIO是Java中用于高性能I/O操作的一种机制。它提供了Channel和Buffer的抽象,以及Selector的多路复用能力,使得单个线程可以有效地管理多个通道的I/O操作。NIO相对于传统的I/O(即BIO)具有更高的并发性能和可扩展性,适用于需要处理大量连接的网络应用。

2024-01-31 23:25:20 340

原创 搞懂 三次握手四次挥手

三次握手用于建立连接,确保双方都愿意通信;四次挥手用于关闭连接,保证双方都能安全、可靠地关闭连接。在这些过程中,序列号、确认号、状态转换等都起到关键作用,确保了连接的可靠性和稳定性。

2024-01-13 21:55:40 415

原创 zookerper集群Leader选举

总体来说,这些队列和流程用于实现 ZooKeeper 集群中的 Leader 选举和消息传递机制。这是一个分布式系统中常见的模式,确保各个节点之间的通信和同步。可以通过下面zk集群启动的源码过程,加深zk集群的选举逻辑.

2024-01-11 17:10:53 481

原创 zookerper入门

ZooKeeper 是一个开源的分布式协调框架,主要用来解决分布式集群中应用系统的一致性问题.ZooKeeper本质上是一个分布式的小文件存储系统(Zookeeper=文件系统+监听机制).提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理、统一命名服务、分布式配置管理、分布式消息队列、分布式锁、分布式协调等功能。

2024-01-11 17:10:27 425

原创 手写一个LRU算法

LRU(Least Recently Used)是一种常见的缓存淘汰策略,用于在缓存容量不足时确定要淘汰的缓存项。LRU策略基于一种简单的思想:最近最少使用的项最先被淘汰。

2023-12-27 10:50:27 457

原创 Redis之常用架构

主从复制是简单的备份和读写分离模式,适用于基本的备份需求。哨兵模式在主从架构基础上提供了自动化的故障检测和转移。集群模式适用于处理大规模数据和高并发请求的情况,提供了自动化的分片和负载均衡。每种架构都有其优势和限制,选择合适的架构取决于应用需求、复杂性和可用性要求。在设计Redis架构时,需要根据具体情况综合考虑这些因素,并可能结合多种架构模式来达到最佳的性能、可用性和扩展性。

2023-12-27 10:06:47 1181

原创 Redisson分布式锁实现

Redisson提供了强大的分布式锁功能,强烈推荐!!!上述只是讲述了Redisson的lock()的使用,以及基本的流程闭环.

2023-12-27 10:06:16 445

原创 Mybaits拦截器实现水平分表

*** 表名*//*** 算法策略*/// 需要分表的table的Mapper接口1.Mapper文件问题老系统比较混乱,存在多表关联查询,有些Mapper.xml对象对应的sql不是唯一表。这里需要注意,因为注解是针对整个Mapper文件的,只要是上面的sql都会拦截。但是需要分表的sql都必须要有分表字段。需要避免不分表的sql走策略算法。最好将需要分表的表拆成单表,逻辑在代码里处理。2.分页插件pagehelper导致自定义插件无效。

2023-12-15 12:03:35 972

原创 数据库常用分库分表方案

分库分表是因应数据库处理大规模数据时所面临的挑战而出现的解决方案.数据库瓶颈不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃).分库分表水平分库1.根据容量(当前容量和增长量)评估分库或分表个数 .2.确定分库分表的key,尽量均匀.3.确定分库分表的规则4.迁移数据(一般双写)以上介绍了分库分表的一些理论知识,下一

2023-12-15 11:46:51 546

原创 分布式事务

/ 2PC 小规模系统或需要简单事务处理的场景。不要求高性能和高可用性,可以接受同步阻塞的情况。// 3PC 对于对 2 PC 阻塞问题有所顾虑的场景,可以考虑使用 3 PC。对系统性能和可用性要求不高的一些应用。// TCC 对于需要更精细控制的业务场景,如金融交易、订单支付等。需要高可用和高性能,可以灵活处理事务逻辑的场景。// 事务消息 对分布式事务的一致性要求高,同时需要异步处理的场景。需要可靠消息传递和确保一致性的异步操作。

2023-12-15 11:46:36 360

原创 JDK8 ConcurrentHashMap

这里总结下 JDK 7 和 JDK 8 中的 ConcurrentHashMap的区别// 数据结构JDK7:Segment[] + HashEntry[] + 链表JDK8:Node[] + 链表 + 红黑树// 加锁机制JDK7:使用Segment分段锁,用的ReentrantLockJDK8:使用CAS操作和 synchronized 关键字// 扩容机制JDK7:每个Segment数组在元素达到一定数量时会进行扩容,即每个Segment独立扩容,不涉及整体扩容.

2023-12-06 15:21:46 383

原创 JDK7 ConcurrentHashMap

JDK7 中的 ConcurrentHashMap 通过分段锁和哈希表的组合实现了高效的并发操作。每个 Segment 独立进行操作,通过减小锁的粒度来提高并发性能。下节我们来看JDK8中对ConcurrentHashMap又有哪些改进!!!

2023-12-06 15:19:37 1049

原创 JDK7与JDK8中HashMap的区别

学习了HashMap和中的实现,现在让我们来总结下两者的区别.

2023-12-02 11:00:11 345

原创 JDK8 HashMap

总体而言,JDK8的HashMap在JDK7的基础上进行了优化,引入了树形结构来优化链表的查询效率,提高了元素的检索速度,同时也保持了哈希表的基本特性。总结JDK7和JDK8种HashMap的区别。

2023-12-02 10:58:21 396

原创 JDK7 HashMap

以上便是JDK7 HashMap的底层存储逻辑,后续我们再来研究JDK8的HashMap底层逻辑,比较两者之间的区别.

2023-12-02 10:57:51 383

原创 BlockingQueue

/ 相关总结1.单机场景下,同一时间只能有一个线程来操作BlockingQueue,必须先获取到锁资源ReentrantLock,若没有获取到则进入CLH队列(参考ReentrantLock底层原理)2.put()元素时,若队列满了,则该线程进入条件队列NotFull,阻塞等待唤醒.3.take()元素时,若队列为空,则进入条件队列NotEmpty,阻塞等待唤醒.4.唤醒后的线程,不会立刻执行,需要获取到ReentrantLock才行,所以唤醒后到线程可能会进入CLH队列继续阻塞等待.

2023-11-23 17:52:28 24

原创 ReentrantLock

下图方便理解这里也只是针对简单的情况进行描述,将大致的流程描述出来,过程晕晕的,AQS将太多场景柔和在了一个框架中,只能说大牛真牛。

2023-11-23 16:21:55 20

原创 Synchronized关键字

synchronized是Java中用于实现线程同步的关键字。它提供了一种机制,确保在多线程环境中对共享资源的安全访问。当一个线程获取了对象的锁,其他线程必须等待该线程释放锁才能继续执行,从而保证了对共享资源的互斥访问.

2023-11-17 13:43:57 25

原创 Volatile关键字

总体而言,volatile 是一种简单而有效的多线程编程机制,适用于某些特定场景下,但在一些复合操作的情况下,仍需要考虑其他同步机制。使用 volatile 需要理解它的特性和限制,以确保正确、高效、线程安全的多线程编程。// 1.保证可见性当一个线程修改了一个 volatile 变量的值,这个变化对其他线程是可见的。即,一个线程修改了 volatile 变量后,其他线程能够立即看到这个变化。// 2.禁止指令重排序volatile 变量的读写操作会在指令层面插入内存屏障。

2023-11-17 10:58:43 19

原创 JMM模型

JMM模型即Java内存模型,是一种规范,定义了在多线程环境下,变量的访问规则和线程之间通信的方式。它确保了在不同线程中共享的变量的一致性和可见性。

2023-11-16 16:12:38 26

原创 并发编程之ThreadLocal

线程本地变量.将共享变量放入ThreadLocal,每当一个线程去访问这个变量,就会在自己本地内存里面生成这个变量的副本,从而起到线程隔离的作用,避免并发场景下的线程安全问题。

2023-11-15 11:22:36 17

原创 Thread类常用方法整理

官方说明创建线程有两种方式:继承Thread类或实现Runnable接口。

2023-11-14 10:21:27 20

原创 SpringMVC之请求流程

Spring MVC的请求处理流程是一个复杂但高度可配置的过程,它允许开发者轻松地构建灵活的Web应用程序。通过配置DispatcherServlet、处理器映射器、处理器适配器、视图解析器等组件,可以实现各种复杂的请求处理逻辑。这个流程的强大之处在于,它将不同的处理步骤解耦,使得应用程序易于扩展和维护。

2023-08-28 21:14:50 58

原创 SpringMVC之启动流程

以上便是SpringMVC启动的大致流程了,后面我们再来详细探究它处理请求的流程.

2023-08-23 21:55:43 229

原创 Mybatis之自定义拦截器

首先让我们来创建实现了Interceptor接口的自定义拦截器类.这里我们创建3个@Override// 拦截逻辑@Override// 动态代理@Override// 可以在这里设置配置属性@Override@Override@Override@Override@Override@OverrideMyBatis的拦截器机制为我们提供了灵活的扩展方式,可以在SQL执行的不同阶段插入自定义逻辑。

2023-08-10 22:47:40 624

原创 Mybatis之SQL执行

Mybatis的代码还是比较清晰的,跟着一步一步下来,都能摸清大致的脉络,捋起袖子加油干~~

2023-08-09 21:32:18 722

原创 Mybatis之从配置到执行SQL的全过程

上述大致描述了Mybatis从启动到执行sql的流程, 后面我们再从细节来一一揭开它的面纱~

2023-08-02 23:16:56 92

原创 Mybatis之快速入门

MyBatis是一个优秀的持久层框架,它简化了数据库访问和操作的过程,同时提供了强大的SQL解析和映射功能,使得开发人员可以通过简单的配置来实现复杂的数据库操作。MyBatis是一种ORM(Object Relational Mapping)框架,它能够将关系型数据库中的数据映射成为面向对象的Java对象,从而实现对象与数据库之间的无缝转换。

2023-08-02 23:05:03 26

原创 设计模式之构建者模式

构建者模式是一种强大且灵活的设计模式,可用于构建复杂对象。通过使用构建者模式,我们可以避免在构造函数中传入大量参数,并且能够创建不同表示的对象。在实际项目中,根据需求选择不同的设计模式.

2023-07-27 22:48:11 30

原创 Mysql之Innodb日志机制

本文主要帮助理解客户端执行一条sql语句,Mysql后台的底层逻辑,中间涉及了InnoDB多个日志机制,总结都是为了性能~~

2023-07-21 17:24:27 58

原创 Mysql之MVCC机制

前面已经讲述了Mysql Innodb存储引擎下的事务隔离级别与锁机制,我们知道了Mysql的四种隔离级别,其中最常用的是可重复读(Repeatable Read) 和 读已提交(Read Committed) . RR相比较RC,解决了不可重复读问题,而RC每次都能读到数据行最新的数据. 他们的底层则是通过MVCC机制实现的.MVCC机制MVCC即多版本的并发控制(Multi-Version Concurrency Control).它主要通过undo日志版本链和 ReadView一致性试图实现.

2023-07-19 20:02:30 37

原创 Mysql之事务隔离级别与锁机制

隔离级别决定了事务之间的隔离程度,不同隔离级别对应不同的并发控制方式,可以根据业务需求选择合适的隔离级别。锁机制则是实现隔离级别的具体手段,悲观锁适用于并发写较多的场景,而乐观锁适用于并发写较少的场景。在实际应用中,需要根据业务场景和性能需求选择合适的隔离级别和锁机制,以保证数据的一致性和并发性。

2023-07-17 23:14:16 282 1

原创 Mysql之Explain命令

EXPLAIN是一个关键字,用于分析和解释查询语句的执行计划。日常开发中如果发现慢sql可以结合EXPLAIN来进行索引优化~~

2023-07-13 22:34:55 78 1

原创 Mysql之索引数据结构

说到索引这个词,联系日常生活中我们立刻就会想到书本,每一本书都有它的目录,目录就是索引,它能帮助我们快速锁定书本中的内容。在Mysql中,索引是帮助MySQL高效获取数据的数据结构,能够加快数据库的查询速度,提高数据库的性能。

2023-07-13 21:56:55 76 1

原创 Spring事件发布应用

Spring事件发布是一种基于观察者模式的事件机制,允许不同组件之间通过事件进行松耦合的通信。在这个机制中,有两个主要的参与者:事件发布者和事件监听器。事件发布者负责发布事件,而事件监听器负责监听并处理这些事件。当事件发生时,发布者会通知所有对该事件感兴趣的监听器,从而触发相应的业务逻辑。/*** 创建自定义的异步线程池* 使用@Bean注解将该方法声明为一个Spring Bean,并指定Bean的名称为"asyncExecutor"

2023-07-10 23:33:04 257 1

空空如也

空空如也

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

TA关注的人

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