Java实现单例模式的五种方法介绍

5种Java实现单例模式的方法介绍

在Java编程中,当我们希望某个类只有一个实例存在时,就需要使用单例模式。下面介绍5种Java实现单例模式的方法:

方法1:饿汉式单例模式

这种方式基于classloder机制避免了多线程的同步问题,不过instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法,但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。

示例:

public class Singleton1 {
    private static Singleton1 instance = new Singleton1();
    private Singleton1(){}
    public static Singleton1 getInstance(){
        return instance;
    }
}

方法2:懒汉式单例模式(线程不安全)

这种方法实现起来很简单,只需要在第一次调用的时候实例化对象即可,但是在多线程下是不安全的。

示例:

public class Singleton2 {
    private static Singleton2 instance;
    private Singleton2(){}
    public static Singleton2 getInstance(){
        if(instance == null){
            instance = new Singleton2();
        }
        return instance;
    }
}

方法3:懒汉式单例模式(线程安全,效率低)

这种方法考虑到了线程安全,但是效率很低,因为整个方法被synchronized所修饰,因此每次调用getInstance时都要对对象加锁,试图通过减小锁的范围提高效率,结果往往会出现错误或不可靠的情况。

示例:

public class Singleton3 {
    private static Singleton3 instance;
    private Singleton3(){}
    public static synchronized Singleton3 getInstance(){ //加锁
        if(instance == null){
            instance = new Singleton3();
        }
        return instance;
    }
}

方法4:双检锁/双重校验锁(DCL,即double-checked locking)

这种方法致力于解决懒汉式单例模式(线程安全,效率低)的效率问题,只有在第一次创建对象的时候才会加锁,达到了又能解决线程安全问题,又能提高效率的目的。

示例:

public class Singleton4 {
    private volatile static Singleton4 instance;// volatile:禁止指令重排序
    private Singleton4(){}
    public static Singleton4 getInstance(){
        if(instance == null){
            synchronized (Singleton4.class){  //加锁
                if(instance == null){
                    instance = new Singleton4();
                }
            }
        }
        return instance;
    }
}

方法5:静态内部类单例模式

这种方法也是懒汉式单例模式的一种形式,但是相对于其他方法而言更为安全高效。当Singleton5类被载入JVM时,其内部类SingletonHolder并不会被初始化。只有当调用getInstance方法时,才会加载SingletonHolder类,从而实例化Singleton5。同时,由于SingletonHolder是静态的,所以JVM不会重新加载。

示例:

public class Singleton5 {
    private Singleton5(){}
    private static class SingletonHolder{
        private static final Singleton5 INSTANCE = new Singleton5();
    }
    public static Singleton5 getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

以上5种方法各有优缺点,根据不同的情况选择合适的单例模式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现单例模式的五种方法介绍 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • JSON各种转换问题(json转List,json转对象等)

    让我为你详细讲解一下“JSON各种转换问题(json转List,json转对象等)”的完整攻略。 JSON转List 假设有一个JSON数组如下: [ { "name": "张三", "age": 23 }, { "name": "李四", "age…

    Java 2023年5月26日
    00
  • Tomcat安装shell脚本的方法步骤

    下面是详细讲解Tomcat安装shell脚本的方法步骤: 1. 确定Tomcat版本和安装路径 首先需要确定需要安装的Tomcat版本和安装路径。可以去Tomcat官方网站下载最新的安装包,解压后确定解压后文件夹的路径。 2. 创建安装脚本 在Linux系统中创建一个新的文本文件,扩展名为“.sh”,例如“install_tomcat.sh”。并使用任意文本…

    Java 2023年5月19日
    00
  • Java中程序的运行全过程

    Java程序的运行过程可以分为三个主要阶段,即编写代码、编译代码和执行代码。下面是详细的攻略: 编写Java代码 Java程序的编写是使用文本编辑器,如记事本或文本编辑器进行编写。在编写代码时,需要使用Java编程语言,这是一种高级编程语言,易于理解和学习。Java编程语言的基本语法包括使用关键字、变量、运算符、分号、大括号等,例如: public clas…

    Java 2023年5月19日
    00
  • java字符串求并集的方法

    针对这个问题,我会给出详细的解释和两个示例。 Java字符串求并集的方法 一、使用Java的Set集合 Java的Set集合是不重复的集合,很适合用来进行字符串的并集操作。具体的实现方式是创建两个Set集合,分别用来存储两个字符串的字符,然后将两个集合进行合并,最后输出合并后的结果即可。 下面是示例代码: import java.util.HashSet; …

    Java 2023年5月27日
    00
  • SpringBoot整合Thymeleaf小项目及详细流程

    Spring Boot整合Thymeleaf小项目及详细流程 本文将介绍如何使用Spring Boot整合Thymeleaf模板引擎,以及详细的流程和示例。 什么是Thymeleaf Thymeleaf是一种现代化的服务器端Java模板引擎,它可以处理HTML、XML、JavaScript、CSS甚至纯文本。它的主要目标是为Web和独立环境创建优雅的自然模板…

    Java 2023年5月15日
    00
  • Java工厂模式用法之如何动态选择对象详解

    Java工厂模式用法之如何动态选择对象详解 工厂模式简介 在软件开发中经常需要创建对象,由于创建对象过程比较复杂,因此我们通常利用工厂模式来创建对象。工厂模式是指定义一个用于创建对象的接口(工厂接口),由实现这个接口的类(具体工厂)来创建具体的对象(产品)。在工厂模式中,客户端不直接 new 一个类的实例,而是通过工厂接口来创建实例,从而将实例的创建和使用代…

    Java 2023年5月26日
    00
  • Zend Studio (eclipse)使用速度优化方法

    Zend Studio (Eclipse)使用速度优化方法 Zend Studio是一个在Eclipse基础上扩展的PHP IDE,提供了众多的功能,但是在使用中可能会出现卡顿、启动慢等问题。本文将给出一些常见的优化方法,以提高Zend Studio的使用效率。 1. 调整启动参数 默认情况下,Zend Studio会使用JVM的默认设置进行启动,这可能会导…

    Java 2023年6月15日
    00
  • 常见的Java集成测试框架有哪些?

    常见的Java集成测试框架有以下几种: JUnit JUnit是Java语言的一个单元测试框架。由Erich Gamma和Kent Beck创建,逐渐成为Java程序中最流行的测试框架之一。JUnit的主要特性包括测试集成、JUnit测试运行器、测试结果报告等。 使用JUnit进行集成测试的步骤: 1)编写测试用例 JUnit的测试用例由一个或多个测试方法组…

    Java 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部