自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 正向代理和反向代理

正向代理是指客户端通过代理服务器来访问目标服务器,目标服务器不知道真正的客户端是谁,只知道请求来自于代理服务器。正向代理可以隐藏客户端的真实身份,让客户端访问一些原本无法访问的资源,比如Google、YouTube等。

2024-10-02 11:38:45 234

原创 @TableField(typeHandler = FastjsonTypeHandler.class)失效。mybatisPlus的xml文件执行sql后获取的对象中需要转换的字段为null

原本是写resultType的,如下图,结果返回的数据extendMessage为null。改成resultMap并指定typeHandler就有返回结果了。

2024-09-27 17:32:03 197

原创 JVM、JRE、JDK关系。HotSpot。JVM规范

JVM规范(Java Virtual Machine Specification)是由Oracle(或其前身Sun Microsystems)制定并发布的,它详细定义了JVM的行为、功能和要求,为JVM的实现者提供了一个公共的、标准化的视图。通过遵循JVM规范,不同的JVM实现可以在不同的操作系统和硬件平台上运行相同的Java程序,而无需对程序本身进行修改。HotSpot是JVM的一种实现。:规定了JVM能够识别的字节码指令集,这些指令是Java程序编译后的产物,JVM通过执行这些指令来运行Java程序。

2024-09-27 14:47:33 815

原创 ClassLoader中各个字段意思

这种机制对于确保类的静态初始化块(static initialization blocks)和静态字段的初始化在多线程环境中只执行一次是非常重要的。在Java的安全模型中,类加载器在加载类时可能会验证这些类是否由受信任的证书签名,以确保它们没有被篡改。(类加载器)是JVM(Java虚拟机)中一个非常重要的组件,它主要负责将Java类文件(.class文件)加载到JVM的内存中,并对其进行验证、准备、解析和初始化。中的字段就是为了支持将Java类加载到内存中并使其可用的。class就是class类。

2024-09-13 10:25:17 282

原创 源码到class字节码的编译流程 & 字节码到内存的Java类加载流程

Java类的加载流程是一个复杂但有序的过程,它确保了类文件能够被正确地加载到Java虚拟机(JVM)中,并被正确地初始化和使用。

2024-09-13 09:53:23 466

原创 kafka随笔记

需要保证有顺序的消息进入到一个分区中(这个用key来保证),要保证同一个分区中的消息是有序的(链表,新来的放后面就是了),同一个分区中的消息是顺序被消费的(分区分配与offset来保证)。

2024-08-22 16:26:14 810

原创 redis随笔记

