单例模式

单例模式

单例模式是一种常用的软件设计模式。 
在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。

就种数来说常用的有两种:懒汉模式和饿汉模式。 

饿汉模式:

//饿汉模式不安全
public class Cat {
    private static Cat cat = new Cat();

    private Cat(){
    }
    public static Cat newInstance(){
        return cat;
    }

}

增强版饿汉模式:

public class Boss {
    // 1. 私有化构造器
    private Boss {}

    // 2. 定义实例的变量
    private static Boss instance;

    // 3. 通过静态方法创建或返回实例
    public static Boss getInstance () {
        if (instance == null) {
            instance = new Boss();  // 虽然构造器是私有的,但是可以在内部调用
        }
        return instance;
    }
}

双重检查锁版:

// 1. 将构造器私有化
private Boss() {}

// 2. 初始化一个静态变量
private static volatile Boss instance = null;

// 3. 构造一个静态方法,通过它初始化或返还对象
public static Boss getInstance() {
    // 双重检查锁机制
    if (instance == null) {
        synchronized (Boss.class) {
            if (instance == null) {
                instance = new Boss();
            }
        }
    }
    return instance;
}

其中:

  • synchronized 块尽量缩小了锁定的范围,提高效率
  • volatile 是为防止编译器指令重排而导致双重检查锁失效

懒汉模式:

public class Dog {  
    private static Dog dog ;  
    private Dog (){}  
    public static synchronized Dog newInstance() {  
    if (dog == null) {  
        dog = new Dog ();  
    }  
    return dog ;  
    }  
}  
原文地址:https://www.cnblogs.com/ljj5/p/9476995.html