千家信息网

Java中单例模式怎么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关Java中单例模式怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。注意1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例
千家信息网最后更新 2026年11月03日Java中单例模式怎么用

这篇文章给大家分享的是有关Java中单例模式怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

    注意

    1、单例类只能有一个实例。

    2、单例类必须自己创建自己的唯一实例。

    3、单例类必须给所有其他对象提供这一实例。

    优点

    1.在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

    2.避免对资源的多重占用(比如写文件操作)。

    缺点

    1.没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

    使用场景

    1.要求生产唯一序列号。

    2.WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

    3.创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

    一、实现方式

    package com.asurplus.common.singleton.style1;import lombok.extern.slf4j.Slf4j;import java.util.Objects;@Slf4jpublic class ResUtils {    private volatile static ResUtils instance = null;    /**     * 私有的构造方法     */    private ResUtils() {    }    /**     * 提供获取实例的方法     *     * @return     */    public static ResUtils getInstance() {        // 为空才创建        if (Objects.isNull(instance)) {            // 避免并发操作时            synchronized (ResUtils.class) {                // 为空才创建                if (Objects.isNull(instance)) {                    // 创建新对象                    instance = new ResUtils();                    log.info("创建了对象");                }            }        }        return instance;    }}

    我们将其构造方法私有化,从而外部无法创建实例,并且我们提供了获取唯一实例的方法,这样我们就能从外部得到该实例。

    二、实现方式

    package com.asurplus.common.singleton.style2;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class ResUtils2 {    /**     * 静态内部类     */    private static class ResUtils2Holder {        private static ResUtils2 instance = new ResUtils2();    }    /**     * 提供获取实例的方法     *     * @return     */    public static ResUtils2 getInstance() {        return ResUtils2Holder.instance;    }}

    我们使用静态内部类的方法创建实例,因为 JVM 只会加载一次的原理,所以最终只会创建一个实例,并且提供了获取实例的方法,这样我们就能从外部得到该实例。

    三、测试

    package com.asurplus.common.singleton;import com.asurplus.common.singleton.style1.ResUtils;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * 单例模式 */public class TestMain {    public static void main(String[] args) {        // 创建线程池        ExecutorService executorService = Executors.newFixedThreadPool(10);        for (int i = 0; i < 100; i++) {            executorService.execute(ResUtils::getInstance);        }        executorService.shutdown();    }}

    输出结果

    可以看出,我们获取了 100 次实例,只创建了一个实例,从而实现了我们的单例模式。

    感谢各位的阅读!关于"Java中单例模式怎么用"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

    实例 方法 模式 对象 内存 内容 数据 数据库 方式 更多 篇文章 缓存 资源 静态 私有 不错 实用 频繁 不用 优点 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技 互联网科技工作委员会主任 重生之互联网科技帝国 科技类互联网 有木互联网科技 无锡溥仪互联网科技有限公司 富国互联网科技创新基金 中国互联网有什么科技含量 茂名市互联网科技产业园 互联网时代科技改变生活 移动互联网科技公司 注册互联网科技公司经营范围大全 广州市恰铎互联网科技有限公司 恒生互联网科技业指数调整周期 伊宁互联网科技做什么的 沐思想互联网科技有限公司 银行科技岗属于互联网吗 互联网科技包装股 网互联网络科技 瑞安市蟠桃会互联网科技有限公司 科技类互联网 互联网与未来科技 云创客互联网科技公司 深圳国际航运科技和互联网 以后互联网后是啥科技 湖南诚度互联网科技有限公司 互联网科技的全部知识 国大互联网教育科技有限公司薪资 中国互联网有什么科技 唯美互联网科技
    0