concurrent包

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 :     这类注解借助,@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 框架的概念 :

猜你喜欢

转载自my.oschina.net/u/3106499/blog/1801798