Java单例模式实现的两种方式和应用场景

Java单例模式实现的两种方式和应用场景单例模式的定义个人理解,单例是指单个实例,在整个应用程序当中有且仅有一个实例存在,该实例是通过代码指定好的(自行创建的)。为什么要使用解决在高并发过程中,多个实例出现逻辑错误的情况。在特定的业务场景下避免对象重复创建,节约内存。实现的两种方式饿汉式顾名思义,不管有没有使用到该对象,只要程序启动成功,该单实例对象就存在。代码如下:/***饿汉式*/publicclassSingletonHungry{privatestaticSingletonHung

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

单例模式的定义

个人理解,单例是指单个实例,在整个应用程序当中有且仅有一个实例存在,该实例是通过代码指定好的(自行创建的)。

为什么要使用

  1. 解决在高并发过程中,多个实例出现逻辑错误的情况。
  2. 在特定的业务场景下避免对象重复创建,节约内存。

实现的两种方式

饿汉式

顾名思义,不管有没有使用到该对象,只要程序启动成功,该单实例对象就存在。

代码如下:

/** * 饿汉式 */
public class SingletonHungry { 
   


    private static SingletonHungry instance = new SingletonHungry();

    public static SingletonHungry instance(){ 
   
        return instance;
    }

    public static void main(String[] args) { 
   
        SingletonHungry instance1 = SingletonHungry.instance();
        SingletonHungry instance2 = SingletonHungry.instance();
        System.out.println(instance1);
        System.out.println(instance2);
    }
}

上述情况,满足在单线程和多线程中使用。

懒汉式

顾名思义,只有在程序当中使用到该对象的时候,该单实例对象才会被实例化。

代码如下:

/** * 懒汉式-单线程 */
public class SingletonLazy { 
   

    public static SingletonLazy instance = null ;

    public static SingletonLazy instance() { 
   
        if(instance == null) { 
   
            instance = new SingletonLazy() ;
        }

        return instance ;
    }
}

上述编写的代码中,乍一看,没问题,满足了单实例对象。可是细细一琢磨,咋感觉这不对,如果多线程情况下,就很难保证单实例对象了。下面提供一种多线程情况下实现单例的方式:

/** * 懒汉式-多线程 */
public class SingletonLazy { 
   

    public static SingletonLazy instance = null ;

    public static SingletonLazy instance() { 
   

        if(instance == null ) { 
   
            synchronized (SingletonLazy.class) { 
   
                if(instance == null) { 
   
                    instance = new SingletonLazy();
                }
            }
        }
        return instance ;
    }
}

上述的代码中满足了多线程的使用场景,就是使用了上锁+双重检查来进行实现。

欢迎交流!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169690.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月11日 上午10:00
下一篇 2022年8月11日 上午10:00


相关推荐

  • 关于尺度空间的理解和认识_尺度空间理论

    关于尺度空间的理解和认识_尺度空间理论通常会听到尺度变化等这类词语,看到的也总是一堆的数学公式,有时候真的不知道这到底有啥用,有啥意义,没有弄懂这些意义,当然就更不可能的理解,不可能去掌握应用它了,现在我才理解,小波变化其实也是一种尺度变化。今天我看到一篇南航数学系写的关于尺度空间解释的文章,感觉很通俗易懂,我们不从数学上来推倒什么是尺度空间,只是从生活常识方面来解释尺度空间的意义,意义懂了,数学方面自然就好理解了。       

    2022年10月11日
    4
  • CPU流水线详解_多周期流水线cpu

    CPU流水线详解_多周期流水线cpu为什么Intel处理器主频这么高,而AMD处理器主频都很低?是不是AMD处理器性能不如Intel?我们一般的回答都是,因为Intel处理器与AMD处理器内部构架不同,所以导致了这种情况,还有一种具体一点的回答就是因为Intel处理器流水线长,那到底流水线与CPU主频具体有什么关系呢?今天给大家带来一篇我以前刊登在《电脑报》硬件板块技术大讲堂版面的一篇原创文章。关于CPU流水线的知识,很多报纸杂

    2022年8月20日
    24
  • 腾讯开源混元3D-Omni和混元3D-Part,加速3D生成模型在AR/VR等领域落地

    腾讯开源混元3D-Omni和混元3D-Part,加速3D生成模型在AR/VR等领域落地

    2026年3月12日
    1
  • 黑盒测试用例设计之nextdate问题[通俗易懂]

    黑盒测试用例设计之nextdate问题[通俗易懂]首先已知有三个变量:月份,日期和年变量月份,日期和年都为整数,且都满足条件:1<=月份<=121<=日期<=311912<=年<=2012等价类划分法1.首先输入数据,划分等价类2.建立等价类表3.设计测试用例原型4.考虑隐含需求分为平年和闰年进行讨论,主要针对二月份。边界值分析法首先明晰三个定义:内点:范围内部的点上点:边界…

    2022年6月8日
    35
  • WinSCP连接被拒绝「建议收藏」

    WinSCP连接被拒绝「建议收藏」之前用WinSCP连接华为云服务器传输文件的时候没有出现过问题,但是现在连接实验室电脑的时候报“网络错误,连接被拒绝”。上网查了一下,发现是实验室服务器没有安装openssh-server,参考博文进行安装:Ubuntu安装sshd服务_我是大魔王2的博客-CSDN博客_ubuntu安装sshd具体安装步骤:1.安装openssh-serversudoapt-getinstallopenssh-server2.检查sshd是否启动一般安装成功后就会启动sshd服务,可以通过.

    2025年12月15日
    4
  • Excel2JSON Excel转JSON Excel另存为JSON的技巧

    Excel2JSON Excel转JSON Excel另存为JSON的技巧不过欢迎大家转发到微博、微信、朋友圈~么么哒~JSON是码农们常用的数据格式,轻且方便,而直接手敲JSON却是比较麻烦和令人心情崩溃的(因为重复的东西很多),所以很多码农可能会和我一样,选择用Excel去输入数据,然后再想办法转换成JSON格式。小编今天推荐使用Excel直接另存为JSON的方法。该方法的特点是:除可以正常的直接按照表头作为key,内容作为value输出之外,还可以

    2022年6月14日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号