atomic : jdk1.5 提供了方便在多线程环境下 进行无锁的原子操作 ,
底层使用了处理器的提供的原子指令 ,不同cpu架构提供的原子指令不一样 ,也可能提供某种形式的内部锁,不能保证完全的线程不阻塞的
1 12类,四种原子更新的方式 ,(atomic 包中类都是使用Unsafe 实现的包装类)
原子更新基本类型 :通过原子的方式更新基本类型:AtomicInteger AtomicLong AtomicBoolean等等
原子更新数组
原子更新引用
原子更新字段
AtomicInteger
Unsafe , valueOffset , 是什么??
cas 方法 ????: compareAndSwapObject compareAndSwapInt 等等
数据结构 ,带有volatile 的int类型的 value
1 get方法 : 返回 value值
2 set方法 :设置一个value
3 lazySet方法 ; 调用 unsafe.putOrderedInt
4 getAndSet ,调用unsafe.getAndSetInt
addAndGet 以原子的方式将输入的数字和实例的值 相加 ,返回结果
compareAndSet 如果输入的值==预期值的,则以原子方式将输入值设置未输入的值
getAndIncrement 以原子的方式将当前的值加1 ,返回自增之前的值
int getAndSet 将新值设置,返回旧值 (和getAns)
AtomicReference 原子类型的引用类 :
public static void main(String[] args) {
spring boot 启动机制 :
1 注解@SpringBootApplication 和 SpringApplication.run
SpringBootApplication 是
@Configuration :javaconfig形式的Spring ioc容器配置类(注册bean,依赖注入关系 ,相当xml文件中 <bean>标签 的工作)
@EnableAutoConfiguration : 这类注解借助, 注解的支持 ,收集注册特定场景相关的bean的定义
即为 将符合自动配置条件的bean定义加载到ioc容器中 , 这里import注解借助EnableAutoConfigurationImportSeletor
将所有符合条件的@Configuration配置加载到spring 的ioc容器中 ,
@ComponentScan :自动扫描并加载符合条件的组件,或者bean定义,最终加载到spring ioc 容器中,
可以通过basePackages指定 细粒度的定制 扫描的范围 ,默认使用该注解所在类的包路径下扫描
借助 SpringFactoryiesLoader 支持 ,改注解可以智能的自动配置
它 基于spring 框架的一种扩展方案 ,主要的功能就是从指定的配置文件 META-INF/spring.factories加载配置
配合 EnableAutoConfiguration 使用,提供了配置查找的功能支持,根据它的类完全限定名 作为key ,获取一组带有 @Configuration类
即为 : 通过查找classpath路径下 ,META-INF/spring.factorties 配置文件,
通过 org.springframework.boot.autoconfigure.EnableutoConfiguration作为key 的对应的配置项,获取对应配置类的类名。
通过java反射机制,实例化为ioc容器中对应的标注了@Configuration注解的配置类,加载到ioc容器中
深入原理 :
spring boot 的run方法 主体流程 :
SpringApplication的静态方法 run 首先创建一个SpringApplication对象实例,
然后调用创建好的实例对象的方法 , 而初始化该实例的会如下事情 :
1 根据classpath 里面是否存在某个特征类, 决定是否创建一个为web应用的使用ApplicationContext类型 --- ConfigurablewebApplicationContext
2 使用 SpringFactoriesLoader 在应用的classpath 中查找并加载所有可用的ApplicationContextInitializer
3 使用SpringFactioriesLoader 在应用的classpath中查找并加装所有可用的ApplicationListener
4 推断并设置main方法的定义类
2 springApplication实例初始化完成并且完成设置之后,就开始执行run方法的逻辑了,方法执行开始,首先会遍历 所有通过
SprinClassLoader 可以查找到并加载的springApplicationRunListenter ,d调用他们的started方法,告诉springApplicationRunListener
spring boot 应用要开始执行了
3创建并配置所有当前spring boot 应用并将要是用的environment
4遍历调用所有的是springbooRunListener 的environmentPrepared方法 ,告诉监听器,springboot 应用使用Environment准备好了
5 如果springapplication 的showBanner 设置为true 打印 banner
6 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前spring boot应用
创建什么类型的ApplicationContext 并创建完成,然后根据条件决定是否添加showdownHook
决定是否使用自定义的BeanNameGenrator ,决定是否使用自定义的ResoureLoader ,当然最重要的是将之前准备好的environment设置
给创建好的ApplicationContext使用 。
7 ApplicationContext 创建好之后,它会再次借助springFacitoriesLoder 查找并加装classpath中所有可用的ApplicationContext-Initializer
然后遍历这些ApplicationContextInitializer的initialize 方法 对已经创建好的ApplicationContext进行进一步的处理。
8 遍历调用所有的SpringApplicationRunListener的contextPrepered方法
9 最核心的一步 ,将之前通过@EnableAutoConfiguration的获取的所有配置以及其他形式的ioc容器配置加载到已经准备完毕的ApplicationContext中
10 遍历调用所有的SpringApplicationRunListener的contextLoaded方法
11 调用ApplicationContext的refresh方法 ,完成ioc容器的最后一道工序
12查找当前ApplicationContex中是否注册有CommandLineRunner 如果有遍历执行它们
13 正常情况下 遍历执行springApplicationRunListener的finished 方法 (出现异常
如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理)
去除事件通知点后,整个流程如下:
)
spring 框架的概念 :