java设计模式-单例模式实现方法详解

Java设计模式-单例模式实现方法详解

什么是单例模式

单例模式是一种常用的软件设计模式,其定义是确保一个类只有一个实例,且自行实例化并向整个系统提供这个实例。在Java中,单例模式在一些场景下非常有用,例如配置文件、日志输出、线程池等等。

实现单例模式的方法

1. 懒汉式单例模式

懒汉式单例模式是指在第一次调用getInstance方法时才实例化单例对象。这种方式适用于单例对象的创建比较耗费资源的情况,可以避免不必要的资源浪费。

public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {}

    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

2. 饿汉式单例模式

饿汉式单例模式是指在类加载时就将单例对象实例化成员。这种方式可以保证线程安全,但可能会浪费不必要的资源。

public class EagerSingleton {
    private static EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {}

    public static EagerSingleton getInstance() {
        return instance;
    }
}

3. 双重检查锁定单例模式

双重检查锁定单例模式是指在getInstance方法中进行两次检查来确保单例对象的创建并保证线程安全。这种方式既能够避免不必要的资源浪费,又能保证线程安全。

public class DoubleCheckLockSingleton {
    private static volatile DoubleCheckLockSingleton instance;

    private DoubleCheckLockSingleton() {}

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

如何选择单例模式的实现方法

  • 如果单例对象的创建比较耗费资源,可以通过懒汉式单例模式来实现;
  • 如果希望保证线程安全,并且单例对象的创建不会耗费太多资源,可以使用饿汉式单例模式;
  • 如果希望即能保证线程安全,又能够避免不必要的资源浪费,可以使用双重检查锁定单例模式。

实例说明

以下两个示例对比展示了懒汉式单例模式和饿汉式单例模式的区别:

// 懒汉式单例模式
public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {}

    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

// 饿汉式单例模式
public class EagerSingleton {
    private static EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {}

    public static EagerSingleton getInstance() {
        return instance;
    }
}

在单线程环境下,两者实现单例对象的方式是一样的。但在多线程环境下,懒汉式单例模式会存在线程安全问题,需要在getInstance方法上添加synchronized关键字。

所以,如果单例对象的创建比较耗费资源,可以考虑使用懒汉式单例模式,并在getInstance方法上添加synchronized关键字保证线程安全;如果单例对象的创建比较简单,不会耗费太多资源,则可以使用饿汉式单例模式,避免不必要的同步。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java设计模式-单例模式实现方法详解 - Python技术站

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

相关文章

  • Spring Boot中@Import三种使用方式实例详解

    关于“Spring Boot中@Import三种使用方式实例详解”,我将分为以下三个部分进行阐述。 1. @Import的三种使用方式 @Import在Spring Boot中有三种不同的使用方式,分别是: 直接导入类:使用@Import导入所需的Java类。 导入Java配置文件:通过@Import导入Java配置文件,使其的Bean能够在应用程序中可用。…

    Java 2023年5月19日
    00
  • Struts1和struts2的区别_动力节点Java学院整理

    Struts1和Struts2的区别 什么是Struts1和Struts2 Struts1是一个基于MVC模式的Web应用框架,由Apache组织开发和维护,是早期Web开发中使用较为广泛的框架之一。 Struts2,原名WebWork,是Struts1的升级版,也是一个基于MVC模式的Web应用框架,由Apache组织维护。 Struts1和Struts2…

    Java 2023年5月20日
    00
  • 死锁的原因是什么?

    针对“死锁的原因是什么?”这个问题,以下是完整的使用攻略: 第一步:了解死锁的概念和定义 在回答这个问题之前,我们需要先了解什么是死锁。死锁是指两个或多个进程在执行过程中,因争夺系统资源而造成的一种僵局,若无外力作用,它们都将无法继续向下执行。并且,互相等待的各进程都在等待别的进程释放资源,而自己却不释放资源。 第二步:探究死锁的原因 那么,造成死锁的原因是…

    Java 2023年5月10日
    00
  • 如何实现线程安全的单例模式?

    以下是关于如何实现线程安全的单例模式的完整使用攻略: 什么是线程安全的单例模式? 线程安全单例模式是指在多线程环境下,保证有一个实例对象被创建,并且多个线程可以同时访问该实例对象,而不会出现数据不一致或程序崩溃等问题。在多线程编程中,线程安全的单例模式是非常重要的,因为多个线程同时访问单例对象,会出现线程间争用的问题,导致数据不一致或程序崩溃。 如何实现线程…

    Java 2023年5月12日
    00
  • 老生常谈Java反射机制(必看篇)

    老生常谈Java反射机制(必看篇) 什么是Java反射机制? Java反射机制是Java提供的一种能够在运行时获取对象的信息以及修改对象的内容的方法。通过反射机制,程序可以获取任意一个类的内部信息,并且可以操作类、构造器、方法、成员变量等。 反射机制的应用场景 通过配置文件来读取实例化的对象 对框架类进行扩展 调试时查看对象的属性信息 反射机制的基本用法 获…

    Java 2023年5月26日
    00
  • java实战小技巧之字符串与容器互转详解

    Java实战小技巧之字符串与容器互转详解 1. 前言 在Java编程中,我们常常需要将字符串(String)与容器(List、Set、Map)进行转化。本文将详细讲解如何使用Java提供的工具类来实现两者之间的互转。 本文的代码示例基于Java 8及以上版本。 2. 字符串转容器 2.1 字符串转List 2.1.1 普通字符串转List 普通字符串转Lis…

    Java 2023年5月27日
    00
  • Java SpringMVC框架开发之数据导出Excel文件格式实例详解

    Java SpringMVC框架开发之数据导出Excel文件格式实例详解 前言 在Web应用程序中,数据导出的需求是比较常见的。本文介绍如何在Java SpringMVC框架中开发,实现将数据导出到Excel文件格式的功能。本文的示例代码基于SpringMVC 5.2.5版本和Apache POI 4.1.2版本实现。 准备工作 在开始本文的实例之前,需要做…

    Java 2023年6月3日
    00
  • java多线程关键字final和static详解

    Java多线程关键字final和static详解 在Java中,final和static是常用的关键字之一,它们不仅在单线程中有用,而且在多线程环境中也起到了非常重要的作用。本文将详细介绍final和static的使用场景及每个场景的一些细节问题。 final关键字 final关键字表示最终的,不可更改的。因此,final变量一旦被初始化赋值以后,就不能再更…

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