单例模式

Posted colinzh

tags:

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

模式定义

确保一个类只有一个示例,并提供一个全局的访问点。

示例

经典模式:多线程问题,多个线程处理时会可能有多个实例,懒汉式

/**
 * 单例模式
 *
 * @author Colin
 * @create 2018-04-25
 **/
public class Singleton {

    private static Singleton singleton;

    private Singleton(){

    }

    public static Singleton getInstance(){
        //线程1 
        if (singleton == null){
        //线程2 多线程问题
            singleton= new Singleton();
        }
        return singleton;
    }
}

同步锁:每次获取示例时都要加锁,性能上会有影响。只要在第一次创建实例的时候加锁处理即可。懒汉式线程安全

/**
 * 加锁的单例模式
 *
 * @author Colin
 * @create 2018-04-25
 **/
public class Singleton2 {

    private static Singleton2 singleton;

    private Singleton2(){

    }

    public static synchronized Singleton2 getInstance(){
        if (singleton == null){
            singleton= new Singleton2();
        }
        return singleton;
    }
}

静态加载:如果对象比较大在类加载时就进行初始化,可能影响类的初始化速度。饿汉式

/**
 * 单例模式
 *
 * @author Colin
 * @create 2018-04-25
 **/
public class Singleton1 {
    private static Singleton1 singleton=new Singleton1();

    private Singleton1(){}

    public static Singleton1 getInstance(){
        return singleton;
    }
}

双重锁定:只在第一次初始化时加锁


/**
 * 双重检查锁
 *
 * @author Colin
 * @create 2018-04-25
 **/
public class Singleton3 {

    private static Singleton3 singleton3;

    private Singleton3(){}

    public static Singleton3 getInstance(){
        if (singleton3 == null){
            synchronized (Singleton3.class){
                if (singleton3 == null){
                    singleton3=new Singleton3();
                }
            }
        }
        return singleton3;
    }

}

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

常用代码片段

性能比较好的单例写法

片段作为 Android 中的单例

单例片段或保存网页视图状态

你熟悉的设计模式都有哪些?写出单例模式的实现代码

单例模式以及静态代码块