单例模式的几种写法

简介: 【10月更文挑战第10天】

单例模式是一种常见的设计模式,主要确保一个类只有一个实例存在。
以下是几种常见的单例模式写法:

一、饿汉式

饿虎扑食般,在类加载时就创建单例对象。

public class SingletonHungry {
   
    // 私有构造函数,防止外部创建实例
    private SingletonHungry() {
   }

    // 静态私有成员,存储唯一实例
    private static final SingletonHungry instance = new SingletonHungry();

    // 公共静态方法,获取唯一实例
    public static SingletonHungry getInstance() {
   
        return instance;
    }
}

这种写法简单直接,线程安全,但可能会造成资源浪费(如果实例在一开始并不被需要)。

二、懒汉式(线程不安全)

这种方式在第一次调用获取实例的方法时才创建单例对象。

public class SingletonLazy {
   
    // 私有构造函数,防止外部创建实例
    private SingletonLazy() {
   }

    // 静态私有成员,存储唯一实例
    private static SingletonLazy instance;

    // 公共静态方法,获取唯一实例
    public static SingletonLazy getInstance() {
   
        if (instance == null) {
   
            instance = new SingletonLazy();
        }
        return instance;
    }
}

这种写法在多线程环境下可能会出现多个实例的问题,因为多个线程可能同时进入创建实例的代码块。

三、懒汉式(线程安全,同步方法)

为了解决线程不安全的问题,可以使用同步方法来保证线程安全。

public class SingletonLazySafeSync {
   
    // 私有构造函数,防止外部创建实例
    private SingletonLazySafeSync() {
   }

    // 静态私有成员,存储唯一实例
    private static SingletonLazySafeSync instance;

    // 公共静态方法,获取唯一实例,同步方法保证线程安全
    public static synchronized SingletonLazySafeSync getInstance() {
   
        if (instance == null) {
   
            instance = new SingletonLazySafeSync();
        }
        return instance;
    }
}

这种写法虽然保证了线程安全,但每次获取实例都需要进行同步,效率较低。

四、懒汉式(线程安全,双重检查锁)

通过双重检查锁来优化同步方法的效率问题。

public class SingletonLazySafeDCL {
   
    // 私有构造函数,防止外部创建实例
    private SingletonLazySafeDCL() {
   }

    // 静态私有成员,存储唯一实例
    private static SingletonLazySafeDCL instance;

    // 公共静态方法,获取唯一实例
    public static SingletonLazySafeDCL getInstance() {
   
        if (instance == null) {
   
            synchronized (SingletonLazySafeDCL.class) {
   
                if (instance == null) {
   
                    instance = new SingletonLazySafeDCL();
                }
            }
        }
        return instance;
    }
}

这种写法在保证线程安全的前提下,提高了效率,但在某些极端情况下可能会出现问题。

五、静态内部类方式

利用静态内部类来实现单例模式。

public class SingletonInnerClass {
   
    // 私有构造函数,防止外部创建实例
    private SingletonInnerClass() {
   }

    // 静态内部类,在类加载时创建单例实例
    private static class SingletonHolder {
   
        private static final SingletonInnerClass instance = new SingletonInnerClass();
    }

    // 公共静态方法,获取唯一实例
    public static SingletonInnerClass getInstance() {
   
        return SingletonHolder.instance;
    }
}

这种写法既保证了线程安全,又能实现延迟加载,是一种比较推荐的写法。

以上就是几种常见的单例模式写法,每种写法都有其特点和适用场景,

相关文章
|
安全
单例模式的写法
单例模式的写法
|
6月前
单例模式例子
单例模式例子
|
安全 Java
单例模式的8种写法
单例模式的8种写法
112 0
单例模式的8种写法
|
SQL 设计模式 安全
6. 单例模式有几种写法?
6. 单例模式有几种写法?
103 0
6. 单例模式有几种写法?
|
设计模式 安全 Java
设计模式-Singleton单例模式详解以及8种写法
设计模式-Singleton单例模式详解以及8种写法
|
SQL 设计模式 安全
|
设计模式 SQL 存储
【面试干货】单例模式的七种写法
【面试干货】单例模式的七种写法
175 0
【面试干货】单例模式的七种写法
|
设计模式 安全 Java
单例模式的七种写法,你都知道吗?
单例模式的七种写法,你都知道吗?
190 0
单例模式的七种写法,你都知道吗?
|
设计模式 安全
论单例的写法
有一回对我说道,“你学过设计模式么?”我略略点一点头。他说,“学过,……我便考你一考.设计模式的单例,怎样写的?”我想,讨饭一样的人,也配考我么?便回过脸去,不再理会.孔乙己等了许久,很恳切的说道,“不能写罢?……我教给你,记着!这些模式应该记着.将来当面试官的时候,面试要用.”我暗想我和面试官的等级还很远呢又好笑,又不耐烦,懒懒的答他道,“谁要你教?”孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说,“单例有六种写法,你知道么?
189 0