-
单例模式 介绍
单例模式 是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。是java 23 中设计模式中最简单的设计模式。
-
单例模式 优点:
系统内存中该类只存在一个对象的实例,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
-
单例模式 几种实现
1. 懒汉式
a.静态常量
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
这种方法 起到了Lazy Loading的效果,但是只能在单线程下使用。
如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,
另一个线程也通过了这个判断语句,这时便会产生多个实例。
所以在多线程环境下不可使用这种方式。
b.方法加锁
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
缺点:效率太低了。
c.同步代码块
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
singleton = new Singleton();
}
}
return singleton;
}
}
该方法通过缩小锁定范围来提高代码效率。
2.饿汉模式
a.静态常量
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
b.静态代码块
public class Singleton {
private static Singleton instance;
static {
instance = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
3.静态内部类
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
采用了类装载的机制来保证初始化实例时只有一个线程
在需要实例化时,调用getInstance方法,才会装载SingletonInstance类,从而完成Singleton的实例化。
4.枚举类
public enum SingletonDemo{
INSTANCE;
public void otherMethods(){
System.out.println("INSTANCE");
}
}
5.双重校验锁
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
6.ThreadLocal实现单例模式
public class Singleton {
private static final ThreadLocal<Singleton> tlSingleton =
new ThreadLocal<Singleton>() {
@Override
protected Singleton initialValue() {
return new Singleton();
}
};
public static Singleton getInstance() {
return tlSingleton.get();
}
private Singleton() {}
}
7.cas
public class Singleton {
/** 利用AtomicReference */
private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<Singleton>();
/**
* 私有化
*/
private Singleton(){
}
/**
* 用CAS确保线程安全
*/
public static final Singleton getInstance(){
for (;;) {
Singleton current = INSTANCE.get();
if (current != null) {
return current;
}
current = new Singleton();
if (INSTANCE.compareAndSet(null, current)) {
return current;
}
}
}