博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
concurrent包
阅读量:6432 次
发布时间:2019-06-23

本文共 3315 字,大约阅读时间需要 11 分钟。

hot3.png

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/3106499/blog/1801798

你可能感兴趣的文章
android jni aotf 错误
查看>>
Azkaban的功能特点(二)
查看>>
[RxJS] Add debug method to Observable in TypeScript
查看>>
1、金融之关于BIAS
查看>>
[转]ASP.NET Core基本原理(11)-管理应用程序状态
查看>>
VS Code搭建.NetCore开发环境(一)
查看>>
01字典树贪心查询+建立+删除(个人模版)
查看>>
java-信息安全(十一)-非对称加密算法ECC以及ECDSA签名
查看>>
(转)Flex的编译过程--ActionScript字节码(ABC)
查看>>
Directory Listing Denied
查看>>
今天讲座的感悟--java
查看>>
o(1)复杂度之双边滤波算法的原理、流程、实现及效果。
查看>>
corner2
查看>>
我见过的几种类型的员工(转)
查看>>
web前端的十种jquery特效及源码下载
查看>>
poj 3414 Pots (bfs+线索)
查看>>
Binary search
查看>>
http://jingyan.baidu.com/article/08b6a591f0fafc14a9092275.html
查看>>
MySQL查询数据表的Auto_Increment(自增id)
查看>>
java多线程系类:JUC集合:01之框架
查看>>