单例设计模式八种方式——5) 懒汉式(线程安全,同步代码块) 6) 双重检查 7) 静态内部类 8) 枚举
懶漢式(線(xiàn)程安全,同步代碼塊)應(yīng)用實(shí)例
優(yōu)缺點(diǎn)說(shuō)明:
1) 這種方式,本意是想對(duì)第四種實(shí)現(xiàn)方式的改進(jìn),因?yàn)榍懊嫱椒椒ㄐ侍?#xff0c; 改為同步產(chǎn)生實(shí)例化的的代碼塊
2) 但是這種同步并不能起到線(xiàn)程同步的作用。跟第3種實(shí)現(xiàn)方式遇到的情形一 致,假如一個(gè)線(xiàn)程進(jìn)入了if (singleton == null)判斷語(yǔ)句塊,還未來(lái)得及往下執(zhí)行, 另一個(gè)線(xiàn)程也通過(guò)了這個(gè)判斷語(yǔ)句,這時(shí)便會(huì)產(chǎn)生多個(gè)實(shí)例
3) 結(jié)論:在實(shí)際開(kāi)發(fā)中,不能使用這種方式
雙重檢查
SingletonTest06.java
package com.atguigu.singleton.type6;public class SingletonTest06 {public static void main(String[] args) {System.out.println("雙重檢查");Singleton instance = Singleton.getInstance();Singleton instance2 = Singleton.getInstance();System.out.println(instance == instance2); // trueSystem.out.println("instance.hashCode=" + instance.hashCode());System.out.println("instance2.hashCode=" + instance2.hashCode());}}// 懶漢式(線(xiàn)程安全,同步方法) class Singleton {private static volatile Singleton instance;private Singleton() {}//提供一個(gè)靜態(tài)的公有方法,加入雙重檢查代碼,解決線(xiàn)程安全問(wèn)題, 同時(shí)解決懶加載問(wèn)題//同時(shí)保證了效率, 推薦使用public static synchronized Singleton getInstance() {if(instance == null) {synchronized (Singleton.class) {if(instance == null) {instance = new Singleton();}}}return instance;} }優(yōu)缺點(diǎn)說(shuō)明:
1) Double-Check概念是多線(xiàn)程開(kāi)發(fā)中常使用到的,如代碼中所示,我們進(jìn)行了兩次if (singleton == null)檢查,這樣就可以保證線(xiàn)程安全了。
2) 這樣,實(shí)例化代碼只用執(zhí)行一次,后面再次訪(fǎng)問(wèn)時(shí),判斷if (singleton == null),
? ? 直接return實(shí)例化對(duì)象,也避免的反復(fù)進(jìn)行方法同步.
3) 線(xiàn)程安全;延遲加載;效率較高
4) 結(jié)論:在實(shí)際開(kāi)發(fā)中,推薦使用這種單例設(shè)計(jì)模式
靜態(tài)內(nèi)部類(lèi)
SingletonTest07.java
package com.atguigu.singleton.type7;public class SingletonTest07 {public static void main(String[] args) {System.out.println("使用靜態(tài)內(nèi)部類(lèi)完成單例模式");Singleton instance = Singleton.getInstance();Singleton instance2 = Singleton.getInstance();System.out.println(instance == instance2); // trueSystem.out.println("instance.hashCode=" + instance.hashCode());System.out.println("instance2.hashCode=" + instance2.hashCode());}}// 靜態(tài)內(nèi)部類(lèi)完成, 推薦使用 class Singleton {//構(gòu)造器私有化private Singleton() {}//寫(xiě)一個(gè)靜態(tài)內(nèi)部類(lèi),該類(lèi)中有一個(gè)靜態(tài)屬性 Singletonprivate static class SingletonInstance {private static final Singleton INSTANCE = new Singleton(); }//提供一個(gè)靜態(tài)的公有方法,直接返回SingletonInstance.INSTANCEpublic static synchronized Singleton getInstance() {return SingletonInstance.INSTANCE;} }優(yōu)缺點(diǎn)說(shuō)明:
1) 這種方式采用了類(lèi)裝載的機(jī)制來(lái)保證初始化實(shí)例時(shí)只有一個(gè)線(xiàn)程。
2) 靜態(tài)內(nèi)部類(lèi)方式在Singleton類(lèi)被裝載時(shí)并不會(huì)立即實(shí)例化,而是在需要實(shí)例化時(shí),調(diào)用getInstance方法,才會(huì)裝載SingletonInstance類(lèi),從而完成Singleton的實(shí)例化。
3) 類(lèi)的靜態(tài)屬性只會(huì)在第一次加載類(lèi)的時(shí)候初始化,所以在這里,JVM保證了線(xiàn)程的安全性,在類(lèi)進(jìn)行初始化時(shí),別的線(xiàn)程是無(wú)法進(jìn)入的。
4) 優(yōu)點(diǎn):避免了線(xiàn)程不安全,利用靜態(tài)內(nèi)部類(lèi)特點(diǎn)實(shí)現(xiàn)延遲加載,效率高
5) 結(jié)論:推薦使用.
枚舉
SingletonTest08.java
package com.atguigu.singleton.type8;public class SingletonTest08 {public static void main(String[] args) {Singleton instance = Singleton.INSTANCE;Singleton instance2 = Singleton.INSTANCE;System.out.println(instance == instance2);System.out.println(instance.hashCode());System.out.println(instance2.hashCode());instance.sayOK();} }//使用枚舉,可以實(shí)現(xiàn)單例, 推薦 enum Singleton {INSTANCE; //屬性public void sayOK() {System.out.println("ok~");} }優(yōu)缺點(diǎn)說(shuō)明:
1) 這借助JDK1.5中添加的枚舉來(lái)實(shí)現(xiàn)單例模式。不僅能避免多線(xiàn)程同步問(wèn)題,而且還能防止反序列化重新創(chuàng)建新的對(duì)象。
2) 這種方式是Effective Java作者Josh Bloch 提倡的方式
3) 結(jié)論:推薦使用
總結(jié)
以上是生活随笔為你收集整理的单例设计模式八种方式——5) 懒汉式(线程安全,同步代码块) 6) 双重检查 7) 静态内部类 8) 枚举的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 单例设计模式介绍||单例设计模式八种方式
- 下一篇: 工厂设计模式——简单工厂模式——未完待续