自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(326)
  • 资源 (1)
  • 收藏
  • 关注

原创 springboot 提供的可扩展接口

Spring框架提供了全面的基础架构支持。包含依赖注入和开箱即用等模块,如:Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring TestSpring Boot 约定大于配置-----消除了设置Spring应用程序所需的XML配置1:创建独立的spring应用。2:嵌入Tomcat, Jetty Undertow 而且不需要部署他们。3:提供的“starters” poms来简化Maven配置4:尽可能自动配置

2025-06-22 18:29:30 1029 1

原创 启动报错 java.lang.ClassNotFoundException: org.springframework.core.metrics.ApplicationStartup

原因:pom依赖冲突。

2025-06-15 22:16:18 130

原创 AOP +ThreadLocal实现对接口监控

ThreadLocal:实现线程范围内的局部变量,即ThreadLocal在一个线程中是共享的,在不同线程之间是隔离的。AOP:面向切面编程(

2025-06-15 22:11:42 287

原创 自定义注解

interface 关键字定义一个自己的注解。自动继承了java.lang.annotation.Annotation接口。

2025-06-15 21:45:50 268

原创 springboot项目启动报错:spring boot application in default package

1.使用@CompentScan 和@EnableAutoConfiguration注解。springboot的启动方法不能直接在java目录下。2.启动类放在java目录下的package目录下。

2025-06-15 21:38:01 334

原创 Spring AOP

AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。AOP的实现原理是动态代理,动态代理可以由Jdk动态代理或者Cglib动态代理实现,调用需要增强的方法,实际上是调用了代理类的方法,由代理类执行业务逻辑。CGLIB 代理不需要实现接口,对目标对象进行继承并重写其中的方法,从而实现对方法的调用拦截。将切面应用到目标对象来创建新的代理对象的过程。

2025-06-15 20:07:53 762

原创 java代理

创建的每一个代理实例都要有一个关联的InvocationHandler,并且在调用代理实例的方法时,会被转到InvocationHandler的invoke方法(处理代理实例上的方法调用并返回结果)上。Proxy类的一个静态内部类,该类用于生成代理类。使用泛型实现InvocationHandler。创建一个代理对象来控制对原始对象的访问。一是保护目标对象,二是增强目标对象。JDK代理只能代理接口不能代理类。

2025-06-15 18:29:42 602

原创 动态规划练习第一天

动态规划:优化方向:空间优化,关注前两个值即可,用两个变量代替。

2024-03-19 22:00:32 804

原创 分区表介绍

优化查询:特定查询场景下,分区表拆分可以显著提高查询效率,如特定的日期范围查询、根据某个分区键值排序、查找特定某个分区,均可借助MySQL分区表的方式优化查询效率。查询数据:在查询分区表时,MySQL会根据查询条件中的分区键值范围定位到对应的分区,然后只扫描该分区中的数据,避免无关分区数据的扫描访问,大幅降低查询数据开销。根据转换前的原表的写入时间点,更新分区表的分区定义。通过分区剪枝,优化器会生成一个优化的执行计划,只对涉及的分区进行扫描,从而减少了查询的数据量和处理的开销,提高了查询的性能。

2024-02-27 21:51:12 1013

原创 Spring Cloud笔记---客户端负载均衡 spring cloud ribbon

一个被@LoadBalanced注解修饰的RestTemplate对象向外发起http请求,会被LoadBalancerInterceptor类的intercept函数所拦截。@LoadBalanced注解用来给RestTemplate做标记,以使用负载均衡的客户端来配置它。LoadBalancerAutoConfiguration:为实现客户端负载均衡器的自动化配置类。LoadBalancerClient所属包loadbalancer中的接口/类。自动化配置类中,主要流程。IRule接口的各个实现。

2023-10-19 00:03:20 457

原创 spring cloud笔记--微服务基础

微服务主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进行通信协作,被拆分成的每个小型服务都围绕着系统中的某一项或一些耦合度较高的业务功能进行构建,并每个服务都维护着自身的数据存储,业务开发,自动化测试案例及独立部署机制。单体系统初期可以非常方便的开发和使用,但随着系统的发展,维护成本会变得越来越大,且难以控制。多环境配置:通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包。

2023-10-15 21:07:59 492 1

原创 spring Cloud笔记--服务治理Eureka

eureka客户端在向服务注册中心发送注册请求时,用来描述自身服务信息的对象,其中包含一些标准化的元数据,比如服务名称,实例名称,实例端口等用于服务治理的重要信息,以及负载均衡策略或是其他特殊用途的自定义元数据信息。注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka server还活着,以防剔除任务将该服务实例从服务列表中排除出去,称为服务续约。使用Netflix eureka实现服务注册与发现,包含服务端组件,客户端组件,主要适用于通过java实现的分布式系统。

2023-10-15 21:04:28 815

原创 数据库锁及批量更新死锁处理

按照加锁规则,会加上 (0,5] ,(5,10] ,(10,15],因为 k = 10 等值查询,最后一条记录是 k = 15,所以退化成 (10,15),最终加的Next key-Lock 是 (0,5] ,(5,10] , (10,15)我们看索引 k 的结构,事务A 加的间隙锁应该是 ((0,0)(5,5)),((5,5)(15,5)),((15,5)(10,10)) 三个间隙锁,事务B 更新操作相当于插入一条(10,0) 的记录,此时需要在间隙锁中插入记录 ((0,0)(3)(25, 30];

2023-09-21 20:36:16 1012

原创 分布式锁实现方法

流程:开始事务–>获取锁–>判断父节点是否存在–>不存在创建父节点–>创建临时有序节点–>获取锁判断自身是否为序号最小节点—>是最小节点,获取锁成功,—>不是最小节点,监控比本节点序号-1的节点,阻塞等待节点删除通知 -->收到前置节点删除通知–>回到获取锁判断是不是为序号最小的节点。结果:会在根节点下为每一个等待获取锁的线程创建一个对应的临时有序节点,序号最小的节点会持有锁,并且后一个节点只监听其前面的一个节点,从而可以让获取锁的过程有序且高效。让获取锁的线程产生排队,后一个监听前一个,依次排序。

2023-09-21 20:34:12 304

原创 JVM-环境准备&性能指标&基础知识

环境准备&性能指标&基础知识。

2023-09-21 20:32:54 481

原创 JVM-环境准备&性能指标&基础知识

环境准备&性能指标&基础知识。

2023-09-21 20:32:13 532

原创 JVM-Java字节码技术笔记

前面的数字:间隔不相等的原因是, 有一部分操作码会附带有操作数, 也会占用字节码数组中的空间。, 用来调用构造函数,也可以用于调用同一个类中的 private 方法, 以及可见的超类方法。指令,JVM 就确切地知道要调用的是哪个方法:因为调用的是静态方法,只能属于一个类。时, 查找的数量也很少, 解析也更加容易, 那么运行时就能更快地找到所需的方法。,如果是具体类型的目标对象,用于调用公共,受保护和打包私有方法。,用于调用某个类的静态方法,这也是方法调用指令中最快的一个。其他的所有操作均使用栈来执行。

2023-09-21 20:30:54 338

原创 JVM--Java类加载器笔记

static {");try {// 加载并初始化Hello类@Override两个没有关系的自定义类加载器之间加载的类是不共享的(只共享父类加载器,兄弟之间不共享),这样就可以实现不同的类型沙箱的隔离性可以用多个类加载器,各自加载同一个类的不同版本,在这个基础上可以实现类的动态加载卸载,热插拔的插件机制等。

2023-09-21 20:27:52 510

原创 并发-生产者消费者、线上问题定位、性能测试、异步任务池

需求:申请一个专门用来收集分享邮件的邮箱,分享文章发送到这个邮箱,将邮箱地址放在部门邮件列表里,分享人只需向整个部门分享,工具读取邮件服务器里该邮箱的邮件,把分享邮件下载,要求分享的邮件标题必须带关键字,把文件插入到confluence里,工具还可以把文章进行 分类和归档。线程池就是一种生产者和消费者模式的实现方式,生产者把任务丢给线程池,线程池创建线程并处理任务,如果将要运行的任务数大于线程池的基本线程数就把任务扔到阻塞队里。

2023-09-13 21:52:28 167

原创 并发-Executor框架笔记

Java线程被一对一映射为本地操作系统线程java线程启动会创建一个本地操作系统线程java线程终止操作系统线程也会被回收操作系统会调度所有线程并将它们分配给可用的cpu在上层,java多线程程序通常把应用分解为若干任务,然后使用用户级调度器将这些任务映射为固定数量的线程。在底层,操作系统内核将这些线程映射到硬件处理器上应用通过Executor框架控制上层调度,下层由操作系统内核控制,下层调度不受应用程序控制。

2023-09-10 22:30:16 306

原创 ThreadLocal

作用:实现线程范围内的局部变量,即ThreadLocal在一个线程中是共享的,在不同线程之间是隔离的。原理:ThreadLocal存入值时使用当前ThreadLocal实例作为key,存入当前线程对象中的Map中去。一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的(每个线程都只能看到自己线程的值)线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。ThreadLocal是当前线程独有的变量。

2023-09-06 22:09:33 441

原创 多线程按顺序打印abc

【代码】多线程按顺序打印abc。

2023-09-06 22:03:52 191

原创 并发-Java中的并发工具类

可循环使用的屏障,让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。默认的构造方法CyclicBarrier(int parties)参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier已经到达屏障,然后当前线程被阻塞。一下代碼输入为1,2, 或2,1 如果数量为3,则主线程和子线程会永远等待,没有输出,因为没有第三个执行await方法。

2023-09-06 22:03:11 175

原创 并发-Java中的线程池

Java中的线程池。

2023-09-06 22:01:23 135

原创 并发-Java中的13个原子操作类

多线程更新一个变量时,可能会线程不安全,java.util.concurrent.atomic包。Atomic包里一共提供了13个类,属于4中类型的原子更新方式 原子更新基本类型类,原子更新数组,原子更新引用类型和原子更新字段类。Atomic包里的类基本都是使用unsafe实现的包装类。

2023-09-05 23:16:08 152

原创 并发-Java并发容器和框架(一)ConcurrentHashMap,ConcurrentLinkedQueue

concurrentHashMap初始化方法通过initialCapacity,loadFactor,concurrencyLevel等几个参数来初始化segment数组、段偏移量segmentShift,段掩码segmentMask和每个segment里的HashEntry数组来实现的。HashMap可能导致程序死循环,使用线程安全的hashtable效率低下。主要为get,put,size操作。线程安全且高效的hashmap。

2023-09-05 22:32:51 183

原创 并发-Java并发容器和框架(二)Java中的阻塞队列,Fork/Join框架

一个支持两个附加操作的队列,两个附加的操作支持阻塞的插入和移除方法支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满支持阻塞的移除方法:在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列就是生产者用来存放元素,消费者用来获取元素的容器阻塞队列不可用时,两个附加操作提供四种处理方式抛出异常:当队列满时,如果再往队列里插入元素,会抛出IllegalStateException("Queue full“)异常。

2023-09-05 21:53:08 192

原创 并发-Java中的锁(四)---LockSupport工具,Condition

示例:通过有界队列了解Condition使用方式,有界队列是一种特殊的队列,当队列为空时,队列的获取操作将会阻塞获取线程,直到队列中有新增元素,当队列已满时,队列的插入操作将会在阻塞插入线程,直到队列出现空位。调用await方法,当前线程会释放锁并在此等待,其他线程调用Condition对象的signal方法,通知当前线程后,当前线程从await方法返回,并在返回之前已经获取了锁。如果当前等待线程从await方法返回,那么表明该线程已经获取了condition对象锁对应的锁。

2023-09-04 21:39:37 163

原创 并发-Java中的锁(三)---读写锁ReentrantReadWriteLock

示例:当数据发生变更后,update变量被设置为false,此时所有访问processData方法的线程都能感知到变化,但只有一个线程能够获取到写锁,其他线程会被阻塞在读锁he写锁的lock()方法上,当前线程获取写锁完成数据准备之后,在获取读锁,随后释放写锁,完成锁降级。为了保证数据可见性,锁降级中读锁的获取是必要的, ReentrantReadWriteLock不支持锁升级。锁降级:写锁降级为读锁,是指把持住(当前拥有的)写锁,再次获取到读锁,所有释放(先前拥有的)写锁的过程。

2023-09-03 21:55:00 163

原创 并发-Java中的锁(二)--- 重入锁ReentrantLock,公平锁,非公平锁笔记

参考:Java并发编程的艺术。

2023-09-03 16:52:52 452

原创 并发-Java中的锁---Lock接口、队列同步器AQS笔记

确定访问模式:能同一时刻支持多个线程访问是共享式访问,需要使用同步器提供的acquireShared方法和shared相关的方法,TwinsLock要重写tryAcquireShared和tryReleaseShared方法,这样保证同步器共享式同步状态的获取与释放方法得以执行。定义资源数:同一时刻允许最多两个线程同时访问,表明同步资源数为2,这样设置初始状态status为2,当线程获取,status减1,线程释放,加1,状态合法范围0(表示当前已经有两个线程获取了同步资源,再有其他获取,阻塞),1,2。

2023-09-03 15:11:11 319

原创 缓存和分布式锁笔记

redis获取锁:setnxex(“lock”,uuid,10s) -->获取到锁->执行业务->如果当前锁的值是之前的uuid的锁–>删除锁->结束,未获取到锁的等待重试。某个线程已经获得某个锁,可以再次获取锁而不会出现死锁,再次获取锁的时候会判断当前线程是否是已经加锁的线程,如果是对锁的次数+1,释放锁的时候加了几次锁,就需要释放几次锁。redis获取锁:setnxex(“lock”,1111,10s) -->获取到锁->执行业务->删除锁->结束,未获取到锁的等待重试。更难的事情,锁的自动续期。

2023-09-02 14:14:34 587

原创 并发-线程

线程池预先创建了若干数量的线程,不能由用户直接对线程的创建进行控制,重复使用固定或较为股多功能数目的线程来完成任务的执行,好处是消除了频繁创建和消亡线程的系统资源的开销,面对过量任务的提交能够平缓的劣化。操作系统基本采用时分的形式调度运行的线程,线程分配到若干时间片,当线程的时间片用完了会发生咸亨调度,等待下次分配,线程优先级决定线程需要多或者少分配一些处理器资源的线程属性。调用start()方法启动线程:当前线程同步告知虚拟机,只要线程规划器空闲,应立即启动调用start()方法的线程。

2023-09-02 14:05:29 163

原创 rabbitmq笔记-rabbitmq进阶-数据可靠性,rabbitmq高级特性

rabbitmq队列拥有多个消费者时,队列收到的消息将以轮询的分发方式发送给消费者,每条消息只会发送给订阅列表里的一个消费者。问题:如果某些空闲,某些忙碌造成整体下降方法:channel.basicQos方法允许限制信道上的消费者所能保持的最大未确认消息的数量。如果达到上限,就不会向这个消费者再发送任何消息,知道消费者确认了某条消息后,相应计数减1,之后消费者可以继续接受消息。

2023-08-28 23:55:39 966 1

原创 rabbitmq笔记-rabbitmq客户端开发使用

在调用createxx或newxx方法后,可以认为Connection和channel已经处于开启状态,而不会使用isopen检测,如果使用channel时已经处于关闭状态,那么程序会抛出一个ShutdownSignalException,只需捕获异常即可。当调用与Consumer相关的api方法时,不同的订阅采用不同的消费者标签来区分彼此,在同一个channel中的消费者也需要通过唯一的消费者标签作区分。实际业务中,需要对所创建的队列的流量、内存占用及网卡占用有一个清晰的认知,预估其平均值和峰值。

2023-08-27 13:24:06 898

原创 RabbitMQ笔记-RabbitMQ基本术语

RabbitMQ就是AMQP协议的Erlang实现,RabbitMQ是AMQP协议的erlang实现,AMQP的模型架构也是:生产者将消息发送给交换器,交换器和队列绑定,当生产者发送消息时所携带的RoutingKey与绑定时的BindingKey相匹配时,消息被存入相应队列中,消费者可以订阅相应的队列来获取消息。消息只能存在队列中。:生产者将消息发送到Exchange,由交换器将消息路由到一个或多个队列中,如果路由不到,或许会返回给生产者,或许直接丢弃。消息路由过程中,消息的标签会丢弃,消息体存入队列。

2023-08-23 23:26:12 1213 1

原创 并发-并发挑战及底层实现原理笔记

synchronized用的锁是存在java对象头里的,如果对象是数组类型,虚拟机用3个字宽存储对象头,如果对象是非数组类型,用2字宽存储对象头。使用处理器提供的Lock#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。当锁处于重量级,其他线程试图获取锁时,会被阻塞,当持有锁的线程释放锁后会唤醒这些线程,被唤醒的线程会进行新一轮的夺锁之争。**偏向锁撤销:**等到竞争出现才释放锁的机制,当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁。

2023-08-20 19:16:59 334

原创 Redis学习笔记

redis事务是一个单独的隔离操作,事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。主要作用:串联多个命令防止别的命令插队。在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是键快照文件直接读到内存里。在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是键快照文件直接读到内存里。

2023-08-19 13:19:48 842

原创 消息队列学习笔记

RPC 框架对外提供的所有服务定义在一个接口 RpcAccessPoint 中/*** RPC 框架对外提供的服务接口*//*** 客户端使用:客户端获取远程服务的引用* @param uri 远程服务地址* @param serviceClass 服务的接口类的 Class* @param 服务接口的类型* @return 远程服务引用*//*** 服务端使用:服务端注册服务的实现实例* @param service 实现实例。

2023-08-16 20:48:09 1405

原创 Java并发总结

一个线程完成任务会从队列中取下一个任务来执行,一个线程没有任务执行,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于corePoolSize,线程会被停掉,所有线程池的所有任务完成后,最终会收缩到corePoolSize的大小。线程本地变量:如果创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地拷贝,多个线程操作这个变量的时候,实际是操作自己本地内存里面的变量,从而起到线程隔离的作用,避免了线程安全问题。有的线程优先把自己负责的。

2023-08-07 22:24:16 207

用故事给技术加点料 111.zip

用故事给技术加点料 111.zip

2024-11-24

二叉树高频考题完整源码(包含测试树)

二叉树高频考题,完整,包含测试树,求二叉树深度

2019-05-03

空空如也

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

TA关注的人

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