详解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日

相关文章

  • SpringBoot浅析安全管理之Spring Security配置

    让我来详细讲解一下“SpringBoot浅析安全管理之Spring Security配置”的完整攻略。 概述 Spring Security是一个功能强大且灵活的框架,它为我们提供了许多功能,包括身份验证,授权,安全性配置等。本篇文章将介绍如何在Spring Boot项目中配置Spring Security。 依赖项 首先,请确保您已经添加了Spring S…

    Java 2023年5月20日
    00
  • 高效的java版排列组合算法

    高效的Java版排列组合算法 前言 排列组合是数学中的一种常见问题,例如给定数列[1,2,3],对其进行排列组合可以得到以下六种可能: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 在Java中,我们可以使用递归和循环等方式来实现排列组合,但是如果数列过长,将会十分耗时,因此我们需要一种高效的实现方式。 算法基础 排列 排列的基本概…

    Java 2023年5月19日
    00
  • ASP开发中存储过程应用全接触

    ASP开发中存储过程应用全接触 什么是存储过程? 在数据库中,存储过程是一组为了完成特定任务的SQL语句集合。存储过程可以接收数据、处理数据并返回数据,它可以调用其他存储过程、控制逻辑、计划任务和其他编程构造。存储过程可以显著提高数据库的性能,同时也具备一些安全性和封装性方面的优势。在ASP开发中使用存储过程,可以使代码结构更清晰,可维护性更高,同时也能提高…

    Java 2023年6月16日
    00
  • JSP中的倒数计时和自动跳转页面

    关于JSP中的倒数计时和自动跳转页面,我来为您详细讲解一下。 倒数计时 在JSP页面中实现倒数计时,可以使用JavaScript来完成。具体步骤如下: 步骤一:在JSP页面上引入JavaScript代码 <script type="text/javascript"> </script> 步骤二:通过JavaScri…

    Java 2023年6月15日
    00
  • java实现的导出Excel工具类实例

    下面详细讲解一下如何使用Java实现导出Excel工具类。 实现思路 导出Excel的实现思路如下: 创建一个Workbook对象 创建Sheet对象 创建Row对象 创建Cell对象 设置单元格的值 保存Excel 实现步骤 1. 引入poi依赖 在项目的pom.xml文件中添加以下依赖: <dependency> <groupId&gt…

    Java 2023年5月26日
    00
  • Spring EL表示式的运用@Value说明

    下面是关于Spring EL表达式的运用@Value说明的完整攻略。 什么是Spring EL表达式 Spring EL表达式是Spring框架提供的一个表达式语言,可以用于从属性文件中获取配置项、注入Bean属性值等场景,具有简洁灵活的特点。例如,可以通过${}语法访问在Spring应用程序上下文中定义的属性。 基础语法 Spring EL表达式的基础语法…

    Java 2023年6月15日
    00
  • 导入SpringCloud依赖踩的坑及解决

    下面我将详细讲解“导入SpringCloud依赖踩的坑及解决”的完整攻略。 导入SpringCloud依赖踩的坑及解决 1. 问题描述 在开发SpringCloud项目时,我们需要导入一些SpringCloud相关的依赖包,但在引入这些依赖时,可能会遇到一些坑,阻碍我们项目的正常开发。以下是一些可能遇到的问题: 版本依赖冲突问题:SpringCloud的各个…

    Java 2023年5月31日
    00
  • Java基础:流Stream详解

    Java基础:流Stream详解 什么是流Stream? Java中的流(Stream)是指代表数据流通的对象。Stream与java.io包中的流不同,Stream没有io操作,是一种抽象的数据结构,是一种更高级、更便捷、更优雅的处理数据的方式。Stream的目的是通过类似于流水线的方式来处理集合中的元素,通过流的操作,可以将对集合的处理变得更加简单、减少…

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