单例模式是最简单的设计模式之一。特点如下:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
闲话少说,下面来看单例模式的几种实现。
1、饿汉式(线程安全)
/**
* 单例模式-饿汉式
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton () {
}
public static Singleton getInstance() {
return instance;
}
}
优点:多线程安全,实现简单
缺点:没有做到延迟加载
2、懒汉式(线程不安全)
/**
* 单例模式-懒汉式,线程不安全
*/
public class Singleton {
private static Singleton instance;
private Singleton () {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
优点:懒加载
缺点:多线程环境下不安全
3、懒汉式(线程安全)
/**
* 单例模式-懒汉式,线程安全
*/
public class Singleton {
private static Singleton instance;
private Singleton () {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
优点:懒加载,线程安全
缺点:并发情况下性能低
4、双重检测锁机制
/**
* 单例模式-双重锁检测
*/
public class Singleton {
// volatile 防止指令重排
private static volatile Singleton instance;
private Singleton () {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
优点:懒加载,多线程安全
缺点:编写复杂
5、枚举方式
/**
* 单例模式-枚举方式
*/
public enum Singleton {
INSTANCE;
public void someMethod() {
}
}
优点:多线程安全;支持序列化
缺点:原理比较难理解
6、静态内部类
/**
* 单例模式-静态内部类
*/
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
}
优点:多线程安全
缺点:原理比较难理解