缓存穿透。key不存在。恶意攻击、代码问题。加布隆过滤器,或者为空就返回。缓存失效(击穿)。key刚好过期。缓存时间随机数。缓存雪崩。缓存层宕机,一下子袭击数据库。缓存高可用、限流熔断、提前演练。 布隆过滤器就是一个key通过多个hash计算到多个数组所在位置,每个位置设为1,如果来了一个key,通过多个hash计算,如果所有位置都为1,过关,但只要有一个位置不为1,不过关。 nx的意思是,如果不存Key,则set,否则返回false。常有用于锁,资源只能被一次只能被一个客户端使用redis.set(Key

2024-08-20 17:21:43 581

原创 RocketMQ简介

消费者会启动一个后台线程,不断地从Broker拉取消息,并放入到本地的队列中。消费者通过长轮询(Long Polling)机制来优化轮询效率和新消息的实时性。在没有新消息可拉取时,Broker会挂起消费者的请求,并在有新消息到达时立即返回给消费者,或者在请求超时后返回空结果。

2024-08-20 15:36:40 871

原创 ShardingSphere、雪花算法、分布式id生成器CosID概述

sharding是分片的意思,sphere是球(生态的意思)。用来做分库分表的生态的。一个订单表太大,查询会很慢,要分表,分为3个表,这样查询会快一点,所以有了分库分表。对sql语句进行拦截,然后根据分库分表算法路由到具体的表,如order表的sql语句,拦截,根据orderId取模3位,路由到order1、order2、oder3表上。还支持分布式、事务等。shardingSphere路由的时候会给数据生成全局唯一cid,这里涉及分布式id生成器,ShardingSphere一般用的是雪花算法。

2024-08-19 10:31:07 367

原创 并发容器CouncurrentHashMap、CopyOnWriteArrayList、ConcurrentSkipListSet。锁方式:synchronized和lock(AQS)。无锁cas。

java的锁两种底层逻辑——synchronized关键字和lock接口。synchronized底层是jvm层面,lock底层是AQS,是java层面。还有就是不上锁,cas。用synchronized来实现的是vector和hashTable。

2024-08-12 11:46:43 796

原创 并发要解决原子性、可见性、有序性问题,volatile原理、内存屏障

原子性:要么做,要么都不做。并发中,可能会出现++,但实际没加上的情况可见性:一个线程要看到其他线程修改的最新值。并发中,jmm主内存工作内存之分,所以看到的不是其他内存最新值,导致逻辑代码失效。有序性:按照代码书写顺序执行。编译器会指令重排,并发中,会导致逻辑代码失效,如new 对象。

2024-08-09 18:33:02 540

原创 ReentrantLock的阻塞性、可中断性

在上面代码的基础上,lock换成lockInterruptibly,加了个t3线程(对t2进行中断操作)

2024-08-05 20:58:53 448

原创 Spring事务原理、Spring事务传播机制

EnableTransactionManagement 会像spring容器中注入一个InfrastructureAdvisorAutoProxyCreator,这是一个,我前文中有说到BeanPostProcessor是一个初始化后会执行的接口。所以bean实例化、依赖注入、初始化、然后会进行,即走BeanPostProcessor的实现,实现中是aop的内容。会去看这个bean是否是advisor切面,找是否有@Transactional,如果有,那就创建代理对象,这就是aop的实现。

2024-07-17 11:57:44 640

原创 Spring的AOP

面向切面编程是一种思想,动态代理是面向切面编程的一种实现方式。AOP是OOP(面向对象编程)的延续。父子类,用cglib动态代理。接口,用jdk的动态代理。Spring,用proxyFactory,整合了上面两种,父子类回去用cglib,接口类会去用jdk的动态代理。Spring多用注解,注解spring使用AspectJ的注解,但实现是自己实现的,aspectj是在编译的时候把代理的内容直接在字节码文件中生成,spring不是,spring是在运行中用自己的实现方式弄的。

2024-07-15 22:33:37 767

原创 Spring的启动流程refresh方法、配置类解析流程@Component、@Configuration、@Import、@Bean

refresh方法,作用就是实例化spring容器中的所有单例。1、先有beanDefinition类信息,再有bean对象。2、在beanDefinition和bean前后spring有增加拓展点,拓展点统一用PostProcessor封装。

2024-07-12 17:40:38 1237

原创 Spring依赖注入、循环依赖——三级缓存

实例化对象后,需要设置字段,即依赖注入,两种:set方法注入和构造方法注入。先寻找整个类的注入点,就是打了@autowired的字段或方法,然后根据类型、名称去找@Inject@Resource@Autowired来自spring。

2024-07-11 19:24:12 1158

原创 Spring的bean的生命周期——bean的创建与销毁

aop:如果有aop则创建的bean是代理对象,执行流程是userService.test() --> aop切面逻辑如@before--> target.test()。aop流程:找所有的切面类@Aspect、找切面中所有的pointCut,如@before@after等,看当前要创建的bean是否是pointCut需要的,是就创建代理对象。创建出来的bean如果是单例,放到map中,key是bean名称,value是bean对象。从类信息map中获取beanDefinition,并加载类。

2024-07-10 23:31:22 874

原创 网络通信、BIO、NIO

操作系统提供的api,介于应用层和tcp/ip层之间的软件层,封装服务器客户端之间网络通信相关内容,方便调用(I/O Multiplexing)是一种IO操作模式,它允许单个进程或线程同时处理多个输入输出(IO)操作。tcp层中,客户端ip、客户端端口、服务器ip、服务器端口,这4个算一个连接。3步:接收连接、读取数据、写入数据服务器端接收连接、服务器端读取客户端发来的数据、服务器端写入客户端发来的数据并进行业务处理。1、客户端a与服务器b通信,a的数据到达b的操作系统的socket的缓冲区中。

2024-07-09 11:43:38 1281

原创 tomcat原理、结构、设计模式

一种web服务器,运行java servlet、jsp技术,能为java web提供运行环境并通过http协议处理客户端请求。即tomcat = http服务器+ servlet容器。同类产品有jetty。

2024-07-05 16:53:26 1115

原创 java父子类继承,有同一个字段,编译与运行时获取的是啥

字段获取的是父类,方法获取的是子类。这是因为字段和对象一起存的,是静态绑定,直接获取,所以不必走运行时类型;而方法代码没有和对象一起存,而是存在对象的类文件的方法区,是动态绑定的,所以走运行时类型。

2024-07-01 19:05:20 354

原创 redo log和undo log都用于恢复,区别是啥

redo log是InnoDB特有的,记录物理级别的数据页变更,用于崩溃恢复和保证事务的持久性。binlog是MySQL Server层实现的,记录逻辑级别的SQL语句,用于数据库的主从复制、增量恢复以及审计等目的。

2024-06-26 23:06:05 865

原创 字符串常量池。String、Integer的对象池。

要区分两种,一种是直接“sss”,这种存在常量池中,一种是new String(“sss”)对象,这种是新的对象,是一个新的地址值,但是这个对象会指向“sss”常量池中的地址。String和基础类型(Byte,Short,Integer,Long,Character,Boolean,小于127,浮点型没有)都有池子。字符串常量池在堆中!

2024-06-25 11:55:26 317

原创 java内存、对象创建、回收流程

堆-Xms:默认四分之一的内存(4G物理内存就是1G)。其中新生代和老年代1:2。新生代中,eden和survior from、survior to 是8:1:1。栈-Xss:默认512k-1024k。方法区-XX:MetaspaceSize:默认21M(64位windows),最大值-1(不设上限)。jvm会自动调整。

2024-06-24 23:10:19 854

原创 计数单位:KB、MB、GB、TB、PB、比特率 和 千thousand、百万million、十亿billion、万亿trillion之间的关系

对应千、百万、十亿、万亿。

2024-06-24 14:42:10 575

原创 类加载:类加载器、双亲委派机制、tomcat打破双亲委派、类加载顺序

main方法,需要用到类的时候才加载(new等,申明变量不加载),如果类未加载则加载类。

2024-06-21 18:53:28 503

原创 mysql、innodb的事务acid、隔离级别、mvcc、读写锁、redo log、undo log

解决方法:加排他锁 、read uncommited 读未提交。解决办法:read commited 读已经提交解决办法:repeatable read 可重复读,生成快照。解决办法:serializable 串行,读加读锁。2、3、4都是侧重于读取方面的需求,1是侧重于更新(写)方面的需求。

2024-06-14 19:03:03 306

原创 枚举的序列化反序列化工具、数据库工具:@JsonValue、@JsonCreator、@EnumValue(同IEnum<String>)JSON parse error: Cannot deseri

---------------------------------------------------插播小知识------------------------------------------------序列化为json,java对象->jsonjson->java对象----------------------------------------------------回到正轨------------------------------------------------解决方案。

2024-06-12 14:58:50 962

原创 mysql中join连接底层原理——嵌套循环算法、哈希算法:NLJ、INLJ、BNLJ、hash join。笛卡尔积。

外表a有r行,内表b有s行,join条件a.id = b.aid。

2024-06-05 17:45:14 972

原创 线程简述:协程、抢占式、sleep、wait、interrupt,优雅中断线程,线程通信等

java线程绑定jvm的线程(JVM Java Thread),jvm线程绑定操作系统的线程(OS Thread)。如果线程在调用其他可中断的阻塞方法时检测到中断,它应该清除自己的中断状态,并设置被调用线程的中断状态,以便后者也能响应中断。(注意:wait()是Object的方法,释放时间片,释放锁。线程的切换由线程控制。B里操作管道变量,A里的管道变量会跟着变,这就实现了AB两个线程的通信,变量共享了,和volatile有点像。:释放时间片(马上停止线程),后面的代码不执行,不优雅,不推荐使用。

2024-05-30 14:28:04 1021

原创 java 线程 简述

这是之前总结的脑图,希望对大家又帮助~

2024-05-29 15:10:40 340

原创 request is not active anymore主线程退出request失效,异步线程getAttribute报错。重写RequestAttribute或更改范围为ScopeSession

注意:这里需要自己记录下成员变量attributes。当然你也可以记录header,但header也可以不记录,因为header用源代码的getHeader方法获取没有报错。注意!!!这里需要重写getAttribute方法。这样就可以不用走147行的判断,就不会报错了!!

2024-05-28 19:10:46 941

原创 上游服务feign调用下游服务报超时错误RetryableException/SocketTimeoutException,虽然上游服务停止了,但下游服务还在运行。

a服务http/feign调用b服务接口,b服务接口运行时间超过1min,导致a服务超时错误,如下。虽然a服务报错线程退出了,但是b服务还在继续运行。所以a服务不会影响b服务,但是b服务会影响a服务。

2024-05-28 11:04:26 557

原创 文本匹配字段,split快还是正则表达式快

而且split的计算不一定准确,如果“【名称】”不在开头,还需要将length减1,正则的就比较准确。两种方法,一种是用String的split,另一种是用正则表达式。输出是目标字段出现30000次,时间是10ms。需要统计一段文本中“【名称】”出现的次数。

2024-05-23 09:59:53 385

原创 undo和redo日志

原先A=1。现在做更新操作A=3。

2024-05-15 21:30:04 355

空空如也

空空如也

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

TA关注的人

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