单例设计模式八种方式——5) 懒汉式(线程安全,同步代码块) 6) 双重检查 7) 静态内部类 8) 枚举
懶漢式(線程安全,同步代碼塊)應用實例
優缺點說明:
1) 這種方式,本意是想對第四種實現方式的改進,因為前面同步方法效率太低, 改為同步產生實例化的的代碼塊
2) 但是這種同步并不能起到線程同步的作用。跟第3種實現方式遇到的情形一 致,假如一個線程進入了if (singleton == null)判斷語句塊,還未來得及往下執行, 另一個線程也通過了這個判斷語句,這時便會產生多個實例
3) 結論:在實際開發中,不能使用這種方式
雙重檢查
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());}}// 懶漢式(線程安全,同步方法) class Singleton {private static volatile Singleton instance;private Singleton() {}//提供一個靜態的公有方法,加入雙重檢查代碼,解決線程安全問題, 同時解決懶加載問題//同時保證了效率, 推薦使用public static synchronized Singleton getInstance() {if(instance == null) {synchronized (Singleton.class) {if(instance == null) {instance = new Singleton();}}}return instance;} }優缺點說明:
1) Double-Check概念是多線程開發中常使用到的,如代碼中所示,我們進行了兩次if (singleton == null)檢查,這樣就可以保證線程安全了。
2) 這樣,實例化代碼只用執行一次,后面再次訪問時,判斷if (singleton == null),
? ? 直接return實例化對象,也避免的反復進行方法同步.
3) 線程安全;延遲加載;效率較高
4) 結論:在實際開發中,推薦使用這種單例設計模式
靜態內部類
SingletonTest07.java
package com.atguigu.singleton.type7;public class SingletonTest07 {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());}}// 靜態內部類完成, 推薦使用 class Singleton {//構造器私有化private Singleton() {}//寫一個靜態內部類,該類中有一個靜態屬性 Singletonprivate static class SingletonInstance {private static final Singleton INSTANCE = new Singleton(); }//提供一個靜態的公有方法,直接返回SingletonInstance.INSTANCEpublic static synchronized Singleton getInstance() {return SingletonInstance.INSTANCE;} }優缺點說明:
1) 這種方式采用了類裝載的機制來保證初始化實例時只有一個線程。
2) 靜態內部類方式在Singleton類被裝載時并不會立即實例化,而是在需要實例化時,調用getInstance方法,才會裝載SingletonInstance類,從而完成Singleton的實例化。
3) 類的靜態屬性只會在第一次加載類的時候初始化,所以在這里,JVM保證了線程的安全性,在類進行初始化時,別的線程是無法進入的。
4) 優點:避免了線程不安全,利用靜態內部類特點實現延遲加載,效率高
5) 結論:推薦使用.
枚舉
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();} }//使用枚舉,可以實現單例, 推薦 enum Singleton {INSTANCE; //屬性public void sayOK() {System.out.println("ok~");} }優缺點說明:
1) 這借助JDK1.5中添加的枚舉來實現單例模式。不僅能避免多線程同步問題,而且還能防止反序列化重新創建新的對象。
2) 這種方式是Effective Java作者Josh Bloch 提倡的方式
3) 結論:推薦使用
總結
以上是生活随笔為你收集整理的单例设计模式八种方式——5) 懒汉式(线程安全,同步代码块) 6) 双重检查 7) 静态内部类 8) 枚举的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单例设计模式介绍||单例设计模式八种方式
- 下一篇: 单例模式在JDK 应用的源码分析||单例