详解:设计模式之-单例设计模式
分享一波:程序員賺外快-必看的巔峰干貨
前言
近期預(yù)計(jì)1-2周左右會(huì)更新設(shè)計(jì)模式專題文章。
單例設(shè)計(jì)模式:保證在一個(gè)JVM中,只能存在一個(gè)實(shí)例。
應(yīng)用場景:Servlet,Spring IOC,線程池,連接池,Spring AOP
單例設(shè)計(jì)模式的優(yōu)缺點(diǎn)
好處:節(jié)約內(nèi)存,重復(fù)利用,方便管理
缺點(diǎn):存在線程安全問題
單例設(shè)計(jì)模式分類
餓漢式:類初始化時(shí),會(huì)立即加載該對象,線程天生安全,調(diào)用效率高。
懶漢式: 類初始化時(shí),不會(huì)初始化該對象,真正需要使用的時(shí)候才會(huì)創(chuàng)建該對象,具備懶加載功能。
靜態(tài)內(nèi)部方式:結(jié)合了懶漢式和餓漢式各自的優(yōu)點(diǎn),真正需要對象的時(shí)候才會(huì)加載,加載類是線程安全的。
枚舉單例: 使用枚舉實(shí)現(xiàn)單例模式 優(yōu)點(diǎn):實(shí)現(xiàn)簡單、調(diào)用效率高,枚舉本身就是單例,由jvm從根本上提供保障。避免通過反射和反序列化的漏洞, 缺點(diǎn)沒有延遲加載。
5.雙重檢測鎖方式 (因?yàn)镴VM本質(zhì)重排序的原因,可能會(huì)初始化多次,不推薦使用)
其中 ,餓漢式和懶漢式使用最為普遍
餓漢式創(chuàng)建單例
/**
-
餓漢式
/
public class User01 {
/*- 類初始化時(shí),會(huì)立即加載該對象,線程天生安全,調(diào)用效率高
*/
private static User01 singletonDemo01 = new User01();
private User01() {
System.out.println(“SingletonDemo01初始化”);
}public static User01 getInstance() {
System.out.println(“getInstance”);
return singletonDemo01;
}public static void main(String[] args) {
User01 s1 = User01.getInstance();
User01 s2 = User01.getInstance();
System.out.println(s1 == s2);
} - 類初始化時(shí),會(huì)立即加載該對象,線程天生安全,調(diào)用效率高
}
懶漢式創(chuàng)建單例
/**
-
懶漢式
*/
public class User02 {/**
- 類初始化時(shí),不會(huì)初始化該對象,真正需要使用的時(shí)候才會(huì)創(chuàng)建該對象。
*/
private static User02 singletonDemo02;
private User02() {
}
public synchronized static User02 getInstance() {
if (singletonDemo02 == null) {
singletonDemo02 = new User02();
}
return singletonDemo02;
}public static void main(String[] args) {
User02 s1 = User02.getInstance();
User02 s2 = User02.getInstance();
System.out.println(s1 == s2);
} - 類初始化時(shí),不會(huì)初始化該對象,真正需要使用的時(shí)候才會(huì)創(chuàng)建該對象。
}
靜態(tài)內(nèi)部類方式創(chuàng)建單例
/**
-
靜態(tài)內(nèi)部類方式
*/
public class SingletonDemo03 {
private SingletonDemo03() {
System.out.println(“初始化…”);
}public static class SingletonClassInstance {
private static final SingletonDemo03 singletonDemo03 = new SingletonDemo03();
}// 方法沒有同步
public static SingletonDemo03 getInstance() {
System.out.println(“getInstance”);
return SingletonClassInstance.singletonDemo03;
}public static void main(String[] args) {
SingletonDemo03 s1 = SingletonDemo03.getInstance();
SingletonDemo03 s2 = SingletonDemo03.getInstance();
System.out.println(s1 == s2);
}
}
優(yōu)勢:兼顧了懶漢模式的內(nèi)存優(yōu)化(使用時(shí)才初始化)以及餓漢模式的安全性(不會(huì)被反射入侵)。
劣勢:需要兩個(gè)類去做到這一點(diǎn),雖然不會(huì)創(chuàng)建靜態(tài)內(nèi)部類的對象,但是其 Class 對象還是會(huì)被創(chuàng)建,而且是屬于永久帶的對象。
枚舉方式創(chuàng)建單例
enum UserEnum {
HTTP_200(200, “請求成功”),HTTP_500(500,“請求失敗”);
private Integer code;
private String name;
UserEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
public Integer getCode() {
return code;
}
}
public class TestEnum {
public static void main(String[] args) {System.out.println(UserEnum.HTTP_500.getCode()); }}
public class User {
public static User getInstance() {
return SingletonDemo04.INSTANCE.getInstance();
}
}
分享一波:程序員賺外快-必看的巔峰干貨
如果以上內(nèi)容對你覺得有用,并想獲取更多的賺錢方式和免費(fèi)的技術(shù)教程
請關(guān)注微信公眾號:HB荷包
一個(gè)能讓你學(xué)習(xí)技術(shù)和賺錢方法的公眾號,持續(xù)更新
總結(jié)
以上是生活随笔為你收集整理的详解:设计模式之-单例设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CGLib动态代理原理及实现
- 下一篇: 如何将hive查询结果导出成txt文件