单例模式
单例模式
单例模式是一种常用的软件设计模式。
在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。即一个类只有一个对象实例。
就种数来说常用的有两种:懒汉模式和饿汉模式。
饿汉模式:
//饿汉模式不安全
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 ;
}
}