單例模式
在當(dāng)前進(jìn)程中,通過單例模式創(chuàng)建的類有且只有一個實(shí)例。
特點(diǎn):
1. 保證在一個JVM中,該對象只有一個實(shí)例存在
2. 構(gòu)造器必須是私有的,外部類無法通過調(diào)用構(gòu)造器方法創(chuàng)建該實(shí)例
3. 沒有公開的set方法,外部類無法調(diào)用set方法創(chuàng)建該實(shí)例
4. 提供一個公開的get方法獲取唯一的這個實(shí)例
優(yōu)點(diǎn):
1. 減少系統(tǒng)開銷,減低內(nèi)存使用頻率
2. 避免對資源的重復(fù)占用
餓漢模式
把對象提前實(shí)例化,外部第一次獲取這個類的對象時就直接存在這個類,省去創(chuàng)建的開銷
//餓漢模式
class HungrySingleton{
//1.私有構(gòu)造函數(shù),保證不能實(shí)例化本類
private HungrySingleton(){}
//2. 創(chuàng)建一個類的實(shí)例化對象
private static HungrySingleton hungrySingleton = new HungrySingleton();
//3. 創(chuàng)建一個get方法,返回一個實(shí)例
public static HungrySingleton getInstance(){
return hungrySingleton;
}
}
懶漢模式
對象沒有被提前實(shí)例化,外部第一次獲取這個類的對象時是空的,需要初始化,賦值
線程不安全的模式
多個線程調(diào)用getInstance方法來獲取Singleton的實(shí)例是,可能會導(dǎo)致實(shí)例化了兩個對象
// 懶漢模式
class LazySingleton{
//1.私有構(gòu)造函數(shù),保證不能實(shí)例化本類
private LazySingleton(){}
//2. 自己創(chuàng)建一個類的實(shí)例化
private static LazySingleton singleton;
//3. 創(chuàng)建一個get方法,返回實(shí)例
public static LazySingleton getInstance(){
//判斷singleton是否為null,如果為null,即判定需要實(shí)例化
if (singleton == null) {
singleton= new LazySingleton();
}
return singleton;
}
}
線程安全模式
// 懶漢模式
class LazySingleton{
//1.私有構(gòu)造函數(shù),保證不能實(shí)例化本類
private LazySingleton(){}
//2. 自己創(chuàng)建一個類的實(shí)例化 (volatile保證不會發(fā)生重排序)
private volatile static LazySingleton singleton;
//3. 創(chuàng)建一個get方法,返回實(shí)例
public static LazySingleton getInstance(){
//判斷singleton是否為null,如果為null,即判定需要實(shí)例化
if (singleton == null) {
//同步塊,線程安全的創(chuàng)建實(shí)例
synchronized (LazySingleton.class){
// 再次檢測實(shí)例是否存在
if (singleton == null){
singleton= new LazySingleton();
// 字節(jié)碼層
//JIT 即時編譯 CPU
//1. 分配空間
//2. 初始化
//3. 引用賦值
}
}
}
return singleton;
}
volatile的作用:
1. 防止指令重排序,對象的實(shí)例化包含創(chuàng)建和賦值
2. 保證內(nèi)存可見,volatile修飾的變量,不會被本地緩存,所有線程對該對象的讀寫都會第一時間同步到主內(nèi)存。
懶漢模式和餓漢模式的區(qū)別
兩者的根本區(qū)別在于對象是否別提前實(shí)例化,以及線程的安全問題
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。