温馨提示×

java单例模式的实现方法是什么

小亿
82
2024-02-02 09:48:44
栏目: 编程语言

Java单例模式的实现方法有以下几种:

  1. 懒汉式(Lazy Initialization): 在第一次使用时才创建实例。线程不安全版本的懒汉式实现如下:
public class Singleton {
    private static Singleton instance;

    private Singleton(){}

    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

可以通过在getInstance()方法上加锁synchronized来实现线程安全的懒汉式单例模式,但是会影响效率:

public class Singleton {
    private static Singleton instance;

    private Singleton(){}

    public static synchronized Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 饿汉式(Eager Initialization): 在类加载时就创建实例,线程安全。实现如下:
public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}

由于在类加载时就创建实例,因此无法实现延迟加载。

  1. 双重检查锁定(Double Checked Locking): 在懒汉式的基础上,进行双重检查,确保线程安全且效率较高:
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;
    }
}

使用volatile修饰instance变量可以保证多线程环境下的可见性和有序性。

  1. 静态内部类(Static Inner Class): 利用类的静态内部类来实现懒汉式的延迟加载和线程安全:
public class Singleton {
    private Singleton(){}

    private static class SingletonHolder{
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

静态内部类只有在第一次使用时才会被加载,从而实现了延迟加载。

  1. 枚举(Enum): 使用枚举类来实现单例模式,可以保证线程安全和防止反射攻击:
public enum Singleton {
    INSTANCE;

    public void doSomething(){
        // do something
    }
}

0