首页 > 编程语言 >java设计模式

java设计模式

时间:2024-03-16 22:58:33浏览次数:21  
标签:java idCard IdCard2 实例 线程 单例 设计模式 public

单例设计模式 java实现

(一)单例设计模式

​ 单例设计模式(Singleton Pattern) 确保某个类中只有一个实例,而且这个类是不能被实例化的,也就是不能用new 关键字来创建对象,该类提供了公共静态的方法,用于返回该类对象,不需要自行实例化。而单例模式有分为饿汉式,以及懒汉式。

特点

  1. 一个类有且仅有一个实例,有一个私有静态变量指向自己
  2. 构造器需私有化,且无参数
  3. 必须提供公有方法用于获取对象

饿汉式代码体现

​ 饿汉式在类加载时候就完成了对象的实例化

​ 优点:写法简便,因为是类加载时完成的实例化,不存在线程安全问题。

​ 缺点:正因为是在类加载时完成的初始化,如果从来没有使用这个对象,在加载该类时候也会被实例化,会造成内存资源的浪费

//饿汉式单例
public class IdCard {
    //在类加载的时候同时初始化对象
    private static final IdCard idCard = new IdCard();

    //构造器私有化
    private IdCard() {
        // 构造器中打印被实例化语句 时机:类加载时 有且仅有一次
        System.out.println("idCard, 我被实例化了");
    }

    // 静态获取实例的方法
    public static IdCard getIdCard() {
        return idCard;
    }
}

懒汉式代码体现

​ 懒汉式,和它的名字一样,它很懒,如果你不用它,它就不会实例化,起到了懒加载(Lazy Loading)的效果。但是在多线程的情况下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。

​ 优点:不会造成内存资源的浪费。

​ 缺点:在多线程的情况下有线程安全问题

//懒汉式单例
public class IdCard2 {


    private static IdCard2 idCard;

    //构造器私有化
    private IdCard2() {
        // 构造器中打印被实例化语句测试 时机:在第一次获取实例时 有且仅有一次
        System.out.println("idCard2  被实例化了");
    }

    // 静态获取实例的方法
    public static IdCard2 getIdCard() {
        //判断如果idCard为空,则创建一个实例
        if (idCard == null) {
            idCard = new IdCard2();
            return idCard;
        }
        // 已经存在实例,直接返回
        return idCard;
    }
}

线程安全问题解决

​ 刚刚提到懒汉式存在线程安全问题,所以我们解决思路是,既然会有多个线程同时进入到if判断里创建对象,那么我们只需要在获取实例的方法上 加锁 让方法变成同步的 即可。 加入 synchronized 关键字

//懒汉式单例
public class IdCard2 {

    private static IdCard2 idCard;

    //构造器私有化
    private IdCard2() {
        // 构造器中打印被实例化语句测试 时机:在第一次获取实例时 有且仅有一次
        System.out.println("idCard2  被实例化了");
    }

    // 静态获取实例的方法  使用 synchronized 锁机制保证线程安全
    public synchronized static IdCard2 getIdCard() {
        //判断如果idCard为空,则创建一个实例 加锁保证线程安全

        if (idCard == null) {
            idCard = new IdCard2();
            return idCard;
        }
        // 已经存在实例,直接返回
        return idCard;
    }
}

标签:java,idCard,IdCard2,实例,线程,单例,设计模式,public
From: https://blog.csdn.net/m0_75269526/article/details/136751965

相关文章

  • 智慧教室预约(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图 项目介绍随着教育数字化转型的深入,智慧教室成为提升教学质量和效率的重要环境。智慧教室预约系统能够有效管理教学资源,实现教室使用的优化配置,确保设备高效利用。它......
  • Java映射(含源码)
    在Java中,“映射”(Map)是一个存储键值对的数据结构,允许你通过键(Key)快速访问值(Value)。映射中的每个键都是唯一的,这意味着每个键都对应一个特定的值。Java提供了几种实现映射接口的类,其中最常用的是HashMap、TreeMap和LinkedHashMap。下面是这些实现的简要介绍和它们之间的区别,......
  • Java中的synchronized
    概述Java的锁可以分为乐观锁和悲观锁两类。而synchronized是悲观锁的代表。本文想要说明一下两个问题:synchronized锁的是哪个对象publicvoidmethod(){ synchronized(this){ ... }}publicsynchronizedvoidmethod(){ ...}    上述两种方式,synchronize......
  • JavaScript学习 第三天
    一、数组(一)数组基本知识声明按顺序保存数据的数据类型<body><script>letarr=[1,2,'猪儿',true]</script></body>声明数组函数<body><script>letarr=newArray(1,2,'猪儿',true)</script></body>......
  • JavaScript学习 第一天
    一、什么是JavaScript(一)介绍是一种运行在浏览器的编程语言,进行人机交互(二)可以做什么可以做网页特效,表单验证,进行数据交互,还有服务端编程node.js(三)组成由ECMAScript和WebAPIs组成其中WebAPIs由DOM和BOM组成ECMAScript:js基础语法知识WebAPIs:DOM:操作文......
  • 使用c#实现23种常见的设计模式
     设计模式通常分为三个主要类别:创建型模式结构型模式行为型模式。这些模式是用于解决常见的对象导向设计问题的最佳实践。以下是23种常见的设计模式并且提供c#代码案例:创建型模式:1.单例模式(Singleton)publicsealedclassSingleton{//创建一个只读的静......
  • 简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
    前言最近简单学了下Rust,以我这种菜鸟水平,没感受到什么安全、性能什么方面的优势,只觉得概念太多,编译各种报错。暂时也写不出来什么玩法,索性对比下各种学过的语言的性能。部分语言很早之前学过,很久不用就忘了,所以是用GPT写的。但运行逻辑很简单,所以应该没什么影响。具体的代码可以......
  • 分享一下自己总结的7万多字java面试笔记和一些面试视频,简历啥的,已大厂上岸
    分享一下自己总结的7万多字java面试笔记和一些面试视频,简历啥的,已大厂上岸总结的面试资料:面试资料SSMSSM搭建的版本有很多,例如有一个版本可以这么搭建,两个核心配置文件web.xml,applicationContext.xml。1.前端控制器DispatcherServlet2.过滤器CharacterEncodingFilter`......
  • java基础 韩顺平老师的 面向对象(中级) 自己记的部分笔记
       272,包基本介绍包的三大作用1,区分相同的类  2,当类很多时,可以很好的管理类  3,控制访问范围包基本用法packagecom.hspedu;说明:1,package关键字,表示打包  2,com.hspedu,表示包名包的本质分析(原理)包的本质实际上就是创建不同的文件夹/目录来保存类......
  • Java常用修饰符及示例
    Java修饰符是用来改变类、方法、变量、接口等元素的行为和可见性的关键字。Java修饰符主要分为两大类:访问修饰符和非访问修饰符。访问修饰符(AccessModifiers):public:提供最大的访问权限,任何类(无论是同一包内的还是不同包的)都可以访问到public修饰的类、方法和变量。示例......