Java中的Singleton模式实现
在软件开发中,Singleton模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。在Java中,有多种方法可以实现Singleton模式,本文将详细介绍这些方法。
1. 饿汉式
饿汉式是最简单的一种Singleton模式实现方式,它在类加载时就创建实例。因为在类加载时就创建实例,所以线程安全,但可能会造成资源浪费。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
2. 懒汉式(非线程安全)
懒汉式是在调用getInstance()
方法时才创建实例,如果多个线程同时调用getInstance()
方法,可能会创建多个实例,所以不是线程安全的。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
3. 懒汉式(线程安全,效率低)
为了解决懒汉式的线程安全问题,可以在getInstance()
方法上加锁,但会降低效率。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
4. 双重检验锁(线程安全)
双重检验锁是一种相对高效的线程安全的懒汉式实现方法,只在实例为null时加锁,避免了多次加锁的性能损耗。
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
5. 静态内部类
静态内部类方式是一种比较优雅的实现单例的方式。利用了静态内部类只会在被调用的时候才会加载,线程安全且能保证单例对象的唯一性。
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 doSomething() {
// do something
}
}
以上就是Java中常见的几种Singleton模式的实现方式,根据具体需求选择适合的方式进行使用。Singleton模式可以有效地控制对象的创建,并且是一种非常常用的设计模式。