Java中的单例模式详解(完整篇)

yizhihongxing

Java中的单例模式是一种常见的设计模式,它用于确保类只有一个实例,并提供全局的访问点。在某些场景下,单例模式可以提高系统的性能和效率。下面是单例模式详解的完整攻略:

什么是单例模式

单例模式(Singleton Pattern)是一种常见的创建型设计模式,它可以确保一个类只有一个实例,并提供全局的访问点。单例模式可以避免不必要的对象创建,提高系统的性能和效率。此外,在一个多线程的环境下,单例模式还可以避免竞态条件和锁竞争。

单例模式的实现

单例模式的实现一般有两种方法:饿汉式和懒汉式。

饿汉式

饿汉式是一种较为简单的单例模式实现方式,它的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。常见的实现方式如下:

public class Singleton {
    // 在类加载的时候就创建单例对象
    private static Singleton instance = new Singleton();
    // 私有构造函数,确保外部无法实例化该类
    private Singleton() {}
    // 获取单例的唯一访问点
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式

懒汉式是一种比较懒惰的单例模式实现方式,它的特点是单例的实例只会在第一次调用 getInstance 方法时被创建。常见的实现方式如下:

public class Singleton {
    // 声明单例,但暂时不创建单例对象
    private static Singleton instance = null;
    // 私有构造函数,确保外部无法实例化该类
    private Singleton() {}
    // 获取单例的唯一访问点
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

双重校验锁式

双重校验锁式是一种线程安全的懒汉式单例模式实现方式,它的特点是在需要时才会创建单例。通过双重校验锁,既避免了锁竞争,又避免了每次获取锁的开销。常见的实现方式如下:

public class Singleton {
    // 声明单例,但暂时不创建单例对象
    private static volatile Singleton instance = null;
    // 私有构造函数,确保外部无法实例化该类
    private Singleton() {}
    // 获取单例的唯一访问点
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

单例模式的使用

单例模式在实际开发中经常用于工具类、配置类、日志类等场景中。下面通过两个示例来说明单例模式的使用。

配置文件工具类

我们经常会用到配置文件来保存应用程序的配置信息。下面是一个配置文件工具类的示例,它可以读取和写入配置文件,并提供全局的访问点。

public class ConfigUtil {
    // 声明单例,但暂时不创建单例对象
    private static volatile ConfigUtil instance = null;
    // 保存配置信息的 Map
    private Map<String, String> configMap = new HashMap<>();
    // 私有构造函数,确保外部无法实例化该类
    private ConfigUtil() {
        // 初始化配置信息
        loadConfig();
    }
    // 加载配置信息
    private void loadConfig() {
        // 读取配置文件,将配置信息保存到 configMap 中
    }
    // 获取单例的唯一访问点
    public static ConfigUtil getInstance() {
        if (instance == null) {
            synchronized(ConfigUtil.class) {
                if (instance == null) {
                    instance = new ConfigUtil();
                }
            }
        }
        return instance;
    }
    // 获取配置信息
    public String getConfigValue(String key) {
        return configMap.get(key);
    }
    // 设置配置信息
    public void setConfigValue(String key, String value) {
        configMap.put(key, value);
    }
    // 保存配置信息到文件
    public void saveConfig() {
        // 将 configMap 中的配置信息写入配置文件
    }
}

日志记录器

日志记录器通常用于记录应用程序的运行日志。下面是一个简单的日志记录器的示例,它可以记录日志,并提供全局的访问点。

public class Logger {
    // 声明单例,但暂时不创建单例对象
    private static volatile Logger instance = null;
    // 日志文件的路径
    private String logFilePath = "";
    // 私有构造函数,确保外部无法实例化该类
    private Logger() {}
    // 获取单例的唯一访问点
    public static Logger getInstance() {
        if (instance == null) {
            synchronized(Logger.class) {
                if (instance == null) {
                    instance = new Logger();
                }
            }
        }
        return instance;
    }
    // 写入日志
    public void log(String message) {
        // 将日志写入日志文件
    }
    // 设置日志文件的路径
    public void setLogFilePath(String logFilePath) {
        this.logFilePath = logFilePath;
    }
}

单例模式的扩展

单例模式还可以通过一些扩展方式来增加功能或者优化性能,常见的扩展方式如下:

线程池化单例

线程池化单例是一种将多个单例对象缓存到线程池中,从而提高单例对象的重用率和系统的性能。

延迟加载单例

延迟加载单例是一种将单例对象的创建延迟到第一次使用时再进行,从而避免了不必要的对象创建。

总结

单例模式是一种常见的设计模式,它可以确保一个类只有一个实例,并提供全局的访问点,从而提高系统的性能和效率。单例模式的实现一般有饿汉式、懒汉式和双重校验锁式等方式。在实际开发中,单例模式经常用于工具类、配置类、日志类等场景中。单例模式还可以通过线程池化、延迟加载等方式进行扩展。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的单例模式详解(完整篇) - Python技术站

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

相关文章

