靜態內部類
靜態內部類應用實例
代碼演示
package com.atguigu.principle.singleton.type07;/**
* @author victor
* @site https://victorfengming.github.io/
* @company XDL
* @project java_mode
* @package com.atguigu.principle.singleton.type07
* @created 2021-02-02 20:37
* @function ""
*/
public class SingletonTest07 {public static void main(String[] args) {System.out.println("使用靜態內部類完成單例設計模式!");Singleton ins = Singleton.getInstance();Singleton ins2 = Singleton.getInstance();System.out.println(ins);System.out.println(ins.hashCode());System.out.println(ins2);System.out.println(ins2.hashCode());System.out.println(ins == ins2);Singleton ins4 = Singleton.getInstance();System.out.println(ins4);/** 使用靜態內部類完成單例設計模式!com.atguigu.principle.singleton.type07.Singleton@1540e19d356573597com.atguigu.principle.singleton.type07.Singleton@1540e19d356573597truecom.atguigu.principle.singleton.type07.Singleton@1540e19d* */}
}// 靜態內部類完成,推薦使用
class Singleton {private static volatile Singleton instance;// 構造器私有化private Singleton() {}// 寫一個靜態累不累,該類中有一個靜態的屬性,這個靜態屬性他有一個類型就是,Singletonprivate static class SingletonInstance {// 通過jvm底層裝載機制保證了,這個是線程安全的private static final Singleton INSTANCE = new Singleton();}// 提供一個靜態公有方法,直接返回SingletonInstance.INSTANCEpublic static Singleton getInstance() {return SingletonInstance.INSTANCE;}
}
優缺點說明:
-
這種方式采用了類裝載的機制來保證初始化實例時只有一個線程
-
靜態內部類方式在Singleton類被裝載時并不會立即實例化,而是在需要實例化時,調用getInstance方法,才會裝載SingletonInstance類,從而完成Singleton的實例化.
-
類的靜態屬性只會在第一次加載類的時候初始化,所以在這里,JVM幫助我們保證了線程的安全性,在類進行初始化時,別的線程時無法進入的
-
優點: 避免了 線程不安全 ,利用靜態內部類特點實現延遲加載,效率高
-
結論: 推薦使用
更多:http://victorfengming.gitee.io/design_pattern/