详解Java中的八种单例创建方式

下面我来详细讲解Java中的八种单例创建方式的完整攻略。

标题

一、单例模式概述

单例模式是设计模式中常见的一种,用于保证一个类仅有一个实例,并提供一个全局的访问点进行访问。

二、Java中八种单例创建方式

1. 饿汉式

饿汉式是最基本的实现方式,它在类加载的时候就创建了对象实例。

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

示例说明:

public class Demo {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        System.out.println(instance);
    }
}

2. 懒汉式

懒汉式是最常用的实现方式,它在需要进行访问时才创建对象实例。

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 Demo {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        System.out.println(instance);
    }
}

3. 静态内部类

静态内部类方式是一种比较优雅的方式,它既能够实现懒加载,又能够保证线程安全。

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 Demo {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        System.out.println(instance);
    }
}

4. 枚举方式

枚举方式是JDK5之后新增的一种方式,它比较简单,并且天生就是单例的。

public enum Singleton {
    INSTANCE;
}

示例说明:

public class Demo {
    public static void main(String[] args) {
        Singleton instance = Singleton.INSTANCE;
        System.out.println(instance);
    }
}

5. 双重校验锁

双重校验锁方式是一种比较常用的实现方式,它能够实现懒加载,并且保证了线程安全。

public class Singleton {
    private volatile static 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 Demo {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        System.out.println(instance);
    }
}

6. ThreadLocal方式

ThreadLocal方式是一种比较少用的实现方式,它的实例是线程局部的。

public class Singleton {
    private static final ThreadLocal<Singleton> threadLocalInstance =
            ThreadLocal.withInitial(Singleton::new);
    private Singleton() {}
    public static Singleton getInstance() {
        return threadLocalInstance.get();
    }
}

示例说明:

public class Demo {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        System.out.println(instance);
    }
}

7. CAS方式

CAS方式是一种比较高级的实现方式,它利用了Java的原子操作来保证线程安全。

public class Singleton {
    private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<>();
    private Singleton() {}
    public static Singleton getInstance() {
        for (;;) {
            Singleton singleton = INSTANCE.get();
            if (singleton != null) {
                return singleton;
            }
            singleton = new Singleton();
            if (INSTANCE.compareAndSet(null, singleton)) {
                return singleton;
            }
        }
    }
}

示例说明:

public class Demo {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        System.out.println(instance);
    }
}

8. 操作系统名方式

操作系统名方式是一种比较神奇的实现方式,它利用了操作系统的特性来保证单例。

public class Singleton {
    private static Singleton instance = null;
    static {
        String osName = System.getProperty("os.name");
        if (osName.equals("Windows 10")) {
            instance = new Singleton();
        }
    }
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

示例说明:

public class Demo {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        System.out.println(instance);
    }
}

三、总结

本文介绍了Java中的八种单例创建方式,并对每种方式进行了详细的讲解和示范,希望能够帮助大家深入理解单例模式的实现方式。

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

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

相关文章

  • springmvc mybatis集成配置示例

    下面是关于“SpringMVC MyBatis集成配置示例”的完整攻略,包含两个示例说明。 SpringMVC MyBatis集成配置示例 SpringMVC和MyBatis是Java Web应用程序开发中常用的框架。在本文中,将介绍如何使用这两个框架来构建一个Web应用程序。 步骤1:添加依赖 首先,我们需要在pom.xml文件中添加SpringMVC和M…

    Java 2023年5月17日
    00
  • JAVA用递归实现全排列算法的示例代码

    全排列算法是一个经典的、递归思想的算法,它将一组数据按照一定顺序排列,使得每个数据都和其他数据组成一组不同的排列。在JAVA中,我们可以利用递归的思想来实现全排列算法。以下是针对该问题的完整攻略: 1. 全排列算法的基本原理: 全排列算法的基本原理是:对于一个长度为n的序列,全排列可分解为两部分:固定第一个元素,对剩余的n-1个元素进行全排列;再将每一个排列…

    Java 2023年5月26日
    00
  • 深入剖析java中的集合框架

    深入剖析Java中的集合框架 什么是集合框架 集合框架(Collection Framework)是Java提供的一种处理数据集合的工具,提供了一组接口和类,用于存储、操作和处理数据。 集合框架的主要目的是使我们能够更方便地管理和处理数据。它定义了一系列接口和类(如List、Set、Map等),用于表示不同的数据集合。通过这些接口和类,我们可以使用各种数据结…

    Java 2023年5月26日
    00
  • SpringBoot Http远程调用的方法

    介绍SpringBoot远程调用HTTP接口的方法主要有以下两种: 一、使用Spring的RestTemplate Pom.xml中引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-star…

    Java 2023年5月26日
    00
  • 如何基于java实现Gauss消元法过程解析

    如何基于Java实现Gauss消元法过程解析 什么是Gauss消元法? Gauss消元法,也叫高斯消元法,是一种线性方程组解法。它的基本思想是通过线性方程组的初等变换,将方程组化为一个阶梯形的简化的方程组,由此得到方程组的解。 Gauss消元法的原理 对于一个有n个未知数的线性方程组,它可以表示为Ax=b的形式,其中A是一个n阶矩阵,b是n维列向量,x是n维…

    Java 2023年5月19日
    00
  • Mybatis一对多与多对一查询处理详解

    Mybatis一对多与多对一查询处理详解 Mybatis是一个支持高度定制化SQL查询、缓存处理和参数映射的框架。在Mybatis中,一对多与多对一的查询是非常常见和重要的使用情景。本文将详细介绍Mybatis一对多与多对一查询的处理方法。 一对多查询 一对多查询指的是,在表之间通过一个外键关联形成的一种关系,即一个父对象对应多个子对象。下面是一个一对多的示…

    Java 2023年5月20日
    00
  • Java堆排序算法详解

    Java堆排序算法详解 Java堆排序(Heap Sort)算法是一种高效的排序算法,其时间复杂度为 $O(nlogn)$。该算法使用了最大堆或最小堆来进行排序,具有不占用额外空间、稳定性好等特点。下面我们将详细介绍Java堆排序算法的完整攻略。 1. 堆定义与性质 在Java堆排序算法中,使用的堆是一种完全二叉树,并且堆中的每个节点都大于等于(最大堆)或小…

    Java 2023年5月19日
    00
  • jquery zTree异步加载简单实例分享

    首先,让我们来了解一下什么是 jQuery zTree 以及异步加载。 jQuery zTree 是什么? jQuery zTree 是一款基于 jQuery 的树形视图插件,它具有结构清晰、功能强大和使用简便的特点。它可以帮助我们轻松实现一个树形结构的网页,比如分类列表、目录树、导航菜单等等。 异步加载是什么? 当我们需要渲染的树形结构数据较大时,如果一次…

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