java中单例模式singleton

Posted youxin2012

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中单例模式singleton相关的知识,希望对你有一定的参考价值。

单例模式:在上下文中只有一个对象的实例。
应用场景:线程池,缓存等一个系统只需要一个的场景。

三种常见单例模式:
1. 延迟加载

public class Singleton 
    private static Singleton uniqueInstance;

    private Singleton() 

    public static Singleton getInstance() 
        if (uniqueInstance == null)
            uniqueInstance = new Singleton();
        return uniqueInstance;
    

使用时通过调用类的静态方法来获取:
Singleton singleton =Singleton.getInstance();

存在问题:多线程同步问题
多线程在第一次生成对象时,存在同时执行 if (uniqueInstance == null) 判断的可能,从而同时多次 new实例

改进:

public class SynSingleton 
    private static SynSingleton uniqueInstance;

    private SynSingleton() 

    public static synchronized SynSingleton getInstance() 
        if (uniqueInstance == null)
            uniqueInstance = new SynSingleton();
        return uniqueInstance;
    

如此通过synchronized代码块的方式,实现同步。
2. 急切实例化
上述方式每次在获取对象时,都要做同步synchronized操作,开销较大,而同步操作仅在第一次new时有效(随后每次调用均不做new操作,相当于只读不写),因此可以在类加载时就new对象,随后则不在做new操作,改进如下:

public class UrgSingleton 
    private static UrgSingleton uniqueInstance = new UrgSingleton();
    private UrgSingleton() 

    public static UrgSingleton getInstance() 
        return uniqueInstance;
    

延迟实例化与急切实例化的优缺点也较明显:
如果此对象开销较大,而整个过程又没有利用,则急切实例化出来的对象,白白消耗了资源。
而延时实例化同步问题,存在开销较大的情况,于是有了 下面的双重检查加锁方式。
3. 双重检查加锁

public class DoubleSynSingleton 
    private static volatile DouleSynSingleton uniqueInstance;

    private DoubleSynSingleton() 
    public static DoubleSynSingleton getInstance() 
        if (uniqueInstance == null) 
            synchronized(DoubleSynSingleton.class) 
                if(uniqueInstance == null)
                    uniqueInstance = new DoubleSynSingleton();
            
        
        return uniqueInstance;
    

如上所示,仅当第一次new对象时,使用synchronized方法,随后获取对象实例时都在外层的 if (uniqueInstance == null) 判断后完成退出,不要随后的同步代码块。如此,性能得到提升。

以上是关于java中单例模式singleton的主要内容,如果未能解决你的问题,请参考以下文章

java中单例设计模式

Java-单例模式(singleton)-转载

Java中单例模式的安全性分析

一天一个设计模式 -单例模式(Singleton)

Android与设计模式——单例(Singleton)模式

java单利模式设计