代碼文件目錄:
文章來源地址http://www.zghlxwxcb.cn/news/detail-640351.html
?初始版本:
package Chapter5_SingletonPattern.origin;
/**
* @Author 竹心
* @Date 2023/8/5
**/
public class Singleton {
private static Singleton uniqueInstance;
private Singleton(){}
public static Singleton getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
//問題:多線程中會出現(xiàn)多個實例被創(chuàng)建的情況
//other functions
}
三種解決多線程問題的方法:
package Chapter5_SingletonPattern.Multithread;
import Chapter5_SingletonPattern.origin.Singleton;
/**
* @Author 竹心
* @Date 2023/8/5
**/
public class Singleton1 {
private static Singleton1 uniqueInstance;
private Singleton1(){}
//使用synchronized迫使每個線程進(jìn)入此方法之前必須輪到他
//但是這樣會導(dǎo)致性能開銷大
public static synchronized Singleton1 getInstance(){
if(uniqueInstance == null){
uniqueInstance = new Singleton1();
}
return uniqueInstance;
}
//other functions
}
package Chapter5_SingletonPattern.Multithread;
/**
* @Author 竹心
* @Date 2023/8/5
**/
public class Singleton2 {
//急切創(chuàng)建實例:在靜態(tài)初始化器中就創(chuàng)建實例
private static Singleton2 uniqueInstance = new Singleton2();
private Singleton2(){}
public static Singleton2 getInstance(){
return uniqueInstance;
}
//other functions
}
package Chapter5_SingletonPattern.Multithread;
import Chapter5_SingletonPattern.origin.Singleton;
/**
* @Author 竹心
* @Date 2023/8/5
**/
public class Singleton3 {
//用雙重檢查加鎖減少使用同步,降低開銷
private volatile static Singleton3 uniqueInstance;
//volatile保證uniqueInstance為單實例類的時候多個線程正確處理
private Singleton3(){}
public static Singleton3 getInstance(){
if(uniqueInstance == null){
synchronized (Singleton3.class){
if(uniqueInstance == null){//進(jìn)入同步區(qū)塊后,再檢查一次
uniqueInstance = new Singleton3();
}
}
}
return uniqueInstance;
}
}
Notes:
單件模式: 確保一個類只有一個實例,并提供一個全局的訪問點
文章來源:http://www.zghlxwxcb.cn/news/detail-640351.html
到了這里,關(guān)于《HeadFirst設(shè)計模式(第二版)》第五章代碼——單例模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!