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日

相关文章

  • SpringMvc定制化深入探究原理

    以下是关于“SpringMVC定制化深入探究原理”的完整攻略,其中包含两个示例。 SpringMVC定制化深入探究原理 SpringMVC是一个基于MVC架构的Web框架,它提供了一种灵活、高效的方式来开发Web应用程序。在SpringMVC中,我们可以通过定制化来满足特定的需求。本攻略将深入探究SpringMVC定制化的原理,并提供两个示例。 定制化原理 …

    Java 2023年5月16日
    00
  • Maven deploy配置方法详解

    Maven deploy配置方法详解 在Maven项目中,使用deploy命令可以将项目打包并发布到Maven仓库中。下面详细介绍Maven deploy的配置方法。 1. 配置POM文件 在Maven项目的pom.xml文件中,需要配置Maven的distributionManagement节点。该节点的repository子节点配置发布到的Maven仓库…

    Java 2023年5月19日
    00
  • mybatis分页效果实现代码

    下面我来详细讲解一下mybatis分页效果实现代码的完整攻略。 什么是mybatis分页? mybatis分页是指将查询出来的结果集分成一定数量的小部分,每次只显示其中的一部分,以此来获得更加良好的用户体验。在使用mybatis进行开发时,我们可以利用一些已有的插件或者自定义代码来实现mybatis分页。 基于插件实现mybatis分页 在mybatis中,…

    Java 2023年5月20日
    00
  • 浅谈Mybatis获取参数值的方式

    下面是详细的“浅谈Mybatis获取参数值的方式”的攻略。 前言 在Mybatis中获取参数值是常见的操作。本文将向你介绍Mybatis中获取参数值的方式,帮助你更好的使用Mybatis。 直接获取参数名 可以直接在Mapper方法的参数中来获取实际传入参数的名称和值。 代码示例 public interface UserMapper{ void inser…

    Java 2023年5月20日
    00
  • Java如何实现密码加密

    Java实现密码加密的方法有很多种,常用的包括MD5加密、SHA加密、AES加密、DES加密等,下面分别进行详细讲解。 1. MD5加密 MD5是哈希加密的一种,可以将任意长度的数据转换为固定长度的数据。Java提供了MessageDigest类来支持MD5加密,示例代码如下: import java.security.MessageDigest; impo…

    Java 2023年5月19日
    00
  • Java解压zip文件完整代码分享

    好的。首先,我们需要使用Java代码解压缩一个ZIP文件。下面是代码实现的过程: 步骤1:导入Java ZIP库 首先,我们需要在项目中导入Java的ZIP库,这可以通过在POM.xml文件中添加以下依赖项来实现: <dependency> <groupId>org.apache.commons</groupId> &lt…

    Java 2023年5月20日
    00
  • Tomcat 多站点配置详解及实现方法

    下面是关于 “Tomcat 多站点配置详解及实现方法” 的完整攻略,包含以下内容: 一、前提条件 在进行 Tomcat 多站点配置前,需要提前了解以下几个知识点: Tomcat 的部署方式 基本的 Tomcat 目录结构 虚拟主机的概念 DNS 解析的原理和流程 二、基本步骤 Tomcat 多站点配置的基本流程如下: 创建虚拟主机配置 在 Tomcat 的 …

    Java 2023年5月19日
    00
  • Spring实现IoC的多种方式小结

    下面是针对“Spring实现IoC的多种方式小结”的完整攻略。 什么是IoC IoC全称为Inversion of Control,即控制反转。在传统的程序设计过程中,我们的程序直接依赖与各种类及其实例对象,而这些类与实例则需要通过new操作符来创建。这种程序设计方式称为紧耦合,当实例化对象的方式发生变化时,可能需要修改大量的代码。而IoC则是一种解决方案,…

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