Singleton:在Java中即指單例設計模式
單:唯一
例:實例
單例設計模式,即某個類在整個系統中只能有一個實例對象可被獲取和使用的代碼模式
例如:代表JVM運行環境的RunTime類
要點:
一、某個類只能有一個實例
構造器私有化
二、它必須自行創建這個實例
含有一個該類的靜態變量來保存這個唯一的實例
三、它必須自行向整個系統提供這個實例
對外提供獲取該實例對象的方式:
(1)直接暴露(2)用靜態變量的get方法獲取
幾種常見形式
餓漢式:直接創建對象,不存在線程安全問題
直接實例化餓漢式(簡潔直觀)
餓漢式:
直接創建實例對象。不管你是否需要這個對象都會創建
(1)構造器私有化
(2)自行創建,并且用靜態變量保存
(3)向外提供這個實例
(4)強調這是一個單例,我們可以用final修改
public class singleton1{
pubilc static final Singleton1 INSTANCE = new Singleton1();
//構造器私有化
private Singleton1(){
}
}
枚舉式(最簡潔)
枚舉類型:表示該類型的對象是有限的幾個
我們可以限定為一個,就成了單例
public enum Singleton2{
INSTANCE
}
靜態代碼塊餓漢式(適合復雜實例化)
public class Singleton3{
public static final Singleton3 INSTANCE;
static{
INSTANCE = new Singleton3();
}
private Singleton3(){
}
}
懶漢式:延遲創建對象
懶漢式:
延遲創建這個實例對象
(1)構造器私有化
(2)用一個靜態變量保存這個唯一的實例
(3)提供一個靜態方法,獲取這個實例對象
線程不安全(適用于單線程)
public class Singleton4{
private static Singleton4 instance;
private Singleton4(){
}
public static Singleton4 getInstance(){
//當調用此靜態方法時,會進行判斷是否創建過 instance 如果為空就創建個,
//如果已經創建就不進行創建,因為 instance 是靜態修飾所以只需要創建一次
if(instance == null){
//多線程情況下被調用 會存在 兩個對象的地址不同,線程的不安全,
instance = new Singleton4():
}
return instance;
}
}
線程安全(適用于多線程)
懶漢式:
延遲創建這個實例對象
(1)構造器私有化
(2)用一個靜態變量保存這個唯一的實例
(3)提供一個靜態方法,獲取這個實例對象
線程不安全(適用于單線程)
public class Singleton5{
private static Singleton5 instance;
private Singleton5(){
}
public static Singleton5 getInstance(){
//當調用此靜態方法時,會進行判斷是否創建過 instance 如果為空就創建個,
//如果已經創建就不進行創建,因為 instance 是靜態修飾所以只需要創建一次
synchronized(Singleton5.class)
if(instance == null){
instance = new Singleton4():
}
return instance;
}
}
靜態內部類形式(適用于多線程)
在內部類被加載和初始化時,才創建INSTANCE實例對象
靜態內部類不會隨著外部類加載和初始化而初始化,它是單獨去加載和初始化的
因為是在內部類加載和初始化時,創建的,因為線程是安全的
public class Singleton6{
private Singleton6(){
}
private static class Inner{
private static final Singleton6 INSTANCE = new Singleton6();
}
public static Singleton6(){
return Inner.INSTANCE;
}
}