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

yizhihongxing

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日

相关文章

  • java.lang.String和java.util.NClob互相转换方式

    在Java中,Java.lang.String类和Java.util.NClob类都是字符串类。但是,NClob是用于处理CLOB(字符大对象)的类,而String类则是用于处理字符串的类。如果需要将它们互相转换,需要进行一些特殊的步骤和技巧。下面是将Java.lang.String和Java.util.NClob类互相转换的完整攻略。 将String转换为…

    Java 2023年5月27日
    00
  • jdk安装、Java环境配置方法详解

    JDK安装、Java环境配置方法详解 什么是JDK? Java Development Kit(JDK)是一个开发环境,它允许开发人员创建Java应用程序并将其部署到不同的运行环境中,例如桌面和服务器。 JDK包含Java Runtime Environment(JRE)以及开发人员需要创建Java应用程序和Applet的工具。 JDK安装步骤 下载JDK安…

    Java 2023年5月23日
    00
  • springmvc实现json交互-requestBody和responseBody

    下面是针对SpringMVC实现JSON交互的攻略。 什么是SpringMVC? Spring MVC是Spring框架的一个模块,它基于MVC(Model-View-Controller)设计模式。Spring MVC是一个Web框架,可以用来构建Web应用程序。它提供了一组强大的工具和API来简化Web开发,尤其是针对Web层的请求-响应建模,如前端控制…

    Java 2023年5月26日
    00
  • 什么是Java内存模型?

    Java内存模型是一个规定了线程之间如何通过内存进行通讯的规范。JMM(Java Memory Model)规定了Java虚拟机如何控制线程与内存之间的数据传输。JMM主要通过定义内存栅栏和Happens-Before规则来实现线程通信。 JMM内存栅栏 内存栅栏是指一种同步屏障,用于强制共享数据的可见性和顺序性,确保各线程对内存所读到的数据是一致的。 Lo…

    Java 2023年5月11日
    00
  • 解决JavaWeb读取本地json文件以及乱码的问题

    针对“解决JavaWeb读取本地json文件以及乱码的问题”,我提供以下完整攻略: 1. 确认本地json文件的格式和编码类型 在读取本地json文件时,首先需要确认文件的格式和编码类型。常见的json格式有两种:一是普通json格式,文件后缀为.json;二是jsonp格式,文件后缀为.js,其中以javascript对象的方式来表示json数据。 接下来…

    Java 2023年5月26日
    00
  • Java 超详细讲解对象的构造及初始化

    首先需要明确的是,对象的构造和初始化是面向对象编程中非常重要的概念,它影响着对象的生命周期和对象各个属性的默认值。 什么是构造函数 在Java中,每个类都有一个构造函数,它是一个特殊的方法,用于实例化对象时被调用,构造函数通常用于初始化对象的属性,并确保对象在被实例化后能够正常使用。 在Java中,构造函数的名字与类名相同,没有返回值,可以像方法一样拥有参数…

    Java 2023年5月26日
    00
  • Java实现优先队列式广度优先搜索算法的示例代码

    实现优先队列式广度优先搜索(Priority Queue-based BFS)算法需要遵循以下几个步骤: Step 1:初始化 首先,我们需要初始化一个待访问节点的优先队列priority queue、一个已访问节点的哈希表visited map、以及图的邻接表adjacent list。将源节点加入到priority queue中,并将visited ma…

    Java 2023年5月19日
    00
  • Spring Boot 2.0.0 终于正式发布-重大修订版本

    SpringBoot2.0.0终于正式发布-重大修订版本攻略 SpringBoot2.0.0是SpringBoot发布的一个重大修订版本,本次更新对整个Spring Framework进行了重构和升级,以适应更高效、更快速的应用程序开发。本文将详细介绍如何使用SpringBoot2.0.0,包括安装、创建项目、配置、测试以及示例代码。 安装 安装Spring…

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