手写一个单例模式,Demo,检测

news2024/9/19 10:55:44

手写一个单例模式,Demo,检测

  • 需求分析
  • 单例介绍
  • 一般情况
    • Demo
    • Result
  • 单例模式(饿汉式—静态常量方式(线程安全))
    • Demo
    • Result
  • 懒汉式(线程不安全)
    • Demo
    • Result
  • 懒汉式(加入锁机制)
    • Demo
    • Result
  • 双检索单例
    • Demo
    • Result

需求分析

面试过后,感觉很久没有好好去回顾下这些设计模式了
今天出一个设计模式专栏来好好回顾下
正好最近也有充足的时间对整个知识体系和框架进行梳理和回顾
今天是设计模式专栏第二节

单例介绍

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。

应用实例:

1、一个班级只有一个班主任。
2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。
优点:

1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
2、避免对资源的多重占用(比如写文件操作)。
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

使用场景:

1、要求生产唯一序列号。
2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

一般情况

Demo

public class A11172022 {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
//            new Thread(()->{
//                System.out.println(Thread.currentThread().getName()  + SingleSample.getSingleSample().hashCode());
//                System.out.println(Thread.currentThread().getName() + SingleSample.getSingleSample().hashCode());
//            }, "SingleSampleCurThread" + i + " ").start();

            new Thread(()->{
                SingleSample01 singleSample01 = new SingleSample01();
                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
            }, "SingleSample01 " + i).start();
        }
    }
}

class SingleSample01{
    private SingleSample01 singleSample;

    public SingleSample01 getSingleSample(){
        if (singleSample == null){
            singleSample = new SingleSample01();
        }
        return singleSample;

    }


}

Result

在这里插入图片描述

单例模式(饿汉式—静态常量方式(线程安全))

Demo

public class A11172022 {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()  + SingleSample.getSingleSample().hashCode());
                System.out.println(Thread.currentThread().getName() + SingleSample.getSingleSample().hashCode());
            }, "SingleSampleCurThread" + i + " ").start();

//            new Thread(()->{
//                SingleSample01 singleSample01 = new SingleSample01();
//                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
//                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
//            }, "SingleSample01 " + i).start();
        }
    }
}

class SingleSample{

    private static SingleSample singleSample = new SingleSample();

    public static SingleSample getSingleSample(){
        return singleSample;
    }
   /*
    private static SingleSample singleSample;

    public static SingleSample getSingleSample(){
        if (SingleSample.singleSample == null){
            singleSample = new SingleSample();
        }
        return SingleSample.singleSample;

    }*/


}



Result

在这里插入图片描述

懒汉式(线程不安全)

Demo

public class A11172022 {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
//            new Thread(()->{
//                System.out.println(Thread.currentThread().getName()  + SingleSample.getSingleSample().hashCode());
//                System.out.println(Thread.currentThread().getName() + SingleSample.getSingleSample().hashCode());
//            }, "SingleSampleCurThread" + i + " ").start();


            new Thread(()->{
                SingleSample01 singleSample01 = new SingleSample01();
                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
            }, "SingleSample01 " + i).start();
//
        }
    }
}

class SingleSample01{
    private static SingleSample01 singleSample;

    public static SingleSample01 getSingleSample(){
        if (singleSample == null){
            singleSample = new SingleSample01();
        }
        return singleSample;

    }


}

Result

在这里插入图片描述

懒汉式(加入锁机制)

Demo

public class A11172022 {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
//            new Thread(()->{
//                System.out.println(Thread.currentThread().getName()  + SingleSample.getSingleSample().hashCode());
//                System.out.println(Thread.currentThread().getName() + SingleSample.getSingleSample().hashCode());
//            }, "SingleSampleCurThread" + i + " ").start();


            new Thread(()->{
                SingleSample01 singleSample01 = new SingleSample01();
                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
            }, "SingleSample01" + i + " ").start();
//
        }
    }
}

class SingleSample01{
    private static SingleSample01 singleSample;

    public static synchronized SingleSample01 getSingleSample(){
        if (singleSample == null){
            singleSample = new SingleSample01();
        }
        return singleSample;

    }


}

Result

在这里插入图片描述

双检索单例

Demo

class SingleSample{

    private static volatile SingleSample singleSample;

