1. 程式人生 > >使用靜態內部類實現單例模式

使用靜態內部類實現單例模式

程式碼如下:

/**
 * Created on 2017/5/5.
 * Author:crs
 * Description:使用靜態內部類的方式實現單例模式
 */
public class Singleton {

    private Singleton() {
    }

    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    public static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
}

1) 如何保證執行緒安全: 因為內部的靜態類只會被載入一次,只會有一個例項物件,所以是執行緒安全的

2) 內部類的載入機制: java中的內部類是延時載入的,只有在第一次使用時載入;不使用就不載入;

類的載入機制: 虛擬機器在首次載入Java類時,會對靜態初始化塊、靜態成員變數、靜態方法進行一次初始化;靜態內容首先被載入,相當於全域性的成員變數。

當靜態方法getInstance()載入時,SingletonHolder.INSTANCE預設初始值是空的,只有當呼叫次方法時,內部類才會被例項化。


Singleton類被裝載了,instance不一定被初始化,因為它是內部類中的成員。因為SingletonHolder類沒有被主動使用,只有顯示通過呼叫getInstance方法時,才會顯示裝載SingletonHolder類,從而例項化instance。
如果例項化instance很消耗資源,我想讓他延遲載入,另外一方面,我不希望在Singleton類載入時就例項化,因為我不能確保Singleton類還可能在其他的地方被主動使用從而被載入,那麼這個時候例項化instance顯然是不合適的。
利用了classloader的機制來保證初始化instance時只有一個執行緒,所以也是執行緒安全的,同時沒有效能損耗。

final修飾的方法,不能被重寫;當子類繼承時此方法不能被修改。

由final修飾的變數是常量,常量名全部大寫。