java 单例

  1. 饿汉式单例模式:与 C# 中的实现方式相似,在程序启动时就创建单例对象,并在整个程序运行期间使用该对象。该方式比较简单,但是可能会影响程序的性能,因为即使不需要使用该对象,它也会一直存在于内存中。

以下是一个使用饿汉式单例模式的示例代码:

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}
View Code
  1. 懒汉式单例模式:与 C# 中的实现方式相似,在需要使用单例对象时才创建单例对象。需要注意的是,在多线程的环境中需要考虑线程安全问题。

以下是一个使用懒汉式单例模式的示例代码:

public class Singleton {
    private static Singleton instance = null;

    private Singleton() {}

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

 

该实现方式在单线程的环境中是可行的,但是在多线程的环境中会有并发安全问题,因为多个线程可能同时调用 getInstance 方法,导致创建多个实例。可以通过加锁的方式解决该问题,但是会影响程序的性能。为了避免这种情况,可以使用双重检查锁定或者静态内部类的方式实现懒汉式单例模式。

public class Singleton {
    private static volatile Singleton instance;
    
    private Singleton() {
        // private constructor
    }
    
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
View Code

在上面的实现方式中,volatile 关键字确保 instance 变量对所有线程可见,并避免了指令重排序导致的线程安全问题。synchronized 关键字用于确保在同一时间只有一个线程能够创建单例对象,从而避免了多个线程同时创建对象的问题。双重检查锁定能够确保在高并发环境下保持单例对象的唯一性,并且避免了不必要的同步操作,以提高程序性能。

posted @ 2023-03-30 00:19  elegydance  阅读(18)  评论(0编辑  收藏  举报