static總結:
1、修飾靜态變量,通過類名.變量名,不需要執行個體化對象,屬于靜态資源,所有類執行個體共享
2、修飾靜态方法,通過類名.方法,不需要執行個體化對象,屬于靜态資源,所有類執行個體共享
3、靜态代碼塊,類初始化的時候引用,隻執行一次
4、靜态資源的加載順序,按照定義順序加載,并且按照父類靜态代碼塊->子類靜态代碼快順序執行
5、靜态代碼塊對應定義在它之後的變量可以指派,但不能通路
6、import static 資源,建議少用,影響代碼的可讀性
注意:靜态方法内不能有非靜态資源,非靜态方法類可以引用靜态資源,static修飾的靜态變量不可序列化(原因:靜态變量屬于類變量,不屬于執行個體變量)
final總結:
1、修飾引用:
a、修飾基本資料類型,則該資料為常量,值無法修改
b、修飾引用資料類型,如對象、數組,則該對象、數組本身可以修改,但指向該對象、數組的引用不可修改
c、修飾類的引用,該引用必須被當場指派
2、修飾方法:最終的方法,不可被子類重寫,但可以繼承
3、修飾類:簡稱斷子絕孫類,不可被繼承。如String
transient總結:
1、如果想讓對象中的某個成員變量不被序列化,可以在成員變量上加上transient關鍵字
2、隻能修飾變量,不能修飾方法和類
3、使用者自定義的類變量,如果被transient修飾需要實作serializable接口
4、銀行卡、密碼等資料适合用transient修飾
注意:本地變量(native)不能被transient修飾
volatile總結:
volatile可見性是通過彙編加上Lock字首指令,觸發底層的MESI緩存一緻性協定來實作的,MESI緩存的最小單元是緩存行,當共享的資料長度超過一個緩存行的長度,MESI協定就會失效,會觸發總線加鎖機制
1、保證記憶體可見性
2、禁止指令重排序:如單列模式雙重鎖,并發的情況下會出現指令重排序
3、不能保證原子性
synchronized總結:
保證同一時刻隻有一個線程可以執行某個方法或代碼塊,也可以保證一個線程的變化可見性和共享變量的記憶體可見性可以代替volatile
1、方法
a、執行個體方法,鎖的是類的執行個體對象
b、靜态方法,鎖的是類對象
2、代碼塊
a、執行個體對象,鎖的是類的執行個體對象
b、class對象,鎖的是類對象
c、任意執行個體對象中的變量參數,鎖的的是執行個體對象
原理:方法級的同步是隐式的,無需通過位元組碼指令控制(monitorenter,monitorexit兩個指令),取而代之的是位元組碼中會出現ACC_SYNCHRONIZED辨別,指明該方法為同步方法。