Java设计模式-单例模式

Java设计模式——单例模式

描述:确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例

特点:
1、单例类只能有一个实例
2、单例类必须自己创建自己的唯一实例
3、单例类必须给所有其他对象提供这一实例

线程安全问题:
1、在获取单例的时候,要保证不能产生多个实例对象
2、注意单例对象内的实例变量是会被多线程共享的

实现单例模式方式
1、饿汉式:静态变量,静态代码快
2、懒汉式:线程不安全 、线程不安全,并发小、双重检测锁模式,简称DCL懒汉式
3、静态内部类
4、枚举

一、饿汉式
1、静态变量

/*
 * 静态变量方式
 */
public class SingletonHungry {
  
  private SingletonHungry() {}
  
  private final static SingletonHungry hungry = new SingletonHungry();
 
  public static SingletonHungry getInstance() {
      return hungry;
  }
}

2、静态代码快

/*
 * 静态代码快
 */
public class SingletonHungry {
  
  private SingletonHungry() {}
  private static SingletonHungry hungry;
  static {
      hungry = new SingletonHungry();
  }
  public static SingletonHungry getInstance() {
      return hungry;
  }
}

二、懒汉式
1、线程不安全

/*
 * 线程不安全
 */
public class SingletonLazyMan {   
    private SingletonLazyMan() {}
    private static SingletonLazyMan lazyMan;
    public static SingletonLazyMan getInstance() {
        if(null ==  lazyMan) {
            lazyMan = new SingletonLazyMan ();
        }
        return lazyMan;
    }
}

2、线程不安全,并发小

/*
 * 线程不安全,并发小
 */
public class SingletonLazyMan {   
    private SingletonLazyMan() {}
    private static SingletonLazyManlazyMan;
    public static synchronized SingletonLazyMan getInstance() {
        if(null ==  lazyMan) {
            lazyMan = new SingletonLazyMan();
        }
        return lazyMan;
    }
}

3、双重检测锁模式:简称DCL懒汉式

/*
 * 效率高,延迟加载,线程安全,推荐使用
 */
public class SingletonLazyMan{   
    private SingletonLazyMan() {}
    private volatile static SingletonLazyMan lazyMan;
    // 双重检测锁模式,简称DCL懒汉式
    public static SingletonLazyMan getInstance() {
        if(null == lazyMan) {
            synchronized (SingletonLazyMan.class) {
                if(null == SingletonLazyMan) {
                    lazyMan = new SingletonLazyMan();
                }
            }
        }
        return lazyMan;
    }
}

三、静态内部类
静态内部类

/*
 * 避免了线程不安全,延迟加载,效率高,推荐使用
 */
public class SingletonStaticInner {
    
    private SingletonStaticInner() {}
    
    private static class InnerClass{
        private static final SingletonStaticInner INSTANCE = new SingletonStaticInner();
    }
    
    public static SingletonStaticInner getInstance() {
        return InnerClass.INSTANCE;
    }
}

四、枚举
枚举

/*
 * 防止反射破坏,推荐使用
 */
public enum EnumSingle {
    INSTANCE;
    public EnumSingle getInstance(){
        return INSTANCE;
    }
}
posted @ 2022-04-07 17:33  why0703  阅读(64)  评论(0编辑  收藏  举报