设计模式单例模式

有时候有一些只允许有一个实例的类需要用单例模式实现

  1. 单例模式可以分为
  • 饿汉(很饥渴,有就吃,类加载时就创建对象)
  • 饱汉(不饥渴,饿了再吃,用到类实例时才创建对象)
  • 双重锁模式
/**
 * 单例模式 饿汉模式
 * Created by wjj on 2021/1/3
 */
public class Singleton {
    private Singleton(){}

    private static Singleton instance=new Singleton();//类加载时就创建实例

    public static Singleton getInstance() {
        return instance;
    }
}
/**
 * 懒汉模式
 * Created by wjj on 2021/1/3
 */
public class Singleton2 {
    private Singleton2() {
    }

    private static Singleton2 instance;

    public static Singleton2 getInstance() {//先判断有木有实例,没有在实例化
        if(instance==null)
            instance=new Singleton2();
        return instance;
    }
}
  1. 懒汉与饿汉的比较
  • 体现在加载时间上不同:饿汉模式在类加载时就建对象,所以加载时比较慢,获取对象比较快;相反,懒汉模式在类加载时比较快,但是获取对象时比较慢
  • 体现在线程安全问题上:饿汉模式在类加载时建对象,所以是线程安全的,但是懒汉模式在并发时会造成线程不安全
    为了解决以上问题,我们可以引出第三种单例模式

3.双重锁模式

//在包含
public class Singleton3 {
    public Singleton3() {
    }
    private static Singleton3 instance;

    public static Singleton3 getInstance() {
        if(instance==null){
            synchronized (Singleton.class){//通过加锁解决线程安全问题
                if(instance==null)
                    instance=new Singleton3();
            }
        }
        return instance;
    }
}

饱汉模式的基础上加入了锁机制,解决了线程不安全的问题

原文地址:https://www.cnblogs.com/wjune-0405/p/14226981.html