05 2023 档案

摘要:Spring事务传播机制是指多个包含事务的方法相互调用时该遵循的规则。 实现方式 事务传播机制是通过 TransactionInterceptor 拦截器来实现的。TransactionInterceptor 是一个AOP拦截器,它拦截方法调用,并在方法调用之前和之后启动和提交事务。 当使用 Spr 阅读全文
posted @ 2023-05-29 15:52 程序员_YHB 阅读(26) 评论(0) 推荐(0) 编辑
摘要:在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个 注解是对三个注解进行了封装,分别是: @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan 其中 @EnableAutoC 阅读全文
posted @ 2023-05-29 13:27 程序员_YHB 阅读(3) 评论(0) 推荐(0) 编辑
摘要:SpringMVC有四大组件: (1)前端控制器(DispatcherServlet) (2)处理器映射器(HandlerMapping) (3)处理器适配器(HandlerAdapter) (4)视图解析器(ViewReslover) 执行流程: (1)前端发送请求到前端控制器(Dispatche 阅读全文
posted @ 2023-05-29 13:05 程序员_YHB 阅读(13) 评论(0) 推荐(0) 编辑
摘要:Spring事务有两种实现方式: (1)编程式事务:自己手动控制开启事务、提交事务、回滚事务。 优点:编程式事务可以根据业务逻辑和数据操作的复杂度进行灵活的控制和处理,保证数据的一致性和完整性; 使用编程式事务时,可以控制每个事务的大小和影响范围,因此在大型系统需求变化频繁的情况下很有用,能够更方便 阅读全文
posted @ 2023-05-29 12:54 程序员_YHB 阅读(212) 评论(0) 推荐(0) 编辑
摘要:循环依赖:两个或两个以上的bean循环引用。例如:A依赖B,B依赖A。 Spring有三种循环依赖问题: (1)构造器的循环依赖:Spring无法解决构造器的循环依赖问题,但是可以使用@Lazy将bean声明为懒加载,什么时候用到这个bean在创建。 (2)非单例bean的setter循环依赖:Sp 阅读全文
posted @ 2023-05-29 12:37 程序员_YHB 阅读(77) 评论(0) 推荐(0) 编辑
摘要:首先通过BeanDefinition类获取bean的定义信息,例如:是否为单例bean、是否为懒加载等信息。 (1)调用类的构造器实例化bean。 (2)依赖注入。比如setter注入,像平时开发用的@Autowire就是这一步完成的。 (3)如果该类实现了一些Aware接口,则调用这些Aware接 阅读全文
posted @ 2023-05-29 11:19 程序员_YHB 阅读(9) 评论(0) 推荐(0) 编辑
摘要:(1)Singleton:单例bean。 (2)prototype:多例bean。每次请求都会创建一个bean。 (3)request:每次http请求都会创建一个bean,该bean仅在当前http request内有效。 (4)session:在一个HTTP Session中,一个Bean定义对 阅读全文
posted @ 2023-05-29 11:07 程序员_YHB 阅读(11) 评论(0) 推荐(0) 编辑
摘要:(1)方法没有用public修饰会导致事务失效。 解决方法:在方法上使用public修饰。 (2)使用try-catch捕获异常没有抛出异常,而是由方法自己处理会导致事务失效。 解决方法:处理了异常记得抛出。 (3)方法抛出检查异常会导致事务失效,报错也会导致事务失效。 解决方法:在@transac 阅读全文
posted @ 2023-05-29 11:00 程序员_YHB 阅读(12) 评论(0) 推荐(0) 编辑
摘要:SpringIOC和SpringAOP是Spring的两个核心组件。 SpringIOC:SpringIOC是一个管理bean的容器,能够帮我们管理bean的整个生命周期,在没有SpringIOC的时候,我们需要自己手动的管理bean以及bean的依赖关系,这样会增加耦合,而有了SpringIOC, 阅读全文
posted @ 2023-05-29 10:52 程序员_YHB 阅读(18) 评论(0) 推荐(0) 编辑
摘要:Spring并没有对单例bean作线程安全的处理,在并发条件下Spring的bean是否是线程安全的有如下两种情况: (1)无状态的bean:没有数据存储能力,例如service类和dao类都是无状态的bean,所以是线程安全的。 (2)有状态的bean:有数据存储能力,在并发环境下会发生线程安全问 阅读全文
posted @ 2023-05-29 10:34 程序员_YHB 阅读(83) 评论(0) 推荐(0) 编辑
摘要:线程池的七大参数: (1)核心线程数。 (2)最大线程数。 (3)非核心线程存活时间。 (4)非核心线程存活时间的单位。 (5)阻塞队列。 (6)线程工厂。 (7)拒绝策略。 拒绝策略有四种: (1)由主线程执行这个任务。 (2)丢弃任务不报错。 (3)丢弃任务报错。(默认) (4)丢弃最先进来的任 阅读全文
posted @ 2023-05-28 23:29 程序员_YHB 阅读(30) 评论(0) 推荐(0) 编辑
摘要:死锁产生的条件:两个或者多个线程相互占用对方想要请求的资源,就会产生死锁。 死锁的四个必要条件: (1)互斥条件:同一时刻只有一个线程持有锁。 (2)请求与保持条件:一个线程因请求资源而阻塞,对已持有的资源保持不放。 (3)不可剥夺条件:线程在没有使用完自己持有的资源时,其它线程不能剥夺该线程的资源 阅读全文
posted @ 2023-05-28 22:39 程序员_YHB 阅读(17) 评论(0) 推荐(0) 编辑
摘要:ReentrantLock和synchronized都是可重入锁。 ReentrantLock可以实现公平锁和非公平锁,默认非公平锁,而synchronized只能实现非公平锁。 ReentrantLock基于AQS实现,Synchronized基于JVM的monitor实现。 ReentrantL 阅读全文
posted @ 2023-05-28 22:18 程序员_YHB 阅读(17) 评论(0) 推荐(0) 编辑
摘要:AQS是一个实现阻塞式锁的框架,ReentrantLock锁就是基于AQS实现的阻塞式锁。 AQS的原理: (1)在AQS内部维护了一个用volatile修饰的state属性用来表示资源的状态,0表示无锁,1表示有锁。类似于monitor的owner属性。 (2)在AQS内部提供了一个FIFO的双向 阅读全文
posted @ 2023-05-28 22:09 程序员_YHB 阅读(52) 评论(0) 推荐(0) 编辑
摘要:volatile保证了线程之间的可见性。即某个线程修改了一个共享变量,这个变量立刻对所有线程可见。 volatile保证了指令重排序:用volatile修饰的共享变量在读、写时会加入一个内存屏障,保证了指令重排序。 volatile可以保证可见性、有序性,但是不能保证原子性。 阅读全文
posted @ 2023-05-28 21:57 程序员_YHB 阅读(3) 评论(0) 推荐(0) 编辑
摘要:CAS即比较并交换,是一种非阻塞式锁,也称为乐观锁,在无锁的情况下保证线程操作共享资源的原子性。 工作原理:采用CAS的方式修改共享资源时会读取共享资源作为一个预期值,在进行比较,如果预期值和当前值一样,那么就会更新成功,如果不一样,会采用自旋的方式再次获取共享资源的值尝试完成更新,当自旋次数达到一 阅读全文
posted @ 2023-05-28 21:50 程序员_YHB 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2023-05-28 21:35 程序员_YHB 阅读(16) 评论(0) 推荐(0) 编辑
摘要:JDK1.6时synchronized锁有: 偏向锁:在一段时间只有一个线程使用锁,此时就可以使用偏向锁,第一次获取到锁需要CAS操作,之后要再次获取锁,只需要在获取锁时判断当前线程id是否为已经获取锁的线程id,不需要CAS操作,提高了性能。 轻量级锁:多个线程交替持有锁,但是没有发生竞争,此时就 阅读全文
posted @ 2023-05-28 21:31 程序员_YHB 阅读(19) 评论(0) 推荐(0) 编辑
摘要:synchronized对象锁采用互斥的方式使得在同一时刻只有一个线程能够持有锁并操作共享资源,如果其它线程想要获取锁就会进入阻塞状态,从而保证了线程安全问题。 synchronized底层原理:synchronized的实现基于JVM的锁监视器(monitor),每个JVM都有维护自己的一套锁监视 阅读全文
posted @ 2023-05-28 21:16 程序员_YHB 阅读(52) 评论(0) 推荐(0) 编辑
摘要:(1)使用退出标志,让run()方法运行结束,线程正常停止。 (2)调用stop()方法强行终止线程,不建议使用该方法,容易产生死锁。 (3)使用interrupt方法中断线程。 阅读全文
posted @ 2023-05-28 16:36 程序员_YHB 阅读(65) 评论(0) 推荐(0) 编辑
摘要:(1)wait()方法是object类的方法,sleep是Thread类的静态方法。 (2)wait()方法需要和锁搭配使用,线程调用wait()方法会释放锁,而sleep()方法不需要和锁搭配使用,线程调用sleep()方法不会释放锁。 (3)线程调用wait()方法需要其它线程调用notify( 阅读全文
posted @ 2023-05-28 16:33 程序员_YHB 阅读(7) 评论(0) 推荐(0) 编辑
摘要:notify()方法随机唤醒一个处于等待的线程。 notifyAll()方法唤醒所有处于等待的线程。 阅读全文
posted @ 2023-05-28 16:29 程序员_YHB 阅读(15) 评论(0) 推荐(0) 编辑
摘要:在多线程中有多种方法让线程按特定顺序执行,可以用线程类的join()方法在 一个线程中启动另一个线程,另外一个线程完成该线程继续执行。 阅读全文
posted @ 2023-05-28 16:26 程序员_YHB 阅读(16) 评论(0) 推荐(0) 编辑
摘要:线程有六种状态: 新建:当线程被创建时,还没有调用start()方法。 可运行:调用start()方法后,等待CPU调度。 阻塞:线程没有获取到锁进入阻塞状态。 等待:线程获取到锁之后由于条件不满足调用wait()方法后释放锁进入等待状态,当其它持有锁的线程调用notify()或者notifyAll 阅读全文
posted @ 2023-05-28 16:22 程序员_YHB 阅读(34) 评论(0) 推荐(0) 编辑
摘要:创建线程有四种方式: (1)继承Thread类重写run()方法,调用start()方法启动线程。 (2)实现Runable接口,实现run()方法。 (3)实现Callable接口,实现call()方法。 (4)线程池创建线程。 为什么要使用线程池:减少线程的上下文切换带来的损耗、减少创建线程和销 阅读全文
posted @ 2023-05-28 16:10 程序员_YHB 阅读(65) 评论(0) 推荐(0) 编辑
摘要:并发:两个或多个线程轮流使用CPU资源。 并行:多个核同时调度线程执行任务,这个时候就是并行。 阅读全文
posted @ 2023-05-28 15:50 程序员_YHB 阅读(7) 评论(0) 推荐(0) 编辑
摘要:(1)进程是操作系统分配资源的基本单位。线程是CPU任务调度的基本单位。 (2)一个进程可以包含多个线程,进程内的线程共享进程内的资源。 (3)进程和进程之间的内存和资源相互隔离。 阅读全文
posted @ 2023-05-28 15:45 程序员_YHB 阅读(14) 评论(0) 推荐(0) 编辑
摘要:强引用:普通对象的强引用关系。如:直接的赋值语句:String str=new String(“string”);强引用不会被垃圾回收。 软应用:当内存不足时,具有软引用关系的对象会被垃圾回收。 弱引用:不管内存足不足,都会被垃圾回收。 虚引用:虚引用通常配合引用队列来使用,用于跟踪对象被垃圾回收的 阅读全文
posted @ 2023-05-27 15:14 程序员_YHB 阅读(161) 评论(0) 推荐(0) 编辑
摘要:JVM有四种垃圾回收器: (1)串行垃圾回收器:采用单线程进行垃圾回收,占用内存比较小,适合个人电脑使用。 serial垃圾回收器:用于新生代垃圾回收,采用标记复制算法。 serial Old垃圾回收器:用于老年代垃圾回收,采用标记整理算法。 缺点:垃圾回收时只有一个线程在工作,其它java应用的线 阅读全文
posted @ 2023-05-27 14:51 程序员_YHB 阅读(118) 评论(0) 推荐(0) 编辑
摘要:判断一个对象是否存活的方法: (1)引用计数法:给每个对象设置一个引用计数器,对象被引用时就+1,引用失效时就-1,当对象的引用为0时,该对象就被视为垃圾对象,等待垃圾回收。但是该方法不能解决循环引用问题。例如:A引用B,B应用A。现在的虚拟机一般不用这种方法。 (2)可达性分析法:沿着GC Roo 阅读全文
posted @ 2023-05-27 13:54 程序员_YHB 阅读(15) 评论(0) 推荐(0) 编辑
摘要:类加载:把类的数据加载到内存,并对数据进行校验、解析、初始化,最终形成可以被虚拟机直接使用的class对象。 类加载机制:类加载采用双亲委派机制。 双亲委派机制:当类加载器收到类加载请求时,它不会第一时间去加载这个类,而是由父类加载器去加载,如果父类加载器加载不到这个类,才由子类加载器加载。 双亲委 阅读全文
posted @ 2023-05-26 14:00 程序员_YHB 阅读(64) 评论(0) 推荐(0) 编辑
摘要:常量池:可以看作是一张表,虚拟机指令根据常量表找到要执行的类名、方法名、参数类型、字面量等信息。 查看字节码结构的指令:javap -v xxx.class。 运行时常量池:当类被加载,会把该类的常量池信息放入运行时常量池中,并把里面的符号地址变为真实地址。 阅读全文
posted @ 2023-05-26 13:37 程序员_YHB 阅读(3) 评论(0) 推荐(0) 编辑
摘要:除了程序计数器其它都会发生内存溢出: 堆:堆内存耗尽,对象越来越多,又一直在使用,不能被垃圾回收。 方法区:方法区内存耗尽,加载的类越来越多,在运行期间动态产生大量的类。 栈:方法调用次数过多,无限创建大量的线程。 阅读全文
posted @ 2023-05-25 15:03 程序员_YHB 阅读(5) 评论(0) 推荐(0) 编辑
摘要:JVM内存结构由五部分组成: 堆:java堆是所有线程共享的一块内存,几乎所有的对象实例和数组都要在堆中分配内存,因此该区域也经常发生垃圾回收操作。 方法区:线程共享的。存放已被加载的类信息、常量、静态变量。 虚拟机栈:线程私有的,每个方法执行时都会创建一个栈帧,用来存储局部变量表、操作数、动态链接 阅读全文
posted @ 2023-05-25 14:37 程序员_YHB 阅读(30) 评论(0) 推荐(0) 编辑
摘要:Java反射:在运行状态下能够动态的获取类的所有信息,例如类的成员属性、类的方法、类的名字。并且可以动态的创建类的对象从而调用类的方法。 创建class对象的三个方法:(1)Class cl=Class.forName(“类的全类名”); (2)Class cl=类名.Class; (3)通过对象来 阅读全文
posted @ 2023-05-21 23:02 程序员_YHB 阅读(3) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示