靜態內部類實現單例模式
阿新 • • 發佈:2018-12-26
程式碼如下:
/** * 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類沒有被主動使用,只有顯示通過呼叫getInstan
ce方法時,才會顯示裝載SingletonHolder類,從而例項化instance。
如果例項化instance很消耗資源,我想讓他延遲載入,另外一方面,我不希望在Singleton類載入時就例項化,因為我不能確保Singleton類還可能在其
他的地方被主動使用從而被載入,那麼這個時候例項化instance顯然是不合適的。
利用了classloader的機制來保證初始化instance時只有一個執行緒,所以也是執行緒安全的,同時沒有效能損耗。
final修飾的方法,不能被重寫;當子類繼承時此方法不能被修改。
由final修飾的變數是常量,常量名全部大寫。