在Java编程中,单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。下面将详细介绍Java实现单例模式的7种方法,并附上应用案例。
1. 懒汉式(线程不安全)
懒汉式单例模式在类加载时不初始化,第一次使用时才创建实例。这种方式在多线程环境下不安全,因为多个线程可能会同时通过new关键字创建多个实例。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
应用案例:用于创建数据库连接池。
2. 懒汉式(线程安全,同步方法)
在懒汉式单例模式的基础上,通过同步方法确保线程安全。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
应用案例:用于创建文件操作类。
3. 懒汉式(线程安全,双重校验锁)
双重校验锁单例模式在第一次创建实例时进行同步,之后直接返回实例,提高了效率。
public class Singleton {
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;
}
}
应用案例:用于创建日志记录类。
4. 饿汉式
饿汉式单例模式在类加载时就初始化实例,保证了线程安全,但可能会造成资源浪费。
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
应用案例:用于创建配置文件读取类。
5. 静态内部类
静态内部类单例模式在类加载时并不初始化,只有当调用getInstance()方法时才会加载SingletonHolder类,从而创建Singleton实例。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
应用案例:用于创建缓存类。
6. 枚举
枚举单例模式是一种简洁且安全的单例实现方式。
public enum Singleton {
INSTANCE;
public void whateverMethod() {
// ...
}
}
应用案例:用于创建数据库连接池。
7. 延迟加载的静态内部类
延迟加载的静态内部类单例模式在类加载时并不初始化,只有当调用getInstance()方法时才会加载SingletonHolder类,从而创建Singleton实例。
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
应用案例:用于创建文件操作类。
以上就是Java实现单例模式的7种方法,每种方法都有其适用场景。在实际开发中,应根据具体需求选择合适的方法。
