04 单例模式

本文介绍了单例模式的原理和在Java中的几种常见实现方式,包括饿汉式、懒汉式、优化懒汉式和静态内部类,通过实际运行时间对比了它们的效率和线程安全性。
摘要由CSDN通过智能技术生成

单例模式

单例模式的主要目的就是系统中有同一个类需要被反复使用,避免每次使用都重新创建和使用完之后就销毁,就只创建一次,每次使用都是用的同一个对象。
单例模式的实现在java中也是多种多样。
以下demo是常见的单例模式的简单实现以及效率对比,比较推荐使用静态内部类。
在这里插入图片描述

demo

package creationalpattern.singletonpattern;

import java.time.LocalDateTime;
import java.util.Date;

/**
 * @author tx
 * @version 1.0
 * @date 2024/1/6 10:55
 * @description:
 * 单例模式
 * 只有一个实例,
 * 主要用途是避免一个全局经常使用的类反复创建和销毁
 * 可以通过如下方式保障只有一个实例:
 *
 */
public class SingletonPattern {
    public static void main(String[] args) {
        /**
         * 效率对比
         */
        a();
        b();
        c();
        d();
        e();

    }
    public static void a(){
        Long start = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            SingletonA singletonAInstance = SingletonA.getSingletonAInstance();
            singletonAInstance.run();
        }
        Long end = System.currentTimeMillis();
        System.out.println("饿汉式");
        System.out.println("耗时:ms:"+(end-start));
    }
    public static void b(){

        Long start = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            SingletonB singletonBInstance = SingletonB.getSingletonBInstance();
            singletonBInstance.run();
        }
        Long end = System.currentTimeMillis();
        System.out.println("懒汉式");
        System.out.println("耗时:ms:"+(end-start));
    }
    public static void c(){
        Long start = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            SingletonC instance = SingletonC.getInstance();
            instance.run();
        }
        Long end = System.currentTimeMillis();
        System.out.println("优化懒汉式,双重校验");
        System.out.println("耗时:ms:"+(end-start));
    }
    public static void d(){
        Long start = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            SingletonD instance = SingletonD.getInstance();
            instance.run();
        }
        Long end = System.currentTimeMillis();
        System.out.println("静态内部类");
        System.out.println("耗时:ms:"+(end-start));
    }
    public static void e(){
        Long start = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            SingletonE instance = SingletonE.INSTANCE;
            instance.run();
        }
        Long end = System.currentTimeMillis();
        System.out.println("枚举");
        System.out.println("耗时:ms:"+(end-start));
    }
}

/**
 * 饿汉式
 * 类被加载的时候就创建了实例
 */
class SingletonA{
    private static final SingletonA singletonAInstance = new SingletonA();
    // 私有构造函数,不可被创建。
    private SingletonA(){};
    public static SingletonA getSingletonAInstance(){
        return singletonAInstance;
    }
    public void run(){
//        System.out.println(this);
    }
}
/**
 * 懒汉式
 * 类的实例化被延迟到第一次使用该类。
 * 用锁来保障线程安全,但是加锁有性能消耗
 */
class SingletonB{
    private static final SingletonB singletonBInstance = null;
    // 私有构造函数,不可被创建。
    private SingletonB(){};
    public static synchronized SingletonB getSingletonBInstance(){
        if(singletonBInstance==null){
            return new SingletonB();
        }
        return singletonBInstance;
    }
    public void run(){
//        System.out.println(this);
    }
}

/**
 * 优化懒汉式
 * 将锁加在方法内部的具体对象上,在锁内部在校验一次。
 */
class SingletonC{
    private static SingletonC instance=null;
    private SingletonC(){}
    public static SingletonC getInstance(){
        if(instance==null){
            synchronized(SingletonC.class){
                if (instance==null){
                    instance = new SingletonC();
                }
            }
        }
        return instance;
    }
    public void run(){
//        System.out.println(this);
    }
}

/**
 * 加载延迟到类的延迟到第一次使用,实现相较于升级版懒汉式实现简单
 */
class SingletonD{
    private static class Instance{
        private static final SingletonD instance = new SingletonD();
    }
    public static SingletonD getInstance(){
        return Instance.instance;
    }
    public void run(){
//        System.out.println(this);
    }
}
/**
 * 枚举
 */
enum SingletonE{
    INSTANCE,
    ;
    public void run(){
//        System.out.println(this);
    }
}
  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值