    public static SingleSample getInstance(){
        if(singleSample==null){
            synchronized (SingleSample.class){
                if (singleSample==null){
                    singleSample = new SingleSample();
                }
            }
        }

        return singleSample;
    }

}

public class A11172022 {

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()  + SingleSample.getInstance().hashCode());
                System.out.println(Thread.currentThread().getName() + SingleSample.getInstance().hashCode());
            }, "SingleSampleCurThread" + i + " ").start();


//            new Thread(()->{
//                SingleSample01 singleSample01 = new SingleSample01();
//                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
//                System.out.println(Thread.currentThread().getName() + singleSample01.getSingleSample().hashCode());
//            }, "SingleSample01" + i + " ").start();
//
        }
    }
}

Result

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8s安装乐维5.0应用部署文档

乐维产品包具体打包为4个镜像包&#xff0c;分别为&#xff1a;mysql5.7.36.tar、zabbix_server.tar、itops_v1_4_x86_64.tar、bpm0.1.tar&#xff0c;对应的配置文件分别为&#xff1a;data.tar、conf.tar、nginx-v1.3.tar.gz、bpm12.zip。 K8s yaml文件具体打包为strogeclas…

[附源码]Python计算机毕业设计django学生学习评价与分析系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数字逻辑·时序线路分析【触发器和时序线路分析方法】

课程目标 掌握触发器的特征表达式掌握触发器的激励表掌握触发器的状态表掌握时序线路分析方法 课程内容 D触发器 逻辑符号可以不画RD&#xff0c;SD&#xff0c;CP 上方&#xff1a;特征表达式&#xff1b;左下&#xff1a;激励表&#xff1b;右下&#xff1a;状态图 状态图…

list容器(20221117)

一、list容器 1、基本概念 功能&#xff1a;将数据进行链式存储 链表是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过指针实现的 链表由一系列的节点组成&#xff1b; 节点的组成&#xff1a;一个是存储数据元素的数据域&#xff0c;另一个是存…

初探softmax

什么是softmax Softmax,又称作归一化指数函数。主要用于分类任务&#xff0c;降多分类的结果以概率的形式展现 下图展示softmax计算方法 softmax本质上是归一化网络&#xff0c;目的是将多个标量映射为一个概率分布,其输出的每一个值范围在&#xff08;0&#xff0c;1&#x…

使用 Next.js、 Prisma 和 PostgreSQL 全栈开发视频网站

通过上一篇文章&#xff0c;我们对乔巴乐高海报平台的整体架构有了初步的了解。今天我们深入到编辑器部分&#xff0c;对其中的难点和实现细节进行分析。 这是目前生产的编辑器页面&#xff1a; 不难看出和市面上大部分低代码平台一样&#xff0c;由三部分组成&#xff1a;左侧…

10名IB学生获得满分,新加坡环球印度国际学校成为一匹黑马

近年来留学人数大幅度上升&#xff0c;其中新加坡因多元的文化环境、健全的教育制度&#xff0c;深受学生、家长青睐喜爱&#xff0c;新加坡国际学校也因此成为了香饽饽。 在每年的IB成绩放榜中&#xff0c;新加坡国际学校IB表现都非常亮眼。 除了我们熟悉的华中、德威、UWC等一…

宏记录器 Macro Recorder 2.0 注册版

记录鼠标和键盘操作以无限重播...... 不再执行相同的任务两次&#xff01; Macro Recorder 像录音机一样捕捉鼠标事件和击键&#xff0c;让您在计算机上自动执行繁琐的程序。 按记录。执行操作。 Macro Recorder 记录您的鼠标移动、鼠标点击和键盘输入。就像电脑的录音机一样。…

RabbitMQ第四个实操小案例——DirectExchange

文章目录RabbitMQ第四个实操小案例——DirectExchangeRabbitMQ第四个实操小案例——DirectExchange DirectExchange&#xff1a;这种交换机的模式跟前面的Fouout&#xff08;广播&#xff09;不太一样&#xff0c;DirectExchange 会将接收到的消息根据规则路由到指定的Queue&a…

(免费分享)基于springboot,vue毕业设计管理系统

