推荐使用4、5、6种方式
设计模式主要分创建型模式、结构型模式和行为型模式。
单例模式,顾名思义就是只有一个实例,并且她自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。属于创建型模式。
核心:构造方法私有化,private
1.懒汉式,线程不安全
public class SingleObject {
private static SingleObject instance;
/**
* 让构造函数为 private,这样该类就不会被实例化
**/
private SingleObject() {
}
/**
* 调用时实例化
**/
public static SingleObject getInstance() {
if (instance == null) {
instance = new SingleObject();
}
return instance;
}
}
2.懒汉式,线程安全
public class SingleObject {
private static SingleObject instance;
/**
* 让构造函数为 private,这样该类就不会被实例化
**/
private SingleObject() {
}
/** 加锁实现线程访问 **/
public static synchronized SingleObject getInstance() {
if (instance == null) {
instance = new SingleObject();
}
return instance;
}
}
3.饿汉式
public class SingleObject {
/** 类加载时实例化 **/
private static SingleObject instance = new SingleObject();
/**
* 让构造函数为 private,这样该类就不会被实例化
**/
private SingleObject() {
}
public static SingleObject getInstance() {
return instance;
}
}
4.双检锁/双重校验锁(DCL,即 double-checked locking)
public class SingleObject {
private static SingleObject instance;
/**
* 让构造函数为 private,这样该类就不会被实例化
**/
private SingleObject() {
}
/**
* 双重加锁 安全且在多线程情况下能保持高性能
* @return
*/
public static SingleObject getInstance() {
if (instance == null) {
synchronized (SingleObject.class) {
if (instance == null) {
instance = new SingleObject();
}
}
}
return instance;
}
}
5.静态内部类 与双检锁方式一样
public class SingleObject {
/**
* 让构造函数为 private,这样该类就不会被实例化
**/
private SingleObject() {
}
/**
* 静态内部类实现
*/
private static class SingletonHolder {
private static final SingleObject instance = new SingleObject();
}
public static SingleObject getInstance() {
return SingletonHolder.instance;
}
}
6.枚举
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}