单例模式

来源:互联网 发布:c语言e语言 编辑:程序博客网 时间:2024/05/18 01:42

    单例模式可以分为5种,懒汉式/饿汉/枚举/静态内部类/双重校验锁

    懒汉:

    1. public class Singleton {  
    2.     private static Singleton instance;  
    3.     private Singleton (){}  
    4.     public static synchronized Singleton getInstance() {  
    5.     if (instance == null) {  
    6.         instance = new Singleton();  
    7.     }  
    8.     return instance;  
    9.     }  
    10. }  

    锁加在方法上,效率低。类不会自动加载,共享数据只在调用getInstance时才实例化。

     

    饿汉

    1. public class Singleton {  
    1.     private static Singleton instance = new Singleton();  
    2.     private Singleton (){}  
    3.     public static Singleton getInstance() {  
    4.     return instance;  
    5.     }  
    6. }  

    基于classloader机制避免了并发访问的冲突,而且不用加锁,效率较高。但在类加载过程中共享数据即实例化了,未实现lazy load

     

    枚举

    1. public enum Singleton {  
    2.     INSTANCE;  
    3.     public void whateverMethod() {  
    4.     }  

    据说是非常好的一种单例模式,解决了并发问题且实现lazy load。但写法诡异,不常用。

     

    静态内部类

     

    1. public class Singleton {  
    1.     private static class SingletonHolder {  
    2.     private static final Singleton INSTANCE = new Singleton();  
    3.     }  
    4.     private Singleton (){}  
    5.     public static final Singleton getInstance() {  
    6.     return SingletonHolder.INSTANCE;  
    7.     }  
    8. }  

    较为常用的一种单例。实现了lazy load。在外部类加载时不进行实例化,仅当getInstance()调用时才实例化内部类、实例化内部类中的静态变量。很好的机制,尤其在外部类可能在其他地方被多次使用时。而且是线程安全的,基于classloader的加载机制,内部类的构建依赖于外部类的构造函数,但外部类的构造函数是原子的,因此无需同步。

     

    双重校验锁

     

    1. public class Singleton {  
    2.     private volatile static Singleton singleton;  
    3.     private Singleton (){}  
    4.     public static Singleton getSingleton() {  
    5.     if (singleton == null) {  
    6.         synchronized (Singleton.class) {  
    7.         if (singleton == null) {  
    8.             singleton = new Singleton();  
    9.         }  
    10.         }  
    11.     }  
    12.     return singleton;  
    13.     }  
    14. }  

     

    也是较为常用的一种单例,但对性能有一定影响。

    总而言之,每种单例模式都有自己的适用范围。应根据具体的业务场景进行选择。

     

     

     

     

     

     

     

     

     

原创粉丝点击