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;
    }
}

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 利用Python通过频谱分析和KNN完成iphone拨号的语音识别

    利用Python通过频谱分析和KNN完成iphone拨号的语音识别

    2021年11月22日
  • android:layout_gravity和android:gravity的区别

    android:layout_gravity和android:gravity的区别1.首先来看看android:layout_gravity和android:gravity的使用区别。android:gravity:这个是针对控件里的元素来说的,用来控制元素在该控件里的显示位置。例如,在一个Button按钮控件中设置如下两个属性,android:gravity=”left”和android:text=”提交”,这时Button上的文字“提交”将会位于Button的左

    2022年7月26日
  • 【更新】互联网公司可投之参考[通俗易懂]

    【更新】互联网公司可投之参考[通俗易懂]【更新】互联网公司可投之参考以下内容收集于网络资料,仅供参考。如有误请指正~,未经允许,禁止转载。不介意的话,放个自己的字节内推,投递链接https://jobs.toutiao.com/s/dp5bxEK,内推码:AJCWZR2北京公司上海公司广州公司深圳公司武汉公司杭州公司成都公司成都公司长沙公司…小伙伴们觉得有用的话可以关注点赞收藏,后面持续更新~以下内容收集于网络资料,仅供参考。如有误请指正~,未经允许,禁止转载。#目前已更新:北京、上海、广州、深圳、武汉、杭州、成都、南京、长沙…不介意的

    2022年5月14日
  • java可视化编程-eclipse安装windowbuilder插件「建议收藏」

    一直做在安卓用xml作界面,对于java的控件不熟悉,也不习惯用代码做UI尤其是布局。找了一下发现可以安装windowbuilder来实现java的可视化编程,但是很多资料里的连接都失效了。刚自己弄完比较熟悉,总结一下希望能帮到。我是直接在线安装的windowbuilder一.找到对应版本的windowbuilder打开这个链接:http://www.eclipse.org/w

    2022年3月11日
  • 怎么从安卓设备转移数据到苹果_换手机了数据怎么办?这样做安卓、苹果手机数据一键转移…

    怎么从安卓设备转移数据到苹果_换手机了数据怎么办?这样做安卓、苹果手机数据一键转移…(2)借助iCloud云备份①确保手机已经连接WiFi,然后在手机“设置”中,依次点击“AppleID——iCloud——iCloud云备份”,开启iCloud云备份功能,然后点击“立即备份”。②接下来就是要将iCloud云备份上的数据下载到新手机上了。如何已经设置了新手机,那需要先抹掉它。依次点击“设置——通用——还原——抹掉所有内容和设置”即可。③手机开机后,往下进行操作,直到看到“应用与数…

    2022年5月26日
  • javaSocket传输模式

    javaSocket传输模式Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就像一部电话,他们必须建立一个连接和一人呼叫.所有的事情在到达时的顺序与它们出发时的顺序时一样.无连接的sockets操作就像是一个邮件投递,,没有什么保证,多个邮件可能在到达时的顺序与出发时的顺序不一样.到底用哪种模式是邮应用程序的需要决定的.如果可靠性更重要的话,用面向连接的操作会好一些.比如文件服务器需要他们

    2022年6月24日

发表回复

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

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