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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 几个汇编教程地址[通俗易懂]

    几个汇编教程地址[通俗易懂]汇编语言程序设计指南http://c.biancheng.net/asm/AssemblyLanguage教程https://www.w3cschool.cn/assembly/

    2022年6月21日
    35
  • 关于机械臂的模仿学习

    关于机械臂的模仿学习文章目录1.关键词2.数据集3.框架4.大会/论坛5.相关论文1.关键词模仿学习:Imitationlearning2.数据集图像识别领域的数据集:ImageNet目标检测的数据集:COCO机器问答的数据集:SQuAD3.框架斯坦福的李飞飞实验室,开源了分布式强化学习训练框架SURREAL,用来加速学习过程。团队还发现,用SURREAL框架搭配上文的RoboTurk…

    2022年9月19日
    0
  • visual studio code怎么运行js_js在哪里运行

    visual studio code怎么运行js_js在哪里运行在VSCode中有一个插件——coderunner,可以安装后直接运行在node环境中,然后在vscode中输出文件的结果。在test.js文件里面右键选择RunCode或者编辑器右上角的方形运行按钮来运行文件,结果在输出一栏输出。…

    2022年8月12日
    5
  • git提交中E325: ATTENTION或E325: 注意 的解决方法

    git提交中E325: ATTENTION或E325: 注意 的解决方法问题引入首先看下图,在git提交、编辑、合并等过程中,如果没有将指令进行完就将git窗口关闭有时会出现这样的界面。原因分析git在指令意外中断时,一般会有一个缓存的机制,它会记住上次中断的问题。在下次进入vim指令时,如果很重要的中断一般会提示你前面有某个操作不当或者没有结束,就出现了上面的窗口。如果不解决就会一直缠着你,以至于出现该窗口后再输入git指令的话一般就不显示在…

    2022年5月19日
    45
  • 喊山第二部_软组raid0

    喊山第二部_软组raid0原题链接喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自:http://news.xrxxw.com/newsshow-8018.html)一个山头呼喊的声音可以被临近的山头同时听到。题目假设每个山头最多有两个能听到它的临近山头。给定任意一个发

    2022年8月9日
    4
  • 三星galaxy S4快捷功能

    三星galaxy S4快捷功能

    2021年12月15日
    42

发表回复

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

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