源码获取&#xff1a;关注文末gongzhonghao&#xff0c;输入011领取下载链接 开发工具IDEA ,数据库mysql5.7 &#xff0c;前后端分离 系统分学生、教师、管理员三个角色 1.学生截图 2.教师截图&#xff1a; 3.管理员截图&#xff1a; package com.cx.controller;import cn.…

C++实现哈希表。

目录 一. unordered_map unordered_set 和 map set的区别 二. 哈希 1. 哈希&#xff0c;哈希表&#xff0c;哈希函数。 2. 哈希冲突。 3. 哈希函数补充 3. 解决哈希冲突的两大方法&#xff1a;闭散列&#xff0c;开散列 闭散列 闭散列实现代码&#xff1a; 闭散列的删除…

MDF和DHF、DMR、DHR三者差异?注册与备案文件?

医疗器械研发、工艺、注册、质量人员时常会接触到DHF, DMR, DHR。这几个单词缩写不光是拼写非常相似&#xff0c;其含义也有许多相同之处&#xff0c;所以十分容易混淆。本文就来聊一聊这三者的区别和联系。 ISO13485:2016 证明符合法规要求 MDF-Medical Device File&#xf…

计算机毕业设计——税务缴纳信息管理

一.项目介绍 本项目包含管理员、普通用户两种角色 普通用户 可以浏览 首页、新闻信息、法律法规、税务政策、通知公告、留言板、个人中心、后台管理、在线咨询 普通用户进入后台管理可以修改密码、个人信息以及税务申报、填写留言 管理员用户登录可以操作 个人中心、用…

服务器证书是网络信息安全的基础

我们都清楚&#xff0c;互联网安全存在两大基本隐患&#xff0c;一是因为身份认证机制的缺位&#xff0c;使网络成为各种“钓鱼”诈骗行为的温床&#xff0c;导致互联网空间缺乏信任。互联网每时每刻都在传输数以亿万的信息&#xff0c;这些信息如果未经加密&#xff0c;就有可…

自动化测试如何区分用例集合及编写规范

目录 前言 业务量和复杂度增长现状是什么&#xff1f; 如何区分自动化测试的用例集合&#xff1f; 区分用例集合的过程要注意什么&#xff1f; 自动化测试用例选择 自动化测试用例编写 用例编写规范 结语 前言 前面的文章介绍过如何设计自动化测试case&#xff0c;有同…

一、翻越前端的三座大山——继承/原型链

文章目录原型专题前言什么是原型&#xff1f;实例和原型的关系什么是原型链&#xff1f;Object 和 Function 的继承关系原型运用例子&#xff1a;手写instanceof手写call&#xff0c;apply手写new六大继承方式原型链继承构造函数继承原型链 构造函数优化&#xff08;原型链 构…

mysql 中的锁

文章目录锁的分类锁粒度InnoDB 中的表锁InnoDB 中的行锁锁的分类 共享锁&#xff08;Shared Locks&#xff09; // 行共享锁 // 获取到当前记录的S锁&#xff08;共享锁&#xff09;&#xff0c;兼容其他事务的S锁&#xff0c;不兼容X锁&#xff08;排他锁&#xff09; select…

服务注册中心

什么是注册中心&#xff1f; 注册中心主要有三种角色&#xff1a; ● 服务提供者&#xff08;Provider&#xff09;&#xff1a;在启动时&#xff0c;向 Registry 注册自身服务&#xff0c;并向 Registry 定期发送心跳汇报存活状态。 ● 服务消费者&#xff08;Consumer&#…

HCSC: Hierarchical Contrastive Selective Coding

原型对比学习&#xff1a;图像表征与聚类中心之间的交互&#xff0c;可以简单总结为在表征空间中最大化图像特征与其所属的聚类中心的相似度。分层语义结构 自然存在于图像数据集中&#xff0c;其中几个语义相关的图像簇可以进一步集成到一个更大的簇中&#xff0c;具有更粗粒度…

Tomcat多实例部署

文章目录一、Tomcat多实例的操作步骤1、关闭防火墙&#xff0c;将安装 Tomcat 所需软件包传到/opt目录下2、安装JDK3、安装 tomcat4、配置 tomcat 环境变量5、修改 tomcat2 中的 server.xml 文件&#xff0c;要求各 tomcat 实例配置不能有重复的端口号6、修改各 tomcat 实例中的…