java設計優(yōu)化之單例模式
單例模式是一種對象創(chuàng)建模式,確保系統(tǒng)中一個類只有一個實例。
在java語言中,這樣做有兩大好處:
1.對于頻繁使用的對象,可以省略創(chuàng)建對象所話費的時間;
2.由于new操作的次數減少,對于系統(tǒng)內存的使用頻率降低,這樣減少GC的壓力,縮短GC停頓的時間。
單例模式細分:
1.
public class Singleton{
private Singleton(){
System.out.println("Singleton.Singleton()");
}
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
}
注意:首先單例類必須有一個private訪問級別的構造函數,確保單例不會被系統(tǒng)其他代碼實例化;其次,singleton成員變量和getInstance()方法必須是static的。
這個單例類創(chuàng)建十分簡單,而且非??煽?。唯一的缺點是無法對singleton做延遲加載,例如由于單例創(chuàng)建過程很慢,由于成員變量定義為static,在jvm加載單例類時,單例對象也會被創(chuàng)建,那么在任何用到單例類的地方都會創(chuàng)建單例對象,不管單例對象是否被用到。例如:
public class Singleton{
private Singleton(){
System.out.println("Singleton.Singleton()");
}
private static Singleton singleton = new Singleton();
public static Singleton getInstance(){
return singleton;
}
public static void createString(){
System.out.println("Singleton.createString()");
}
}
2.為了提高相關函數的調用速度,就需要引入懶加載機制。
package com.luchao.singtonle;
public class LazySingleton {
private LazySingleton() {
System.out.println("LazySingleton.LazySingleton()");
}
private static LazySingleton lazyInstance = null;
public synchronized static LazySingleton getInstance(){
if(lazyInstance==null)
lazyInstance = new LazySingleton();
return lazyInstance;
}
}
對于靜態(tài)變量singleton初始化賦值為null,確保系統(tǒng)啟動時沒有額外的負荷。在getInstance()方法中,判斷當前實例十分已經存在,如果存在則返回,如果不存在,再建單例。getInstance()必須為同步方法,因為在多線程環(huán)境下,當線程1正在建單例,未完成賦值前,線程2可能判斷instance為null,故線程2將啟動建立新建單例的程序,導致多個單例被創(chuàng)建。
上面實例單例實現(xiàn),雖然實現(xiàn)了延遲加載,但是引入了同步方法,在多線程環(huán)境下,耗時遠大于第一個單例程序。
3.單例模式使用內部類來維護單例的創(chuàng)建
public class StaticSingleton {
private StaticSingleton() {
System.out.println("StaticSingleton.StaticSingleton()");
}
private static class SingletonHolder{
private static StaticSingleton ataticSingleton = new StaticSingleton();
}
public static StaticSingleton getInstance(){
return SingletonHolder.ataticSingleton;
}
}
StaticSingleton被加載時,內部類不會被實例化,確保StaticSingleton類被載入jvm時,不會被初始化單例類,而當getInstance()方法被調用時,才加載SingletonHolder,從而初始化instance。同時用于實例的建立在類加載時完成,故天生對線程友好。
使用內部類完成單利模式,既可以做到延遲加載,也不用使用同步關鍵字,是一種比較完善的做法。
以上就是本文的全部內容希望對大家的學習有所幫助。
相關文章
springboot多數據源使用@Qualifier自動注入無效的解決
這篇文章主要介紹了springboot多數據源使用@Qualifier自動注入無效的解決,具有很好的參考價值,希望對大家有所幫助。也希望大家多多支持腳本之家2021-11-11
SpringBoot整合Netty實現(xiàn)WebSocket的示例代碼
本文主要介紹了SpringBoot整合Netty實現(xiàn)WebSocket的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-05-05
在已經使用mybatis的項目里引入mybatis-plus,結果不能共存的解決
這篇文章主要介紹了在已經使用mybatis的項目里引入mybatis-plus,結果不能共存的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
詳解JAVAEE——SSH三大框架整合(spring+struts2+hibernate)
這篇文章主要介紹了詳解JAVAEE——SSH三大框架整合(spring+struts2+hibernate),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

