Springboot的自动配置
Springboot 的自动配置@SpringbootApplication :
@SpringbootConfiguration
@Configuration
@ComponentScan
@EnableAutoConfiguration
@Import(AutoConfigurationImportSelector.class)
关键点是AutoConfigurationImportSelector,它通过SpringFactories机制加载配置文件,有个方法的作用就是去扫描了META-INF/spring.factories文件,扫描出所有key是EnableAutoConfiguration 或者AutoConfiguration 的value值,然后再通过@Conditional 注解过滤掉不必要的自动配置类,这个@Conditional 注解就相当于if,只有满足特定条件时候才会注册bean
ApplicationContext就是IoC 容器
Springboot 启动流程
创建IoC容器
加载源配置类
通常是main 方法所在的类,而且会 ...
线程池
创建线程
继承Tread类,重写run()方法
实现Runnable接口,实现run()方法
实现Callable接口,实现call()方法
线程池12345678910111213141516package com.cc.blocking_queue;import java.util.concurrent.*;public class Test { public static void main(String[] args) { ExecutorService executorService = new ThreadPoolExecutor(3, 5, 1L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); for(int i = 0; i < 7; i ++) { executorServ ...
syncohronized和lock的区别
synchronized和Lock
synchronized是一个关键字,只作用于代码块或者方法;lock是一个接口,必须要有实现类如ReentrantLock,通过lock()和unlock()方法加锁和释放锁
synchronized在发生异常时,会自动释放线程所占有的锁,因此不会导致死锁,而lock需要手动释放,所以一般会在finally块中释放锁
synchronized不能让等待锁的线程响应中断,而lock可以中断等待锁的线程
比如A线程获取到lock锁,B线程等待A线程锁的释放,但是A花费了很久,这时B线程可以自己中断或者被其他线程中断,比如ReentrantLock去决定是否处理这个中断,如果是那么B线程不再等待这个A释放锁,去做其他事
它们都是可重入锁,就是同一个线程可以多次获取同一个锁,不会发生死锁
lock可以通过tryLock()方法来知道有没有获取到锁,而synchronized不能
lock可以实现公平锁或者非公平锁,通过Lock lock = new ReentrantLock(true);使用公平锁(默认是非公平锁),synchronized ...
String和StringBuilder和StringBuffer
String和StringBuilder和StringBufferString
String 类是不可变的,每次对字符串进行修改都会生成一个新的字符串对象。这意味着如果你需要对字符串进行频繁的修改操作,使用 String 类会导致创建大量的中间对象,对内存和性能有一定的影响。
StringBuffer和StringBuilder线程安全性
StringBuffer是线程安全的,而StringBuilder不是。当多个线程需要并发访问同一个可变字符串时,使用StringBuffer可以确保线程安全。
性能
StringBuilder的性能通常比StringBuffer好,因为它不需要进行同步。在单线程环境下,使用StringBuilder可以获得更好的性能。但这种性能差异通常只在频繁操作大量字符串时才会显著。
API兼容性
StringBuffer和StringBuilder都实现了CharSequence接口,因此它们可以以相同的方式使用。它们提供了许多相似的方法,如追加字符串、插入字符串、删除子字符串等。
应用场景
如果你需要线程安全的操作,并且在多线程环境中要修改可变字符串 ...