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

设计模式 单例模式

时间:2024-07-31 18:16:55浏览次数:11  
标签:Singleton getInstance 模式 class instance static 单例 设计模式 public

双重检查锁

package com.fh.design_mode.singleton.double_check_lock;

import lombok.SneakyThrows;

import java.util.concurrent.TimeUnit;

/**
 * 双重检查锁
 */
public class SingletonTest {

    public static void main(String[] args) {
        for (int i = 1; i <= 10; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "例对象=" + Singleton.getInstance());
            }, "线程" + i).start();
        }
    }
}

class Singleton {
    private static volatile Singleton instance = null;//volatile 禁止重排序

    private Singleton() {
    }

    @SneakyThrows
    public static Singleton getInstance() {
        if (instance == null) {//效率
            synchronized (Singleton.class) {
                System.out.println("【debug】" + Thread.currentThread().getName() + "获得对象锁");
                TimeUnit.SECONDS.sleep(2);
                if (instance == null) {//对象是否为空
                    /*
                    ①分配栈空间=》②分配堆内存=》③栈指针指向堆内存
                    因为重排序优化的存在
                    线程A①③栈指针指向堆内存,实例分配内存后就不是null。
                    线程B进入判断instance!=null,直接返回A线程创建的不完整的实例。
                    */
                    instance = new Singleton();
                }
                System.out.println("【debug】" + Thread.currentThread().getName() + "释放对象锁。。。");
            }
        }
        return instance;
    }
}

静态内部类

package com.fh.design_mode.singleton.static_inner_class;

import lombok.SneakyThrows;

import java.util.concurrent.TimeUnit;

/**
 * 静态内部类
 */
public class SingletonTest {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                Singleton.SingletonHolder a = new Singleton.SingletonHolder();

                System.out.println(Singleton.getInstance());
            }).start();
        }
    }
}

class Singleton {

    private Singleton() {

    }

    static class SingletonHolder {
        //虚拟机会保证一个类的 <clinit>() 方法在多线程环境中能被正确的加锁、同步。
        private static Singleton INSTANCE = new Singleton();
    }

    @SneakyThrows
    public static Singleton getInstance() {
        TimeUnit.SECONDS.sleep(3);
        return SingletonHolder.INSTANCE;
    }
}

饿汉式

package com.fh.design_mode.singleton.hungry_lock;

import lombok.SneakyThrows;

import java.util.concurrent.TimeUnit;

/*
 *饿汉式
 * */
public class SingletonTest {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                System.out.println(Sinleton.getInstance());
            }).start();
        }
    }
}

class Sinleton {

    private static final Sinleton instance = new Sinleton();

    private Sinleton() {
    }

    @SneakyThrows
    public static Sinleton getInstance() {
        TimeUnit.SECONDS.sleep(2);
        return instance;
    }
}

标签:Singleton,getInstance,模式,class,instance,static,单例,设计模式,public
From: https://www.cnblogs.com/goodluckxiaotuanzi/p/18335191

相关文章

  • OpenAI 向部分用户开放 GPT-4o 高级语音模式;AI 视频生成工具 Vidu 全球上线丨 RTE 开
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观......
  • 设计模式 - 简单工厂模式(Simple Factory Pattern)
    设计模式-简单工厂模式(SimpleFactoryPattern)  概要  记忆关键字:工厂类创建对象  定义:通过工厂类创建对象,并且根据传入参数决定具体子类对象的做法,就是简单工厂模式  分析:如果一个类的实例需要在许多地方被创建和初始化,而初始化的代码也比较复杂。此时可以考虑......
  • redis主从复制、哨兵模式、集群
    redis集群高可用redis集群的三种模式:1.主从复制(奇书3台一主两从)2.哨兵模式(3台一主两从)3.cluster(集群6333)主从复制:喝MySQL的主从复制类似,主可以写,写入主的数据通过RDB方式把数据同步到从服务器。从不能更新到主。也是哨兵模式的基础。缺点:没有办法进行故障自动......
  • 单例模式
    单例模式usingSystem;namespaceSingletonPattern{///<summary>///单例模式基类///</summary>///<typeparamname="T">要实现单例模式的类类型</typeparam>publicabstractclassSingletonBase<T>whereT:Singleton......
  • 电商商城创新商业模式深度剖析
    在探索电子商务的广阔领域时,选择最适合您企业的商业模式路径是迈向成功的关键一步。以下是对几种主要电子商务模式类型的深入解析,旨在帮助您找到那条通往繁荣的最佳路径。1. B2C(Business-to-Consumer)模式定义:B2C模式是指企业直接面向消费者销售产品和服务的电子商务模式。它缩......
  • 定制化电商商城系统:构建独特商业模式的创新之路
    随着互联网的飞速发展,电子商务已成为现代商业的重要组成部分。为了满足不同企业的特定需求和业务模式,电商商城系统的定制开发显得尤为重要。本文将深入探讨电商商城系统商业模式制度的定制开发过程,从需求分析、系统设计、开发实施到上线运营等各个环节进行详细解析。一、前期准......
  • VMWare设置桥接模式,CentOS7设置静态IP
    1、在VMWare中给虚拟机设置为桥接模式,如下图: 2、设置CentOS7静态IP(1)进入网络配置文件目录,命令如下:cd/etc/sysconfig/network-scripts/(2)查看网络配置文件(3)打开网络配置文件,命令如下:vimifcfg-ens33(4)参考以下对配置文件进行修改DEVICE=ens33#虚拟机网卡名......
  • Python rocketMq 客户端的同步和异步模式
    同步模式fromrocketmq.clientimportPushConsumer,ConsumeStatusimporttimedefcallback(msg):print(msg.id,msg.body,msg.get_property('property'))returnConsumeStatus.CONSUME_SUCCESSdefstart_consume_message():consumer=PushCon......
  • 装饰大师——装饰模式(Java实现)
    引言大家好,上期我们介绍了装饰模式在Python中的实现,今天,我们将继续探讨装饰模式,并展示如何在Java中实现它。装饰模式概述装饰模式的核心思想是将功能附加到对象上,而不是通过继承来实现,这种模式包含以下几个关键组成部分:组件接口:定义基本功能;具体组件:实现基本功能的类;装......
  • 浅谈数据中心机房机柜配电新模式及选型探讨
    摘要:分析当前数据中心机房传统列头柜配电方式的特点及其存在的问题。从提高机房末端配电安全性、可用性的角度出发,重点介绍数据中心机房机柜配电的新模式—智能母线槽配电方案。并对智能母线方案的实现方式作了深入探讨分析。总结优势及其代表的未来趋势。关键词:数据中心机......