java单例模式实现-3种方式

java单例模式实现-3种方式java单例模式 java单例模式是java中经常使用到的一种情况,那么,要实现单例模式都有哪几种方法呢,下面介绍的是java单例模式的四种实现方法,分别是:懒汉式饿汉式双检锁静态内部类懒汉式 懒汉式故名思意就是懒,是等到需要使用的时候再创建单例。这就需要将构造函数私有化,在外部就不能创建对象,由内部创建。下面是懒汉模式的实现。/***懒汉式*单例模式的创建*/publicclassSingleDemo{publicstaticSingleDem

大家好,又见面了,我是你们的朋友全栈君。

java单例模式

	java单例模式是java中经常使用到的一种情况,那么,要实现单例模式都有哪几种方法呢,下面介绍的是java单例模式的四种实现方法,分别是:
  1. 懒汉式
  2. 饿汉式
  3. 双检锁
  4. 静态内部类

懒汉式

	懒汉式故名思意就是懒,是等到需要使用的时候再创建单例。这就需要将构造函数私有化,在外部就不能创建对象,由内部创建。下面是懒汉模式的实现。
/**
 * 懒汉式
 * 单例模式的创建
 */
public class SingleDemo {
    public static SingleDemo singleDemo=null;
    private SingleDemo() {
    }
    public static SingleDemo getInstance(){
        if(singleDemo==null){
            singleDemo=new SingleDemo();
            return singleDemo;
        }else {
            return singleDemo;
        }
    }
}

	懒汉模式虽然简便也好理解,但是有线程安全的问题,当多个线程同时并发调用getInstance()函数时可能出现多列对象。

饿汉式

	饿汉式故名思意就是处于饥饿状态,类初始化一开始就创建出一个单列,当要使用时通过类函数获取得到。
/**
 * 饿汉式
 * 单例模式的创建
 * 在类加载时创建单例
 */
public class SingleDemo {
    public static SingleDemo singleDemo=null;
    //私有化构造函数,使其不能在外部构造
    private SingleDemo(){}
    static {
        singleDemo=new SingleDemo();
    }
    public static SingleDemo getInstance(){
        return singleDemo;
    }
}

双检锁

	为了解决懒汉式带来的线程安全问题,我们使用加锁的方式来同步代码。
	代码的设计如下:
package quartz;

/**
 * 懒汉式加强版-双检锁
 * 在需要使用时创建单例
 */
public class SingleDemo {
    public static SingleDemo singleDemo=null;
    //私有化构造函数,使其不能在外部构造
    private SingleDemo(){}
    public static SingleDemo getInstance(){
        //判单是否为首次创建实例
        if(singleDemo==null){
            //同步代码块,使得同一个SingleDemo类在加载这段代码时同步
            synchronized (SingleDemo.class){
                //再次判断实例是否被创建
                if(singleDemo==null){
                    singleDemo=new SingleDemo();
                    return singleDemo;
                }else {
                    return singleDemo;
                }
            }
        }else {
            return singleDemo;
        }
    }
}

	双检锁实现了对懒汉模式的加强,防止了单例模式的线程安全问题。

静态内部类

	静态内部类实现单例模式如图下:
/**
 * 静态内部类
 * 随静态内部类加载创建
 */
public class SingleDemo {
    private SingleDemo(){}
    public static class SingleDemo1{
        private static final SingleDemo Instance=new SingleDemo();
    }
    public static final SingleDemo getInstance(){
        return SingleDemo1.Instance;
    }
}

实例随静态内部类的类加载而创建,从而只有一个单例
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157059.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • AWS(EC2)助我实现项目管理应用上云

    AWS(EC2)助我实现项目管理应用上云AWS(EC2)助我实现项目管理应用上云

  • Spring Data JPA 写SQL语句也可以如此简单

    Spring Data JPA 写SQL语句也可以如此简单在使用SpringDataJPA的时候,通常我们只需要继承JpaRepository就能获得大部分常用的增删改查的方法。有时候我们需要自定义一些查询方法,可以写自定义HQL语句像这样/***根据关注者id查找所有记录(查找关注的人的id)**@paramfromUserId*@return*/…

    2022年10月20日
  • Android平台下OpenGL初步

    转自网上,网上没找到出处,只看到一些论坛中有这篇文章,组织的有点混乱,这篇文章感觉讲的挺好的。http://www.bangchui.org/read.php?tid=7572&page=1本文只关注于如何一步步实现在Android平台下运用OpenGl。 1、GLSurfaceViewGLSurfaceView是Android应用程序中实现OpenGl画图的重要组成部分。

  • linux下 VSCode快捷键

    linux下 VSCode快捷键文章目录一、常用二、全部1、常规2、基本编辑3、richlanguagesediting4、多光标和选择5、显示6、搜索与替换7、导航8、编辑页面管理9、文件管理10、终端一、常用命令作用Ctrl+,用户设置Alt+↑/↓将当前行上移或下移Ctrl+Shift+K删除行Ctrl+Shift+\跳至相匹配的括号处Ctrl+Shift+[/Ctrl+Shift+]折叠/展开当前代码块Ctrl+KCtrl+0折叠所有代码块Ctrl+

  • 《剑指offer》– 斐波那契数列、跳台阶问题 、变态跳台阶问题、矩阵覆盖

    《剑指offer》– 斐波那契数列、跳台阶问题 、变态跳台阶问题、矩阵覆盖

  • STM32 看门狗详解

    STM32 看门狗详解目录1、IWDG1.1独立看门狗简介1.2独立看门狗的特点1.3独立看门狗功能描述1.4硬件看门狗1.5寄存器访问保护1.6调试模式2、WWDG2.1简介2.2窗口看门狗主要特点2.3窗口看门狗功能说明2.4如何设置看门狗超时2.5调试模式3、区别1、IWDG1.1独立看门狗简介IWDG(Independentwatchdog)独立看门狗,可以用来检测并解决由于软件错误导致的故障,当计数器到达给定的超时值时,会触发

发表回复

您的电子邮箱地址不会被公开。

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