首页 > 编程知识 正文

springboot循环依赖(springboot配置bean)

时间:2023-05-04 19:10:36 阅读:91900 作者:237

根据

SpringBoot加载Bean的几种方式

@ComponentScan的注释,@SpringBootApplication中包含@Componentscan,表示正在施工中的@component, 找到@Configuration等注释并加入spring @ bean注释@Import注释@EnableAutoConfiguration注释,spring-boot为autoconfiguration 在所有jar包的META-INF文件夹中搜索由spring.factories

voalite

volatile限定的变量。 变量的操作在内存中进行,所有线程共享变量

volatile和同步的区别

volatile只能用于变量,而同步只能用于变量、方法和类级别; volatile只能实现变量的可见性,不能保证原子性。 同步可以保证变量的可见性和原子性; volatile不会阻止线程,同步可能会阻止线程。 因为volatile只及时通知所有线程当前变量的值,而synchronized只能锁定当前变量,不能被其他线程访问。 volatile标记的变量未被编译器优化(因为无法命令重新定位),而同步标记的变量由编译器优化; 虽然volatile修饰变量适用于一次写入和多次读取的并发方案,但多次写入场景会出现线程安全问题。 因此,使用volatile而不是同步的唯一安全情况是类中只有一个可变域。 由于所有操作都必须与内存变量同步,因此volatile必须减慢线程的执行速度。 体积和静态

保证一致性,不保证唯一性。 多个实例有多个volatile变量。 保证唯一性,不保证一致性,多个实例共享一个静态变量。

线程

线程的创建方法

继承Thread类并调用run (重写方法,然后调用Thread的start )方法。 实现Runnable接口(推荐) )方法,创建Thread对象,并将实现该Thread对象的对象作为参数进行实例化实现Callable接口,然后调用(重写方法。 Callable接口实际上属于Executor框架中的功能类。 Callable结构类似于Runnable接口的功能,但提供比Runnable更强大的功能。 主要在于,Callable在任务结束后可以提供返回值这三点,Callable的call (方法可以摆脱异常,但Runnable的run ) )无法摆脱异常。 Callable可以获得表示异步计算结果的Future对象,并提供检查计算是否完成的方法。 线程输入异步计算模型,因此无法从其他线程获得函数的返回值。 在这种情况下,可以使用Future来监视目标线程调用)方法的情况。 Future的get ) )调用该方法获取结果时,将阻止当前线程,直到目标线程的调用)方法结束并返回结果。 线程状态-生命周期

用创建:new关键字创建后,进入新生状态调用就绪3360start后,进入就绪状态运行: CPU调度到本线程后,本线程开始执行。 进入运行状态后,在模块:运行中遇到join、yield、sleep进行屏蔽,变为屏蔽状态。 阻止完成后,返回就绪状态,结束:线程的正常执行,或在遇到异常结束后,进入死亡状态

多线程

多线程数据同步的处理方法

同步关键字主要用于同步方法和同步代码块wait (方法和通告)方法锁定。 JDK5添加了新的Lock接口及其实现类ReentrantLock ),还可以进行多线程同步。 自己锁定a. lock (需要解除:通过块获取锁定。 也就是说,取得锁定时执行。 其他线程需要等待。 unlock ) )锁定后可以执行其他线程。 如果另一个线程有锁定,则当前线程将等待获取锁定并返回。 b .轨迹()。 通过非阻塞获取锁定。 只是,试着取得密钥,得到密钥后马上返回true,否则返回false。 c .轨迹(长时间输出,时间单元)。 在给定的时间单位内,获取锁定并返回true,否则返回false。 d. lockInterruptibly () .获得锁定后,立即返回; 如果没有锁定,当前线程将一直处于休眠状态,直到获取锁定或当前线程中断。 发生InterruptedException异常。 获得lock (与方法最大的不同是) )方法时

取不到锁,就会一直处于阻塞状态,且会忽略Interrupt()方法。

线程池

线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理

线程池的好处

降低资源消耗:可以重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控

线程池的工作原理

线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则执行第二步。线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这个工作队列里进行等待。如果工作队列满了,则执行第三步线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略(拒绝策略)来处理这个任务

创建线程池的几种方式(线程池种类)

单线程的线程池 (SingleThreadExecutor): 按顺序执行固定大小的线程池(FixedThreadPool):达到最大值时,保持不变,等待老线程结束或异常,新线程代替可缓存的线程池(CachedThreadPool):创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲的线程,当任务数增加时,此线程池又添加新线程来处理任务,可以无限扩大的线程池,比较适合处理执行时间比较小的任务定时线程池(ScheduledThreadPool):支持定时以及周期性执行任务的需求JDK8新增(WorkStealingPool):会根据所需的并行级别参数来动态创建和关闭线程,默认使用CPU数量,通过使用多个队列减少竞争,底层用的ForkJoinPool来实现的。支持把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行;当多个“小任务”执行完成之后,再将这些执行结果合并起来

说说线程池的拒绝策略

AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。

CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。

DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,并尝试再次提交当前任务。

DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。

自定义策略:实现RejectedExecutionHandler接口

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。