atomic : jdk1.5 提供了方便在多线程环境下 进行无锁的原子操做 ,java
底层使用了处理器的提供的原子指令 ,不一样cpu架构提供的原子指令不同 ,也可能提供某种形式的内部锁,不能保证彻底的线程不阻塞的web
1 12类,四种原子更新的方式 ,(atomic 包中类都是使用Unsafe 实现的包装类)spring
原子更新基本类型 :经过原子的方式更新基本类型:AtomicInteger AtomicLong AtomicBoolean等等数组
原子更新数组springboot
原子更新引用数据结构
原子更新字段多线程
AtomicInteger 架构
Unsafe , valueOffset , 是什么??app
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 : 这类注解借助,@Import 注解的支持 ,收集注册特定场景相关的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 框架的概念 :