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日

相关文章

  • 脚本发生错误怎么解决 当前页的脚本发生错误的解决方法小结

    脚本发生错误怎么解决 当网站出现脚本发生错误时,可能导致页面无法正常运行,给用户造成极大的困扰,因此我们需要及时修复这些问题,以确保用户的良好体验。本文将为大家介绍如何解决脚本发生错误的问题。 1. 查看错误提示 当脚本发生错误时,浏览器会给出相关的错误提示信息,我们可以根据提示信息快速定位问题所在。常见的错误提示信息包括:语法错误、未定义变量、函数调用错误…

    Java 2023年5月23日
    00
  • RedisTemplate访问Redis的更好方法

    让我来详细讲解RedisTemplate访问Redis的更好方法的完整攻略。 RedisTemplate介绍 RedisTemplate是一个封装了Jedis库的Spring框架的Redis操作工具类,使用它可以更方便、更快速、更安全地对Redis进行读写。 如何使用RedisTemplate 使用RedisTemplate操作Redis,需要先创建一个Re…

    Java 2023年5月20日
    00
  • Code Review理论与实战详解

    下面详细讲解一下“Code Review理论与实战详解”的完整攻略。 1. Code Review的定义 Code Review是指对软件开发过程中的代码和文档进行审核的过程,旨在发现代码缺陷和潜在的问题,并提出改进意见。 2. Code Review的目的 Code Review的目的是提高代码质量和生产效率,减少维护和调试时间,并增加团队协作的效率。在C…

    Java 2023年5月26日
    00
  • java实现俄罗斯方块

    Java实现俄罗斯方块攻略 简介 俄罗斯方块游戏是一种非常经典的休闲益智类游戏。在该游戏中,玩家需要操作不同形状的方块,让它们在游戏区域中不断滑落并堆积起来。玩家可以左右移动,旋转方块,并调整落地速度,以获得高分。 使用Java语言实现一个俄罗斯方块游戏,可以锻炼对Java语言的掌握程度和提升自己的编程能力。在本文中,将详细讲解如何使用Java语言来实现俄罗…

    Java 2023年5月19日
    00
  • Spring JPA的实体属性类型转换器并反序列化工具类详解

    Spring JPA实体属性类型转换器并反序列化工具类详解 背景介绍 在开发中,我们经常会用到Spring Data JPA(Java Persistence API)来访问数据库并进行数据持久化,而在实际开发中,我们会面临很多原本无法直接与数据库进行映射的数据类型。这时候我们需要将其转换为数据库可以映射的类型进行存储操作。针对这一问题,Spring提供了很…

    Java 2023年5月20日
    00
  • java的Hibernate框架报错“ObjectModifiedException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“ObjectModifiedException”错误。这个错误通常是由于以下原因之一引起的: 对已修改的实体进行操作:如果您试对已修改的实体进行操作,则可能会出现此错误。在这种情况下,需要检查实体是否已被修改,并避免对已修改的实体进行操作。 并发访问问题:如果多个线程同时访问同一个实体,则可能会出现此错误…

    Java 2023年5月4日
    00
  • JSP入门教程(4)

    当然,我很高兴为您提供有关“JSP入门教程(4)”完整攻略的详细解释。 简介 在JSP入门教程的第四部分中,我们将学习如何使用JSP中的if-else语句和switch语句,这些语句用于控制流程和决策。 if-else语句 if-else语句是一种流程控制语句,可用于根据条件执行不同的代码块。在JSP页面中,可以使用以下语法来编写if-else语句: &lt…

    Java 2023年6月15日
    00
  • Java中使用JDBC操作数据库简单实例

    下面是详细的Java中使用JDBC操作数据库的完整攻略。 1. JDBC简介 Java Database Connectivity (JDBC) 是一种能够让Java程序与各种数据库进行连接、查询、更新、插入和删除等操作的API。使用JDBC API进行数据库操作的通常步骤如下: 加载JDBC驱动程序。 建立JDBC连接。 创建JDBC Statement或…

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