Java中单例模式的七种写法示例

Java中单例模式的七种写法示例

什么是单例模式?

单例模式是一种创建型设计模式,它保证某个类在应用程序中只有一个对象实例存在。

在应用程序中,有些实例对象需要全局唯一,比如数据库连接实例、日志记录实例等,此时就可以使用单例模式来确保只创建一个对象实例,以达到节约系统资源的目的。

单例模式的七种实现方式

1. 饿汉式单例模式

public class Singleton1{
    private static Singleton1 instance = new Singleton1();
    private Singleton1(){}

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

在类加载时,就创建了静态的实例对象,保障了在多线程环境下也能保证唯一的实例对象。

此方式的缺点是:在应用程序启动时,就创建了实例对象,占用了一部分JVM内存,如果这个对象无法在应用程序启动后被调用,就浪费了系统资源,且不能实现懒加载,需要时间和空间上的代价。

2. 懒汉式单例模式(线程不安全)

public class Singleton2{
    private static Singleton2 instance;
    private Singleton2(){}

    public static Singleton2 getInstance() {
        if(instance == null) {
            instance = new Singleton2();
        }
        return instance;
    }
}

此方式是懒汉式的单例模式,只有在调用该方法时才会创建并返回实例对象,但是,在多线程环境下,可能会出现多个实例对象的情况。

3. 懒汉式单例模式(线程安全,效率低)

public class Singleton3{
    private static Singleton3 instance;
    private Singleton3(){}

    public static synchronized Singleton3 getInstance() {
        if(instance == null) {
            instance = new Singleton3();
        }
        return instance;
    }
}

考虑到线程安全问题,该方法添加了synchronized关键字,保证只有一个线程可以访问创建实例对象的过程,保证线程安全。但是,由于该方法在整个过程中只有一个线程可以执行,因此会带来效率低下的问题。

4. 双重检查锁单例模式(线程安全)

public class Singleton4{
    private volatile static Singleton4 instance;
    private Singleton4(){}

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

该方法对懒汉式方法进行了优化,利用双重检查锁定机制,在多线程环境下保证只创建唯一的实例对象、线程安全,同时,在实例对象创建完成后,其他线程可以直接访问实例对象。 使用volatile关键字可以保证线程间变量的可见性,从而保证线程安全。

5. 静态内部类单例模式

public class Singleton5{
    private Singleton5(){}

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

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

采用静态内部类的方式,保证实例对象唯一,线程安全,同时具有懒加载的優點。

6. 枚举写法单例模式

public enum Singleton6 {
    INSTANCE;

    public static Singleton6 getInstance() {
        return INSTANCE;
    }
}

JDK1.5开始支持枚举类型。这种方式在多线程环境下也可以保证实例对象唯一、线程安全,并且可以防止反射机制和反序列化攻击。

7. ThreadLocal单例模式

public class Singleton7{
    private static final ThreadLocal<Singleton7> threadLocalInstance = new ThreadLocal<Singleton7>() {
        @Override
        protected Singleton7 initialValue() {
            return new Singleton7();
        }
    };

    private Singleton7(){}

    public static Singleton7 getInstance() {
        return threadLocalInstance.get();
    }
}

采用ThreadLocal的方式,保证单例对象的唯一性,在多线程环境下也能够保证线程安全。

小结

以上是Java中七种单例模式的实现方式,每种方式都可以应对不同情况下的开发需求。在实际应用中,可以选择最适合自己需求的方式进行使用。

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

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

相关文章

  • Spring oxm入门实例

    Spring OXM 简介 Spring OXM 是 Spring Framework 中的一个模块,主要用于支持对象到 XML 和 XML 到对象的互相转换。OXM 是 Object/XML Mapping 的缩写,常用于系统之间的数据传输或存储,例如将 Java 对象序列化为 XML 格式存入数据库或者网络传输,另一方也可以将 XML 格式还原为 Jav…

    Java 2023年5月20日
    00
  • Java 实战项目之毕业设计管理系统的实现流程

    Java 实战项目之毕业设计管理系统的实现流程 项目背景介绍 毕业设计管理系统是一款便于学校教师、学生交流的平台,旨在方便学生申请并确认自己的毕设课题,并使教师能够更好的管理学生的毕业设计过程,帮助学生更好的完成毕设项目。 项目实现流程 第一步、需求调研 在设计毕业设计管理系统之前,我们首先需要对项目需求进行调研和分析,确定不同用户的需求,并了解他们可能遇到…

    Java 2023年5月24日
    00
  • 简单了解Spring Boot及idea整合jsp过程解析

    下面我来详细讲解一下“简单了解SpringBoot及idea整合jsp过程解析”的完整攻略。 什么是SpringBoot? SpringBoot 是一个基于 Spring 框架的全新框架,旨在简化 Spring 应用程序的创建和开发过程,它采用约定大于配置的原则,自动配置 Spring 和第三方库,提供了一组默认的 Starter 依赖项,可以快速搭建起基于…

    Java 2023年5月15日
    00
  • Java反射学习 getClass()函数应用

    Java反射是指在程序运行时动态地查找、加载、使用类和方法的能力。在Java反射中,getClass()函数是非常重要的一个函数。本文将为大家详细讲解Java反射学习中getClass()函数的应用。 什么是getClass()函数? 在Java语言中,所有的对象在运行时都拥有一个getClass()函数。这个函数可以用来获取当前对象的类型信息,返回值是Cl…

    Java 2023年5月26日
    00
  • java 中数组初始化实例详解

    Java 中数组初始化实例详解 在 Java 中,我们可以使用数组来存储一组数据。在使用数组时,我们需要先进行初始化。本文将详细介绍 Java 中数组的初始化方法,包括静态初始化和动态初始化。 静态初始化 静态初始化可以初始化数组元素的值,可以使用以下两种方式实现: 直接赋值法 在创建数组时,使用花括号 {} 将初始化的元素放入括号中,并使用逗号 , 分隔每…

    Java 2023年5月26日
    00
  • 微信小程序仿知乎实现评论留言功能

    下面我将为您详细讲解“微信小程序仿知乎实现评论留言功能”的完整攻略。 一、前置知识和准备工作 在开始编写代码前,需要准备好以下工具和知识: 微信开发者工具:用于开发和调试微信小程序,可在微信公众平台下载并安装。 知乎API:用于获取知乎的相关数据,需要向知乎开放平台申请。 Markdown渲染库:用于将知乎中的Markdown格式的文本转化成小程序可显示的格…

    Java 2023年5月23日
    00
  • Java实现图书馆借阅系统

    Java实现图书馆借阅系统攻略 1. 需求分析 在实现图书馆借阅系统之前,需要进行需求分析,明确系统应具有哪些功能,以及功能的实现方式。常见的图书馆借阅系统功能如下: 添加图书:包括书名、作者、出版社、ISBN等信息; 查询图书:支持关键字查询,可以根据书名、作者、ISBN等信息查询; 借阅图书:对某一本书进行借阅操作,记录借阅人和借阅日期; 归还图书:对已…

    Java 2023年5月23日
    00
  • c# 实现雪花分形的示例

    C# 实现雪花分形的示例攻略 什么是雪花分形 雪花分形指的是由Koch曲线组成的图形。Koch曲线是一条无限长的分形曲线,由等边三角形递归地扩展而来。 实现步骤 第一步:绘制基础图形 首先,我们需要绘制一个等边三角形,作为雪花分形的基础图形。 Graphics g = this.CreateGraphics(); Pen pen = new Pen(Colo…

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