5.单例模式

单例模式:保证任何情况下都绝对的只生成一个实例的模式。

①.单例角色

  • Singleton: 有且仅有的一个角色(实例)。

Tips:当存在多个实例时,实例间互相影响,会出现意想不到异常。当且仅当,第一次调用类中静态方法的时候,Singleton类会被初始化,生成唯一的静态实例,重复调用时直接返回已经初始化完成的实例。

②.实现单例

  • 方式一:简化实现的单例模式
public class Singleton {
    private static Singleton singleton=null;
    /*
        私有化,不给外界直接new的机会
     */
    private Singleton() {
    }
    /*
        1.简化实现的单例模式,但遇到多线程肯定有问题
     */
    public static Singleton getInstance(){
        if (singleton==null){
            singleton=new Singleton();
        }
        return singleton;
    }
}
  • 方式二:加锁控制多线程
public class Singleton {
    private static Singleton singleton=null;
    /*
        私有化,不给外界直接new的机会
     */
    private Singleton() {
    }
    /*
        2.通过加锁进行控制多线程临界资源冲突,不推荐,对线程资源消耗大
     */
    public static synchronized Singleton getInstance(){
        if(singleton==null){
            singleton=new Singleton();
        }
        return singleton;
    }
}
  • 方式三:懒汉模式
public class Singleton {
    /*
        私有化,不给外界直接new的机会
     */
    private Singleton() {
    }
    /*
       3.懒汉模式,直接new出来
     */
    privite  static Singleton singleton=new Singleton();
}
  • 方式四:双重加锁机制
public class Singleton {
    privite volatile static Singleton singleton=null;
    /*
        私有化,不给外界直接new的机会
     */
    private Singleton() {
    }
    /*
        4.双重加锁机制
     */
    public static Singleton getInstance(){
        if(singleton==null){
            synchronized(Singleton.class){
                if(singleton==null){
                    singleton=new Singleton();
                }
            }
        }
        return singleton;
    }
}

猜你喜欢

转载自www.cnblogs.com/stupidhao/p/12205829.html