首页 > 其他分享 >单例模式(上)

单例模式(上)

时间:2024-03-21 17:13:23浏览次数:22  
标签:hungryStaticSington 模式 lazySington static 单例 new public

属于创建型模式

定义
确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。
一山不容二虎。
2.适用场景
ServletContext、 ServletConfig、ApplicationContextDBPool。
3.常见写法
饿汉式单例、懒汉式单例、注册式单例、ThreadLocal式。
饿汉式写法

public class HungryStaticSington {
private static final HungryStaticSington hungryStaticSington = new HungryStaticSington();
public HungryStaticSington getHungryStaticSington(){
return hungryStaticSington;
}
private HungryStaticSington(){}
}

/类的加载顺序
//先静态后动态
//先上后下
//先属性后方法
public class HungryStaticSington2 {
private static final HungryStaticSington2 hungryStaticSington;
static {
hungryStaticSington = new HungryStaticSington2();
}
public HungryStaticSington2 getHungryStaticSington(){
return hungryStaticSington;
}
private HungryStaticSington2(){}
}

以上两种方法类似本质相同。

优点:执行效率高、性能高、没有任何锁。
缺点:某些情况下,可能会造成内存浪费。

懒汉式单例:
在加载时再创建。

public class LazySington {
public static LazySington lazySington;
public static LazySington getInstance(){
if (lazySington == null){
lazySington = new LazySington();
return lazySington;
}
return lazySington;
}
private LazySington(){
}
}

此方法创建出来的单例会有一下几种情况
图一:

图二:

图一是 两个线程都进入了if(lazySington == nul) new了个对象并打印出来了
图二是 两种情况第一种第一个线程进入了if(lazySington == nul)中new了一个对象并赋值 与此同时第二个线程也进入了if(lazySington == nul)中new了对象并且把前一个线程的值改了,所以结果是两个一样的对象。
图二的第二种情况是按照正常的咱们设计这个单例的思想来进行的得到的相同的结果。

所以咋办呢?
咱们加锁改良啊。。就有了以下代码!!

运行多次,结果都一致。

符合了预期,但是缺点是什么呢就是性能不好,阻塞太严重!!
那就改!!

改成这样 然并卵。。运行结果如下:

再改!!

改成这样 ,成功了,这就是双重检查

标签:hungryStaticSington,模式,lazySington,static,单例,new,public
From: https://www.cnblogs.com/taozi666/p/18087787

相关文章

  • python 多进程并发:生产者+多消费者模式
    多任务场景中,为了节省大量子任务串行执行的耗时,通常采用并发方式充分利用cpu和内存来节省整体任务运行时间。对于多任务并发,常见的做法自然是抽象出功能函数,借助multiprocess类在主进程中并发出多个子进程,或者构建进程池,将任务构造好后丢入进程池中来实现并发。这种方式对于......
  • 如何理解23种设计模式?
    问题:如何理解23设计模式?我是一名python开发者,如何用简短的话语来介绍23设计模式?对我的开发有什么帮助吗?AI回答:设计模式是软件工程中的一套被广泛认可的解决特定问题的模板。它们是在多年的软件开发实践中总结出的有效方法。23种设计模式通常指的是《设计模式:可复用面向对象软......
  • 上门回收小程序开发,打造便利高效的回收模式,提高回收利润
    我国是人口大省,每年都能够产生出大量的废弃可回收物品,废品回收市场具有巨大的发展前景。近几年,随着互联网的发展,打造出了“互联网+回收”模式,居民只需要在手机上预约回收,就可以享受便捷、高效的回收服务。除此之外,回收小程序的出现,也让回收企业得到了快速发展。“互联网+回收......
  • vue2扫码枪串口模式的使用
    1.下载依赖包  serialportnpmiserialport2.创建文件code-gun.jsvar{SerialPort}=require("serialport");//串口列表SerialPort.list().then((ports)=>{ports.forEach((port)=>{console.log(port);});}).catch((err)=&......
  • 【设计模式】Java 设计模式之责任链模式(Chain of Responsibility)
    责任链模式(ChainofResponsibility)一、概述责任链模式是一种行为设计模式,它允许请求在对象链中传递。每个对象都有机会处理该请求,并且能将其传递给链中的下一个对象。这种模式为请求创建了一个处理对象的链,并沿着这条链传递该请求,直到有一个对象处理它为止。二、模式结......
  • 【设计模式】Java 设计模式之状态模式(State)
    深入理解状态模式(State)一、概述状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定的状态相关的行为放到一个类中,并且将请求委托给当前状态对象来执行。在状态模式中,我们创建表示各种状......
  • 编程设计模式-责任链设计模式
    责任链设计模式概述:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。责任链模式的主要角色如下:抽象处理者(Handler)角色:定义一个处理请求的接口,包含......
  • Vivado中的五种仿真模式比较
    Vivado中的五种仿真模式  在数字电路设计过程中,通常涵盖三个主要阶段:源代码编写、综合处理以及电路的实现,相应地,电路仿真的应用也与这些阶段紧密相关。根据不同设计阶段的需求,仿真可以被划分为RTL行为级仿真、综合后的门级功能仿真以及时序仿真。这样的仿真流程框架不仅......
  • 设计模式|工厂模式
    文章目录1.工厂模式的三种实现2.简单工厂模式和工厂方法模式示例3.抽象工厂模式示例4.工厂模式与多态的关系5.工程模式与策略模式的关系6.面试中可能遇到的问题6.1**工厂模式的概念是什么?**6.2**工厂模式解决了什么问题?**6.3**工厂模式的优点是什么?**6.4**工厂......
  • WPF MVVM模式ListBox下ContextMenu绑定Command的方法以及将所选的Item的数据传回去
    需求:ListBoxItem上右键,将数据传参。疑问:ContextMenu不继承DataContext,导致直接用RelativeSource找根的方式也绑定不到。解决方法:在ListBox.ContextMenu里写菜单,就可以直接绑定到ViewModel层的命令了,参数先用RelativeSource找到ContextMenu,再绑定PlacementTarget.SelectedItem。......