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日

相关文章

  • Mybatis实现传入多个参数的四种方法详细讲解

    Mybatis实现传入多个参数的四种方法详细讲解 在 Mybatis 中,我们常常需要传入多个参数来完成一次数据库操作。在 Mybatis 中,传递多个参数的方法有多种,这篇文章将详细介绍其中四种实现方法。 方法一:多个参数设置为Map 在 Mybatis 中,可以使用 Map 作为传递多个参数的容器。使用 Map 的好处是可以为参数取名,容易理解更易于维护…

    Java 2023年5月20日
    00
  • 入门Java线程基础一篇就够了

    来讲解一下“入门Java线程基础一篇就够了”的攻略吧。 1. Java线程基础概念 1.1 什么是线程? 简单来说,线程是程序执行的一个单独的流程或执行单元。在Java中,每一个线程都是通过Thread类来创建和管理的。 1.2 如何创建一个线程? Java中创建线程的方式有两种: 继承Thread类,重写run()方法。 实现Runnable接口。 示例1…

    Java 2023年5月20日
    00
  • extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面

    下面是“extjs 3.31 TreeGrid实现静态页面加载json到TreeGrid里面”的完整攻略。 1. 前置知识 在开始介绍本篇攻略之前,我们需要简单了解一下以下技术: Ext JS 3.31框架 JSON数据格式 如果您对以上知识不熟悉,我们建议您首先了解这些知识点,以便更好地理解本篇攻略。 2. 实现步骤 2.1 准备JSON数据 在实现“ex…

    Java 2023年6月15日
    00
  • 详解SpringMVC实现图片上传以及该注意的小细节

    在 Spring MVC 中,实现图片上传是一个常见的需求。本文将详细讲解如何实现图片上传,包括如何配置文件上传解析器、如何编写控制器方法、如何处理上传文件、以及需要注意的小细节。同时,本文还提供了两个示例说明,演示如何实现图片上传。 配置文件上传解析器 在 Spring MVC 中,我们需要配置文件上传解析器来解析上传的文件。下面是一个示例代码,演示如何配…

    Java 2023年5月18日
    00
  • Java 编程之IO流资料详细整理

    Java 编程之IO流资料详细整理 什么是 IO 流 输入输出流(IO流)指的是一种提供了对数据流进行读写的机制,是 Java 中用于处理流数据的一种常用方式。在 Java 中,IO 流分为字节流和字符流两种方式,分别处理二进制数据和文本数据。 IO 流的分类 字节流 字节流是 IO 流中最基本的一种,主要用于处理二进制数据。Java 中的字节流有两个基本的…

    Java 2023年5月23日
    00
  • 基于Java SSM实现在线点餐系统

    下面就详细讲解基于Java SSM实现在线点餐系统的完整攻略。 1. 系统设计 1.1 系统架构 在线点餐系统的系统架构主要包括四部分:前端展示、后台管理、数据库系统和服务器部署。其中,前端展示部分采用HTML、CSS和JavaScript等技术实现,后台管理部分采用Java SSM框架构建,数据库系统采用MySQL,服务器部署采用Tomcat。 1.2 数…

    Java 2023年5月24日
    00
  • java多版本共存

    原理 通过脚步改变path环境变量来实现java多版本切换.这里使用的是Win10. 一,删除原有的java搜索路径. 在安装高版本的java时,会添加一个路径到path环境变量中,如我的C:\Program Files\Common Files\Oracle\Java\javapath,在该目录下存有java.exe和javac.exe等.在用cmd执行命…

    Java 2023年4月17日
    00
  • java实现大数加法(BigDecimal)的实例代码

    下面就是详细讲解“java实现大数加法(BigDecimal)的实例代码”的完整攻略: 1. 简介 在 Java 中,整数类型有其上限和下限,如果数值超出其范围,就会产生溢出,导致计算结果不正确。 为了解决这个问题,我们可以使用 BigDecimal 类型来进行大数值的加、减、乘、除运算,以确保计算的精确性。 2. 引入 BigDecimal 类 要使用 B…

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