单例模式

饿汉模式

线程安全,比较常用,但容易产生垃圾,因为一开始就初始化。

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}
  • 声明变量instance为私有静态变量,且直接实例化,在类加载的时候就实例化出来,且只有这一次实例化,所以是单例的;
  • 要声明构造函数是私有的,只有在本类中才能实例化,否则,该类可以在外部实例化就不能保证是单例的了;
  • 声明一个public静态方法getInstance,把前面实例化出来的对象返回即可。

懒汉双重锁模式

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
        if (singleton == null) {  
            singleton = new Singleton();  
        }  
        }  
    }  
    return singleton;  
    }  
}
  • 同样要声明构造函数是私有的,只有在本类中才能实例化,否则,该类可以在外部实例化就不能保证是单例的了;
  • 由于singleton=new Singleton()对象的创建在JVM中可能会进行重排序,在多线程访问下存在风险,使用volatile修饰signleton实例变量有效,解决该问题。
  • 双重检查模式,进行了两次的判断,外面是为了避免实例化后还进锁,里面是为了进行同步,避免多线程问题,防止在多线程下多个线程进入锁后重复实例化。

你可能感兴趣的:(设计模式)