单例模式

单例模式:保证一个类只有一个实例,并只提供一个它的全局访问点。

1、饿汉模式

public class Singleton
{
       private static Singleton instance = new Singleton();
       private Singleton()
       {
       }  
       public static Singleton getInstance()
       {
            return instance;
       }    
}  

这种方式在加载时就完成了初始化,所以类加载比较慢,但获取对象的速度比较快。这种基于类加载的机制避免了多线程的同步问题。

2、懒汉模式

public class Singleton
{
    private static Singleton instance;
    private Singleton()
    {
    
    }
    public static Singleton getInstance
    {
        if(instance == null)
        {
            instance = new Singleton();
        }
        return instance;
    }
}

懒汉模式申请了一个静态对象,在用户第一次调用的时候初始化,虽然节约了资源,但第一次加载时需要实例化反应稍微慢一些,而且在多线程的情况下不能使用。
3、懒汉模式(线程安全)

public class Singleton
{
    private static Singleton instance;
    private Singleton()
    {
    
    }
    public static sychronized Singleton getInstance()
    {
        if(instance == null)
        {
            instance = new Singleton();
        }
        return instance;
    }
}

这种写法能够在多线程中很好的工作,但是每次调用getInstance方法时都需要进行同步,造成不必要的同步开销,而且大部分时候我们是用不到同步的,所以不建议用这种模式。
4、双重校验锁

public class Singleton
{
    private volatile static Singleton instance;
    private Singleton()
    {
        
    }
    public static Singleton getInstance()
    {
        if(instance == null)
        {
            sychronized(Singleton.class)
            {
                if(instance == null)
                {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

这种写法在getInstance方法中对instance进行了两次判空,第一次是为了不必要的同步,第二次是在instance等于null的情况下才创建实例。

你可能感兴趣的:(单例模式)