  • java排序算法之冒泡排序

    Java排序算法之冒泡排序是一种简单的排序算法,它通过比较相邻两个元素的大小,如果前一个元素大于后一个元素,则交换它们的位置,重复这个过程直到整个数组排好序。 基本思路 遍历数组,将相邻两个元素进行比较,若前一个元素比后一个大,则交换它们的位置; 每遍历一轮,就可以找到当前最大或最小的元素,需要遍历数组长度减去已排序部分的次数。 代码实现 public st…

    Java 2023年5月19日
    00
  • js+ajax处理java后台返回的json对象循环创建到表格的方法

    下面是详细讲解 “js+ajax处理java后台返回的json对象循环创建到表格的方法”的完整攻略: 1. AJAX请求数据 首先,我们需要在前端页面中发送一个AJAX请求,向后台请求获取数据。可以通过以下代码将数据请求发送到服务器端: $.ajax({ type: "GET", url: "/api/getData"…

    Java 2023年5月26日
    00
  • 超漂亮的Bootstrap 富文本编辑器summernote

    下面是这个Bootstrap富文本编辑器summernote的完整攻略。 介绍 Summernote是一款基于Bootstrap的富文本编辑器,功能强大、轻量级、简单易用,支持文本、图片等多种格式的编辑,同时也有插件系统可供扩展。它支持Markdown语法,可在WYSIWYG和编码之间自由切换,也支持响应式布局和多种主题样式。 下载和安装 下载summern…

    Java 2023年6月15日
    00
  • 多线程(多窗口卖票实例讲解)

    多线程(多窗口卖票实例讲解) 什么是多线程? 多线程(Multithreading)是指在一个程序中,运行多个线程并行执行,从而实现一次完成多个任务的处理方式。一个进程可以有多个线程,这些线程并行执行。 为什么要使用多线程? 在某些场景下,单线程无法同时处理多任务,导致程序响应慢,效率低下。如果使用多线程,则可以同时处理多个任务,提高程序的运行效率和响应速度…

    Java 2023年5月18日
    00
  • JSON简介以及用法汇总

    JSON简介 JSON的全称是JavaScript Object Notation,它是一种轻量级的数据交换格式。JSON的特点是易于理解、易于阅读、易于编写、易于解析、易于生成。JSON适用于数据传输和存储,常见于Web应用中与客户端和服务端之间的数据交互。 JSON用法汇总 JSON语法: JSON由两种结构组成: 键值对:一组“键/值”对,使用英文冒号…

    Java 2023年5月26日
    00
  • 从JVM的内存管理角度分析Java的GC垃圾回收机制

    从JVM的内存管理角度分析Java的GC垃圾回收机制的完整攻略如下: 1. 垃圾回收机制的概念 Java垃圾回收机制是JVM一项非常重要的特性,主要用于自动管理Java程序运行时的内存分配与回收。Java程序在执行过程中会不断地动态分配内存,而程序员要考虑如何处理分配的内存,在不再需要使用时及时释放内存。Java的垃圾回收机制极大地方便了程序员的编程,不用考…

    Java 2023年5月20日
    00
  • 详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    下面是详解”spring boot集成ehcache 2.x 用于hibernate二级缓存”的完整攻略。 引言 在使用Spring Boot开发项目时,我们往往需要使用到缓存来提高性能。而使用Hibernate框架时,我们可以通过集成Ehcache来实现二级缓存。本文将详细介绍在Spring Boot项目中,如何集成Ehcache 2.x用于Hiberna…

    Java 2023年5月20日
    00
  • Spring Data JPA框架快速入门之自定义Repository接口

    下面是关于“Spring Data JPA框架快速入门之自定义Repository接口”的详细讲解。 什么是Spring Data JPA? Spring Data JPA是Spring提供的一个用于简化JPA开发的框架,它提供了一种使得JPA的使用更加方便快捷的方式,使我们能够以更少的代码量实现JPA数据存储相关的操作。 自定义Repository接口 自…

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