concurrent包

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 框架的概念 :

相关文章
相关标签/搜索