单例模式懒汉式和饿汉式的区别

本文介绍了Java中的单例模式,包括其三大特点。详细讲解了饿汉式和懒汉式两种实现方式,饿汉式在类加载时即初始化单例,而懒汉式则在首次调用getInstance()时创建单例。

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

一、单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。并提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式具备三个特点:
1.该类实例唯一
2.实例必须自己创建
3.必须对外提供获取自己唯一实例的方法

二、懒汉式和饿汉式

饿汉式:
类一旦加载,就把单例对象初始化完成,保证外界通过调用方法获取实例是,单例是已经存在的了。

package cn.zz;
//本类测试单例模式饿汉式
public class SingletonEh {
    /*
     *是否 Lazy 初始化:否
     *是否多线程安全:是
     *实现难度:易
     *描述:这种方式比较常用,但容易产生垃圾对象。
     *优点:没有加锁,执行效率会提高。
     *缺点:类加载时就初始化,浪费内存。
     *它基于 classloder 机制避免了多线程的同步问题,
     * 不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,
     * 在单例模式中大多数都是调用 getInstance 方法,
     * 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,
     * 这时候初始化 instance 显然没有达到 lazy loading 的效果。
     */
    //1.构造方法私有化
    private SingletonEh (){}
    //2.创建单例对象
    private static SingletonEh instance = new SingletonEh();
    //3.创建获取单例对象的方法
    public static SingletonEh getInstance() {
        System.out.println("加载饿汉式....");
        return instance;
    }
}

懒汉式:
当外界调用getInstance()方法时才创建对象

package cn.zz;
//本类测试单例模式懒汉式
public class SingletonLh {
    /*
     *懒加载:是
     *多线程安全:否
     *实现难度:易
     *描述:加锁 synchronized,支持多线程。
     *这种方式 lazy loading 很明显加同步锁使线程安全,在多线程下正常工作。
     */
    //1.构造方法私有化
    private SingletonLh(){}
    //2.创建SingletonLh类属性用来指向对象
    private static SingletonLh instance;
    //3.创建方法获取懒加载单例对象,加synchronized,防止多线程抢占操作
    public static synchronized  SingletonLh getInstance() {
        //4.判断如果对象未创建,则去创建对象
        if(instance==null){
            instance=new SingletonLh();
        }
        return instance;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值