Java单例的写法详解

Java中的单例模式,指的是确保一个类只有一个实例,并提供访问该实例的全局访问点。这在某些情况下非常有用,例如当有一个全局资源,如线程池、数据库连接池等,需要在应用程序的整个生命周期内保持一致时。下面是Java单例模式的写法详解。

懒汉式单例模式

实现方式

懒汉式单例模式是指在需要使用实例的时候才去创建,而不是在类加载时就创建。懒汉式单例模式可以通过两种方式实现。

1. 双重检查锁

该实现方式首先检查实例是否已经创建,如果已经创建则返回该实例,否则创建一个新的实例。此方法可以避免在每次获取实例时都进行同步,但是需要使用volatile关键字保证线程安全。具体实现方式如下:

public class Singleton {
    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

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

2. 内部静态类

该实现方式通过内部静态类来实现懒加载。在调用getInstance()方法时,会首先加载SingletonHolder类,而SingletonHolder类会在类加载时就创建Singleton实例。利用classloader的机制来保证线程安全,创建类的实例时只有一个线程。具体实现方式如下:

public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

示例说明

下面是一个基于双重检查锁来实现的懒汉式单例模式的示例:

public class Singleton {
    private volatile static Singleton uniqueInstance;

    private Singleton() {
    }

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

饿汉式单例模式

实现方式

饿汉式单例模式是指在类加载时就创建实例。当类被加载时,静态变量会被初始化,因此可以在类加载时直接创建实例。由于在类加载时就创建实例,因此不存在多线程并发访问的问题,但是会增加系统的启动时间。具体实现方式如下:

public class Singleton {
    private static final Singleton uniqueInstance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return uniqueInstance;
    }
}

示例说明

下面是一个基于饿汉式单例模式的示例:

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {}

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

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java单例的写法详解 - Python技术站

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

相关文章

  • Jsp中的table多表头导出excel文件具体实现

    首先,需要使用JXL库来将数据导出为Excel文件。而实现table多表头导出Excel文件的关键是要在Excel中实现合并单元格。 以下是实现步骤: 1. 引入 JXL 库 在 JSP 页面中引入 jxl.jar 包。 <%@ page language="java" contentType="text/html; ch…

    Java 2023年6月16日
    00
  • java对XML文件的解析、节点的增加、删除操作总结

    Java对XML文件的解析、节点的增加、删除操作总结 在Java中,我们常常需要对XML文件进行解析、节点的增加或删除操作。下面将从以下两个方面对这一问题进行分析。 1. XML文件的解析 1.1 使用JDOM进行XML文件解析 JDOM是一款功能强大的Java XML解析库,它可以对XML文档进行解析,并操作XML文档中的元素和属性。其解析XML文档的核心…

    Java 2023年6月15日
    00
  • Java中打乱一个数组的2种公平算法分享

    下面是“Java中打乱一个数组的2种公平算法分享”的完整攻略。 一、算法1:Fisher–Yates算法 1.算法原理 Fisher-Yates算法,又叫Knuth Shuffle算法,使用的是下标随机交换的方法,每次迭代时随机一个在当前位置及以后的位置(包括当前位置)之间的任意一个索引,然后将当前位置与该索引处的元素进行交换。该算法类似于每次从未处理的数据…

    Java 2023年5月19日
    00
  • 基于jQuery ligerUI实现分页样式

    这里是基于jQuery ligerUI实现分页样式的完整攻略,分为以下步骤: 1. 引入依赖和样式文件 首先,在HTML文件中引入jQuery和ligerUI的JS文件和CSS文件。 <link href="path/to/ligerui/css/ligerUI-all.css" rel="stylesheet"…

    Java 2023年6月16日
    00
  • Java时间轮算法的实现代码示例

    Java时间轮算法是一种实现定时任务调度的算法,它的实现原理是使用一个循环的时间轮来管理任务的执行时间。该算法的效率高、精度高、可靠性高,因此在实际项目中被广泛应用。以下是实现Java时间轮算法的攻略及代码示例。 实现步骤 Java时间轮算法的实现分为以下步骤: 定义时间轮:需要定义时间轮的大小(即时间间隔),以及每个槽(slot)上要执行的任务列表。 初始…

    Java 2023年5月18日
    00
  • Java中BM(Boyer-Moore)算法的图解与实现

    Java中BM(Boyer-Moore)算法的图解与实现 前言 本文主要介绍在Java中实现BM算法。BM算法是一种高效的模式匹配算法,其核心思想是,对于模式串的每个字符,在匹配串中寻找该字符时,优先从模式串的尾部开始匹配,以减少匹配步骤。本文将详细介绍BM算法的流程,并提供两个示例以帮助读者更好地理解该算法。 算法流程 计算字符偏移量表 字符集假设有m个字…

    Java 2023年5月19日
    00
  • 详解Java实现分治算法

    详解Java实现分治算法 分治算法是一种很重要的算法思想,它具有很高的实用性和普遍性。在本文中,我们将详细讲解如何使用Java实现分治算法,帮助大家更加深入地理解分治算法的实现过程。 什么是分治算法 分治算法指的是将一个大问题拆分成若干个相似的小问题,最终通过合并小问题的解来解决大问题的方法。分治算法一般包括三个步骤: 分解原问题为若干个子问题; 解决每个子…

    Java 2023年5月18日
    00
  • 详解Tomcat是如何实现异步Servlet的

    详解Tomcat如何实现异步Servlet。 什么是异步Servlet Servlet是JavaWeb应用程序中的一种Java类,用于处理接收到的HTTP请求并返回HTTP响应。在Web应用程序的架构中,Servlet在Web服务器(如Tomcat)和Web客户端之间充当中间件的角色。在同步编程模型中,Servlet在完成处理请求后,直接返回结果给Web客户…

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