单例设计模式

本文详细介绍了单例设计模式的概念及其两种实现方式:饿汉单例和懒汉单例。饿汉单例在类加载时初始化实例,确保线程安全;懒汉单例则在第一次调用时才创建实例,但需解决多线程同步问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例子设计模式

1、概述

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

2、饿汉和懒汉单例设计模式

2、1饿汉单例模式

饿汉单例代码coding

/**
 * <h3>饿汉单例设计模式</h3><br>
* 备注:饿汉单例设计模式不会出现多线程安全问题。
* @author @xuyi
* @Date @2016年4月5日 @下午10:11:33
* @类名 @HungrySingleton
* @描述
* @春风十里不如你
*/
public class HungrySingleton {

// 标准的写法应该是这样的,使用final 修饰,一声明就初始化对象。
private static final HungrySingleton SINGLETON = new HungrySingleton();

// 私有化构造方法
private HungrySingleton() {
}
// 获得单例对象的静态方法
public static HungrySingleton getInstance() {
    return SINGLETON;
}
}

2、2懒汉单例模式(延迟加载)

懒汉单例代码coding

/**
* <h3>懒汉单例设计模式(又称延迟加载设计模式)</h3> <br>
* 备注:多线程情况下,如果设计不好会出现线程安全问题。
* @author @xuyi
* @Date @2016年4月5日 @下午10:00:04
* @类名 @LazySingleto
* @描述
* @春风十里不如你
*/
public class LazySingleton {

// 单例对象声明
private volatile static LazySingleton singleton = null;//使用volatile修饰是为了下面双重判断的,保证多线程之间的可见性。

// 私有化构造方法
private LazySingleton() {
}

// 获得单例静态方法(单线程情况下,这种写法没有问题多线程就会出现问题了)
public static LazySingleton getInstance1() {
    if (singleton == null) {
        singleton =new LazySingleton();
    } 
        return singleton;
}

// 获得单例静态方法(多线程也适用)
public static LazySingleton getInstance2() {
    synchronized (LazySingleton.class) {
        if (singleton == null) {
            singleton =new LazySingleton();
        } 
            return singleton;
    }
}

// 获得单例静态方法(多线程也适用,并且在并发比较高的时候可以提高性能操作)
public static LazySingleton getInstance3() {
    if (singleton == null) {
        synchronized (LazySingleton.class) {
            if (singleton == null) {
                singleton = new LazySingleton();
            } 
                return singleton;
        }
    } else
        return singleton;
    // 通过二次判断signleton是否为空来避免每次都判断线程是否持有锁对象。
}
}

3、应用场景和总结

…待补充


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值