简介
单例模式是创建型设计模式的一种。用来保证整个系统某个类的实例只有一个。
实现
1.饿汉式-静态常量实现
class Singleton {
private Singleton() {
}
private static final Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
该实例对象是在类加载是创建,保证了线程的安全,缺点是可能造成内存的浪费,实际中可以使用
2.饿汉式-静态代码块
class Singleton {
private Singleton() {
}
private static Singleton instance;
static {
instance = new Singleton();
}
public static Singleton getInstance() {
return instance;
}
}
和上面的一样,换了个写法
3.懒汉式
class Singleton {
private Singleton() {
}
private static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
懒汉式能够实现懒加载(用到的时候创建)的效果,但是存在的线程安全的问题。当instance为null,多个线程调用getInstance方法时可能创建多个实例对象。在实际中不要使用
4.懒汉式-加锁实现
class Singleton {
private Singleton() {
}
private static Singleton instance;
public synchronized static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
该方法可以解决线程安全的问题,但是对getInstance整个方法加锁会导致效率问题。不建议使用
5.双检查实现
class Singleton {
private Singleton() {
}
private static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
可以实现懒加载,同时避免了线程问题,实际中可以使用
6.静态内部类实现
class Singleton {
private Singleton() {
}
private static Singleton instance;
private static class SingletonInstance {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.instance;
}
}
外部类的加载不会触发静态内部类的加载,调研getInstance方法才会去触发静态内部类的加载,instance变量是在内部类类加载时创建,因此也是实现了懒加载和线程安装。实际中可以使用
枚举
public class SingletonTest {
public static void main(String[] args) {
Singleton instance = Singleton.INSTANCE;
}
}
enum Singleton {
INSTANCE;
public void complish() {
// 相关功能实现
}
}