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

yizhihongxing

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日

相关文章

  • Java网络编程的作用是什么?

    Java网络编程是指利用Java编程语言,使用Java自带的网络编程库(包括但不限于java.net包和java.io包)来实现网络编程功能。Java网络编程的作用主要是实现网络间的通信,使得不在同一物理位置的计算机和设备能够相互交流和传输数据,实现信息的传递和共享。 Java网络编程常用的功能包括创建Socket连接、发送和接收数据、实现服务端和客户端的通…

    Java 2023年5月11日
    00
  • 对Java中JSON解析器的一些见解

    让我们来详细讲解一下“对Java中JSON解析器的一些见解”的攻略。 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于JavaScript语言的一个子集,用于描述数据的类型和结构。JSON使用键值对的方式表示数据,键和值之间使用冒号(:)分隔,多个键值对之间使用逗号(,)分隔。 Java中的…

    Java 2023年5月26日
    00
  • 面试官问如何启动Java 线程

    启动Java线程有两种方式:继承Thread类和实现Runnable接口。下面分别讲解这两种方式的启动步骤。 继承Thread类启动线程 步骤 继承Thread类并重写其run()方法 创建Thread类的实例对象 调用start()方法启动线程 示例 下面是一个继承Thread类的简单示例: public class MyThread extends Th…

    Java 2023年5月27日
    00
  • Spring MVC概念+项目创建+@RequestMappring案例代码

    Spring MVC概念+项目创建+@RequestMapping案例代码 Spring MVC是一个基于MVC架构的Web框架,它可以用于构建Web应用程序。Spring MVC框架提供了一组组件,包括控制器、视解析器、处理映射器、数据绑定、数据验证、异常处理等,可以帮助我们快速开发Web应用程序。 Spring MVC项目创建 我们可以使用Spring …

    Java 2023年5月18日
    00
  • 匹配form表单中所有内容的正则表达式

    下面我就来详细讲解匹配form表单中所有内容的正则表达式攻略。 步骤一:理解需求 首先需要理解问题的需求,即需要匹配form表单中所有内容的正则表达式。这里的“所有内容”包括form标签及其所有属性,包括每一个input标签及其属性等等。 步骤二:编写匹配表单标签的正则表达式 首先需要匹配form标签,可以使用以下正则表达式: /<form.*?&gt…

    Java 2023年6月15日
    00
  • java设计模式-组合模式详解

    Java设计模式-组合模式详解 什么是组合模式? 组合模式属于结构型设计模式,它将对象组合成树形结构,以表示’部分-整体’的层次关系。组合模式使得用户对单个对象和组合对象的使用具有一致性,通常适用于处理树形结构,或者希望将单个对象和组合对象以相同的方式进行处理。 组合模式主要包含以下两种角色: Component(抽象构件):定义了叶子和容器构件的公用接口,…

    Java 2023年5月26日
    00
  • java随机生成一个名字和对应拼音的方法

    生成随机名字可以借助汉字Unicode编码和Java随机数生成器。具体步骤如下: 1.确定姓氏。由于汉字Unicode编码中,姓氏范围为0x4E00至0x9FA5,因此可以使用Java随机数生成器生成一个在该范围内的随机数,再通过该随机数获取对应的汉字作为姓氏。 示例代码: Random rand = new Random(); // 区间的左闭右开区间,范…

    Java 2023年6月15日
    00
  • C# Marshal类基本概念和入门实例讲解

    C# Marshal类是与另一个通信的进程交互的强大工具,该进程可以在同一台计算机或网络上运行。本文旨在介绍Marshal类的基本概念和学习Marshal类的入门实例。 什么是Marshal类 Marshal类是在.NET Framework中提供的一个强大的、可靠的机制,用于在C#应用程序和非托管代码(如Windows API、COM组件、动态链接库等)之…

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