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