由於加載一個類時,其內部類不會同時被加載。一個類被加載,當且僅當其某個靜態成員(靜態域、構造器、靜態方法等)被調用時發生。因此使用靜態內部類實現的單例模式是懶加載的且線程安全。
一、代碼
public class UserSingleton {
/** 私有化構造器 */
private UserSingleton() {
}
/** 對外提供公共的訪問方法 */
public static UserSingleton getInstance() {
return UserSingletonHolder.INSTANCE;
}
/** 寫一個靜態內部類,裏面實例化外部類 */
private static class UserSingletonHolder {
private static final UserSingleton INSTANCE = new UserSingleton();
}
}
二、小結
(1)爲什麼這樣實現就是單例的?
因爲這個類的實例化是靠靜態內部類的靜態常量實例化的。
INSTANCE 是常量,因此只能賦值一次;它還是靜態的,因此隨着內部類一起加載。
(2)這樣實現有什麼好處?
我記得以前接觸的懶漢式的代碼好像有線程安全問題,需要加同步鎖才能解決。
採用靜態內部類實現的代碼也是懶加載的,只有第一次使用這個單例的實例的時候才加載;同時不會有線程安全問題