5种单例模式的Java实现[通俗易懂]

5种单例模式的Java实现[通俗易懂]参考链接:http://www.mianshigee.com/topic/1022grf/1、懒汉式单例、线程不安全publicclassSingleton{privatestaticSingletonuniqueInstance;//构造方法privateSingleton(){};//实例方法publicstaticSingletongetInstance(){if(uniqueInstance=.

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

在这里插入图片描述
参考链接:

http://www.mianshigee.com/topic/1022grf/

1、懒汉式单例、线程不安全

public class Singleton { 
   
    private static Singleton uniqueInstance;
    // 构造方法
    private Singleton(){ 
   };

    // 实例方法
    public static Singleton getInstance(){ 
   
        if (uniqueInstance == null){ 
   
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}
注意:
代码简单明了,使用了懒加载模式,但存在致命的问题。
当有多个线程并行调用 getInstance() 的时候,就会创建多个实例。
也就是说在多线程下不能正常工作。

2、懒汉式单例、线程安全

public class Singleton1 { 
   
    private static Singleton1 uniquesingle;
    private Singleton1(){ 
   }
	// 使用synchronized将实例方法设为同步的
    public static synchronized Singleton1 getInstance(){ 
   
        if (uniquesingle == null){ 
   
            uniquesingle = new Singleton1();
        }
        return uniquesingle;
    }
}
注意:
为了解决线程安全的问题,最简单的方法是将整个 getInstance() 方法设为同步(synchronized)
虽然做到了线程安全,并且解决了多实例的问题,但是它并不高效。
因为在任何时候只能有一个线程调用 getInstance() 方法。
而且 同步操作 只需要在第一次调用时才被需要,即第一次创建单例实例对象时。
所以,这就引出了双重检验锁。

3、饿汉式、线程安全、静态final变量

public class Singleton2 { 
   
    private static final Singleton2 uniquesingle = new Singleton2();
    private Singleton2(){ 
   }

    public static Singleton2 getInstance(){ 
   
        return uniquesingle;
    }

}
注意:
这种方法非常简单,因为单例的实例被声明成 static 和 final 变量了,
在第一次加载类到内存中时就会初始化,所以创建实例本身是线程安全的。
单例会在加载类后一开始就被初始化,即使客户端没有调用 getInstance()方法。
饿汉式的创建方式在一些场景中将无法使用:譬如 Singleton 实例的创建是依赖参数或者配置文件的,
在 getInstance() 之前必须调用某个方法设置参数给它,那样这种单例写法就无法使用了。

4、双重检验加锁、线程安全

public class Singleton3 { 
   
    //private static Singleton3 uniquesingle; // 这里是原始的
    private volatile static Singleton3 uniquesingle;  // 这里是改进的
    private Singleton3(){ 
   }

    public static Singleton3 getInstance(){ 
   
        if (uniquesingle == null){ 
   
            synchronized (Singleton3.class){ 
   
                if (uniquesingle == null){ 
   
                    uniquesingle = new Singleton3();
                }
            }
        }
        return uniquesingle;
    }
}

注意:
在这里插入图片描述

5、静态内部类单例、线程安全

public class Singleton4 { 
   
    // 静态内部类
    private static class SingletonHolder{ 
   
        private static final Singleton4 uniqueInstance = new Singleton4();
    }
    private Singleton4(){ 
   }
    public static final Singleton4 getInstance(){ 
   
        return SingletonHolder.uniqueInstance;
    }

}

注意:
在这里插入图片描述

6、枚举单例、线程安全

public enum Singleton5 { 
   
    INSTANCE;
}

注意:
在这里插入图片描述

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

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

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


相关推荐

  • 渗透测试工具包 | 开源安全测试工具 | 网络安全工具

    渗透测试工具包 | 开源安全测试工具 | 网络安全工具项目介绍记录渗透测试开源工具。自动化渗透测试 AttackSurfaceMapper-自动化渗透测试工具,使用手册/测试流程。 vajra-自动化渗透测试. Savior-渗透测试报告自动生成工具!. 漏洞利用框架 hackUtils-它是一个用于渗透测试和网络安全研究的黑客工具包,渗透以及web攻击脚本。 msf框架: pocsscan攻击框架 Pocsuite攻击框架 Beebeeto攻击框架 …

    2022年8月12日
    8
  • Java程序设计(基础)- 数组[通俗易懂]

    Java程序设计(基础)- 数组[通俗易懂]Java程序设计(基础)- 数组

    2022年4月22日
    46
  • chmod a+x和chmod u+x区别

    chmod a+x和chmod u+x区别原文链接:https://www.cnblogs.com/tonyauto/p/8085551.htmlchmoda+xa.txt等价于chmod+xa.txt给所有用户给予a.txt文件可执行权限chmodu+xa.txta.txt文件的所有用户可执行权限chmodg+xa.txta.txt用户组可执行权限chmodo+xa.txta.txt其他用户可执行…

    2022年7月12日
    23
  • httprunner3源码解读(2)models.py「建议收藏」

    httprunner3源码解读(2)models.py「建议收藏」源码目录结构我们首先来看下models.py的代码结构我们可以看到这个模块中定义了12个属性和22个模型类,我们依次来看属性源码分析importosfromenumimportEnu

    2022年7月29日
    20
  • 百度文库免费下载文档方法[通俗易懂]

    百度文库免费下载文档方法

    2022年2月11日
    84
  • 关于balun的一些仿真和思考[通俗易懂]

    关于balun的一些仿真和思考[通俗易懂]关于balun的一些仿真和思考1、错误的初始设计,电路图如下:2、来看看ADS里,理想balun的仿真结果3、将原电路的50ohm并接在balun的差分端,而非单端,再看看仿真结果。4、那么为什么出现上述情况呢?5、我们应该如何去做呢?6、总结:如有错误,还请留言区指出~为了提高共模抑制能力,很多芯片的输入输出口会设计成差分口,在射频电路中也是如此。最近在项目测试中,一个关于balun的问题困扰了我很久,迟迟没有想明白。我爸说:“当一个问题你久久思考却毫无头绪时,你就暂时放一放。也许有天突然开窍,你就想

    2025年8月1日
    3

发表回复

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

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