首页 > 其他分享 >单例模式

单例模式

时间:2023-02-04 09:56:00浏览次数:32  
标签:模式 static 单例 线程 public 加载

单例模式这边主要写单例模式的实现方式和总结:话不多说直接上代码:

单例模式之饿汉模式:

代码(Coding):

/**
 * 饿汉模式: 在类加载的时候就把对象给一并加载完成 因此不存在线程安全问题 具体实现如下:
 */
public class SingleTonDemo01 {
    // 1、私有化构造器
    private SingleTonDemo01(){}
    // 2、定义静态变量
    private static SingleTonDemo01 singleTonDemo01 = new SingleTonDemo01();
    // 3、公开获取INSTANCE的方法
    public static SingleTonDemo01 getInstance() {
        return singleTonDemo01;
    }
}

优点:代码简洁 并且由于类加载的时候就将单例实例也给一起初始化出来,因此是线程安全的 使用的时候直接调用就行 不用再创建!

缺点:由于类加载的时候也把单例实例给初始化了,如果没有使用,就会造成资源的浪费!

单例模式之懒汉模式:

代码(Coding):

/**
 * 懒汉模式:指的不是类加载就开始创建,它是延迟加载的,指正在调用使用单例实例的时候才开始创建
 */
public class SingleTonDemo02 {
    // 1、私有化构造器
    private SingleTonDemo02(){}
    // 2、定义静态变量 懒汉模式的这个变量需要用volatile来修饰(原因的话后面再说)
    private static volatile SingleTonDemo02 singleTonDemo02 = null;
    // 3、公开获取INSTANCE(单例实例)的方法
    public static SingleTonDemo02 getInstance() {
        // 先创建 要考虑高并发的情况 因此采用双重校验锁和volatile来保证线程安全
        if (singleTonDemo02 == null) { // 第一次校验
            // 上锁
            synchronized (SingleTonDemo02.class) {
                if (singleTonDemo02 == null) { // 第二次校验
                    // 才开始创建
                    singleTonDemo02 = new SingleTonDemo02();
                }
            }
        }
        return singleTonDemo02;
    }
}

优点:懒汉模式是指延迟加载的模式,它不是类一创建就一并将单例实例初始化 而是在真正使用调用单例实例的时候 才开始初始化单例实例(这样就不会造成资源的浪费),它是通过双重校验锁和volatile来保证线程安全性的

单例模式之静态内部类:

代码(Coding):

/**
 * 静态内部类:既能保证线程的安全性 又能懒加载 因为它只有被调用的开始初始化静态内部类 因此是线程安全的
 */
public class SingleTonDemo03 {
    // 1、私有化构造器
    private SingleTonDemo03() {
    }

    // 2、静态内部类
    private static class SingleTonHolder {
        // 定义静态变量
        private static final SingleTonDemo03 INSTANCE = new SingleTonDemo03();
    }
    // 3、提供获取单例实例的方法
    public static final SingleTonDemo03 getInstance() {
        return SingleTonHolder.INSTANCE;
    }
}

特点:静态内部类也是等单例实例被调用的时候才开始初始化,是线程安全的 并且是懒加载!

单例模式之枚举:

/**
 * 枚举:也是在第一次被调用的时候 才开始被JAVA虚拟机初始化 因此它是线程安全的 并且是懒加载的
 */
public enum SingleTonDemo04 {
    INSTANCE;

    public SingleTonDemo04 getInstance() {
        return INSTANCE;
    }

}

特点:枚举也是等单例模式被调用的时候 才被JAVA虚拟机初始化 也是线程安全的!并且它也是懒加载的!

总结:

单例模式适用于被经常访问的对象,或者创建和销毁时需要调用大量资源和时间,使用单例模式就可以避免频繁创建和销毁。单例模式的实现方式有四种:饿汉模式、懒汉模式、静态内部类、枚举

从代码简洁性、线程安全性和代码易读性综合来看,我个人比较推荐使用枚举和懒汉模式来实现单例模式(一般我们实际都是用懒汉模式)

 

标签:模式,static,单例,线程,public,加载
From: https://www.cnblogs.com/bichen-01/p/17090878.html

相关文章

  • 设计模式
    一、单例模式因为在编程开发中经常会遇到这样⼀种场景,那就是需要保证⼀个类只有⼀个实例哪怕多线程同时访问,并需要提供⼀个全局访问此实例的点。综上以及我们平常的开......
  • 跨境电商物流的运营模式
    从事跨境电商行业的卖家应该知道,跨境电商物流是一个非常重要的环节,产品能否快速的送到消费者手中是一个非常重要的环节,让客户有更好的购物体验可以提高用户的回购率,那么跨境......
  • 声明和类型模式匹配
    1.声明和类型模式:类型为T的声明模式在表达式结果为非NULL且满足以下任一条件时与表达式匹配varnumbers=newint[]{10,20,30};Console.WriteLine(GetSourceL......
  • 区块链交易所系统开发的模式介绍
    对于大多数人使用和开发区块链的目标来说,并不是要真的自己重新创建一套区块链,只是希望基于现有的区块链底层或技术框架去开发自己的应用。因此,对于类似加密算法、P2P技术、......
  • (十八)中介者模式
    1.概述中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。Colleague......
  • 分布式事务2种协议 及 4种模式
    分布式事务协议解决分布式事务,也有相应的规范和协议。分布式事务相关的协议有2PC、3PC。由于三阶段提交协议3PC非常难实现,目前市面主流的分布式事务解决方案都是2PC协议。......
  • web应用模式、api接口、接口测试工具postman、restful规范
    引用:https://www.cnblogs.com/liuqingzheng/p/9506212.html今日内容概要web应用模式API接口接口测试工具postmanrestful规范内容详细1、web应用模式#前后端混......
  • 【Redis集群】如何配置主从复制模式?
    目录前言概念环境配置(单机集群)基本查看命令开启三台服务前言默认情况下,每台Redis服务器都是主节点;由于个人服务器性能原因,以下的所有操作都是单机集群的概念!在实际工作......
  • MYSQL中锁的各种模式与类型
    MYSQL中锁的各种模式与类型https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ==&mid=2650436152&idx=1&sn=7e632ae7b72b62e9bc3296f02b992930&chksm=8396ba20b4e13336e831......
  • 一篇文章带你了解设计模式——结构型模式
    一篇文章带你了解设计模式——结构型模式在之前的文章中我们已经介绍了设计模式中的创建者模式下面我们来学习第二种类型的设计模式,结构型模式描述如何将类或对象按某种......