- 博客(15)
- 收藏
- 关注
原创 Java中的元注解以及自定义注解案例
对某个类中的某个方法前后进行增强,可能有多个类,每个类中可能有多个方法,但需要做到通过注解可以只选指定类中方法这个粒度。
2024-05-12 10:54:50
994
原创 设计模式-动态代理
代理模式(Proxy Pattern)是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个角色:代理角色和真实角色。代理类负责代理真实类,为真实类提供控制访问的功能,真实类则完成具体的业务逻辑。这样,当我们不方便或者不能直接访问真实对象时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。这样理解其实有点抽象,现实生活中举几个例子 :明星宣传。
2024-05-12 10:34:45
1832
原创 Spring中事务的失效场景
spring 要求被代理方法必须是public的。也就是说,如果我们自定义的事务方法(即目标方法),它的访问权限不是public,而是 private、default 或 protected 的话,spring 则不会提供事务功能。
2024-05-12 10:15:10
696
原创 Spring事务中的@Transactional注解中的参数说明
Spring中的事务传播机制用于控制多个事务方法相互调用时事务的行为,复杂的业务场景中,多个事务方法之间的调用可能会导致事务的不一致,比如数据丢失,重复提交等问题,使用事务传播机制可以避免这些问题的发生,保证事务的一致性和完整性。问:一个长的事务方法a,在读写分离的情况下,里面即有读库操作,也有写库的操作,再调用个读库方法b,方法该用什么传播机制呢?在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务。比如两个事务,A调B,挂起A事务,执行B事务,B事务提交或回滚后,恢复A事务执行。
2024-05-12 09:35:05
654
1
原创 Spring中pointcut切入点表达式
的pointcut的表达式类型是很丰富的,但是Spring Aop只支持其中的10种,外加Spring Aop自己扩充的一种一共是。
2024-05-12 08:36:11
1008
原创 Java中异常捕获的原理
当触发异常的字节码的索引值在某个异常表条目的监控范围内,Java 虚拟机会判断所抛出的异常和该条目想要捕获的异常是否匹配。在位置2到4字节码指令执行范围内,如果出现了Exception对象的异常或者子类对象异常,直接跳转到位置7的指令。异常表在编译期生成,存放的是代码中异常的处理信息,包含了异常捕获的生效范围以及异常发生后跳转到的字节码指令位置。2、如果遍历完都不能匹配,说明异常无法在当前方法执行时被捕获,此方法栈帧直接弹出,在上一层的栈帧中进行异常捕获的查询。跳转PC:异常捕获之后,跳转到的字节码位置。
2024-04-22 17:07:25
348
1
原创 JVM中JIT即时编译器的学习
在Java中,JIT即时编译器是一项用来提升应用程序代码执行效率的技术。字节码指令被 Java 虚拟机解释执行,如果有一些指令执行频率高,称之为热点代码,这些字节码指令则被JIT即时编译器编译成机器码同时进行一些优化,最后保存在内存中,将来执行时直接读取就可以运行在计算机硬件上了。在HotSpot中,有三款即时编译器,C1、C2和Graal,其中Graal在jdk10才出现,长期的目标为代替C2 , 这里只说C1和C2C1编译效率比C2快,但是优化效果不如C2。
2024-04-22 16:53:54
1048
4
原创 jvm中跨代引用相关问题
**应用了写屏障之后 , 虚拟机就会为所有赋值操作生成相应的指令 , 一旦收集器在写屏障中增加了更新卡表的操作,无论更新的是不是老年代对新生代对象的引用 , 每次只要对引用进行更新 , 就会产生额外的开销 , 不过这个开销和YoungGC时扫描整个老年代的代价相比还是低得多的 ** 记忆集是一种用于记录从非收集区域指向收集区域的指针集合的抽象数据结构。卡表最简单的形式可以只是一个字节数组,它记录了记忆集的记录的精度 , 与堆内存的映射关系等等 , 而HotSpot虚拟机确实也是这样做的。
2024-04-10 23:16:46
808
1
原创 深入学习理解java虚拟机
类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术,类加载器只参与加载过程中的字节码获取并加载到内存这一部分。 类加载器会通过二进制流的方式获取到字节码文件的内容,接下来将获取到的数据交给Java虚拟机,虚拟机会在方法区和堆上生成对应的对象保存字节码信息。ClassLoader中包含了4个核心方法,双亲委派机制的核心代码就位于loadClass方法中。//类加载的入口,提供了双亲委派机制。内部会调用findClass 重要。
2024-04-10 23:09:07
616
1
原创 Idea中编译错误 internal java compiler error (启动失败)
这三步都检查完以后可以重新运行一下,大部分情况都能成功。中的jdk版本是否统一。
2024-04-01 22:50:16
2789
1
原创 jdk线程池底层原理(包含手写简单线程池代码以及jdk源码详细注释)
线程池是什么 线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程并不会被销毁,而是仍然在线程池中等待下一个任务。使用线程池的好处降低资源消耗:通过重复利用现有的线程来执行任务,避免多次创建和销毁线程提高响应速度:因为省去了创建线程这个步骤,所以在拿到任务时,可以立刻开始执行提供附加功能:线程池的可拓展性使得我们可以自己加入新的功能,比如说定时、延时来执行某些线程提高线程的可管理性:线程是稀缺资源,如果无限制的创建,不仅会消耗系统
2024-04-01 22:45:03
751
原创 java中的队列 (阻塞队列)
线程1往阻塞队列中添加元素,而线程2从阻塞队列中移除元素当阻塞队列是空是,从队列中获取元素的操作会被阻塞当阻塞队列是满时,从队列中添加元素的操作会被阻塞试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素试图从已满的阻塞队列中添加新元素的线程同样会被阻塞,直到其他的线程从列中移除一个或者多个元素或者完全清空队列后使队列重新变得空闲起来并后续新增阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。
2024-03-30 16:29:14
2033
2
原创 jdk1.7及1.8 hashMap,concurrentHashMap超详细源码剖析(附带自己理解注释)
java集合jdk 1.7HashMap内部属性public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable{ // 模拟初始容量,必须是2的幂 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 //最大容量
2024-03-26 20:08:38
871
4
原创 静态代理模式
为什么要学习代理模式? 因为这就是SpringAOP的底层! [SpringAOP和SpringMVC]代理模式的分类: 静态代理 动态代理 10.1 静态代理角色分析: 抽象角色 : 一般会使用接口或者抽象类来解决 真实角色 : 被代理的角色 代理角色 : 代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户 : 访问代理对象的人! 没有代理时:抽象角色:租房真实角色:房东客户:租房的人代理时.
2022-03-11 14:05:08
353
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人