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

相關文章
相關標籤/搜索