首页 > 其他分享 >创建型设计模式-单例模式(为什么要双重加锁判断)

创建型设计模式-单例模式(为什么要双重加锁判断)

时间:2022-11-07 17:01:23浏览次数:33  
标签:加锁 SingleObject lock private instance 线程 单例 设计模式

代码

public class SingleObject
{
private static SingleObject instance;
private static object lockobj = new object();
private SingleObject() { }
public static SingleObject GetInstance()
{
if (instance==null)
{
lock (lockobj)
{
if (instance==null)
{
instance = new SingleObject();
}
}
}
return instance;
}
}
为什么这里要双重检查
1、lock外部的if作用:锁很贵,如果在这里加了的话,后面的线程就会首先加一把锁,导致线程阻塞在这里,会降低程序的运行效率,先进行if判断,如果这个字段已经被实例化就不加锁
2、lock内部if的作用:如果没有lock里面的这个if,在lock外部之后的if,加锁,假设三个线程 A,B,C 线程A 首先拿到锁,线程B和线程C被阻塞在lock外,如果线程A执行完之后,线程B或线程C会拿到锁并会重新创建对象,这就违背了单例模式的初衷

标签:加锁,SingleObject,lock,private,instance,线程,单例,设计模式
From: https://www.cnblogs.com/liuzongxian/p/16866547.html

相关文章

  • 设计模式学习(二):单例模式
    设计模式学习(二):单例模式作者:Grey原文地址:博客园:设计模式学习(二):单例模式CSDN:设计模式学习(二):单例模式单例模式单例模式是创建型模式。单例的定义:“一个类只允许创建......
  • 〖JAVA养成计划〗设计模式-单例设计模式以及衍生的多例设计模式
     单例设计模式packagecom.tongbu;/***单例设计模式分为两类:*①是俄汉式*②是懒汉式*以下程序是俄汉式:不管程序中有没有使用,都实例化对象。*@authorAdministrat......
  • Rust 编程中使用 leveldb 的简单例子
    前言最近准备用Rust写一个完善的blockchain的教学demo,在持久化时考虑到使用leveldb。通过查阅文档,发现Rust中已经提供了使用leveldb的接口。将官方的例子修改了下,能够运行通......
  • 23种设计模式之自定义Spring框架(五)
    7,自定义Spring框架7.1spring使用回顾自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟。数据访问层。定义UserDao接口及其子......
  • 23种设计模式之设计模式介绍(一)
    1,设计模式概述1.1软件设计模式的产生背景"设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境......
  • 设计模式
    设计模式(一)——简单工厂设计模式(二)——工厂方法设计模式(三)——抽象工厂设计模式(四)——建造者模式设计模式(五)——原型模式设计模式(六)——单例模式......
  • 浅谈PHP设计模式的桥接模式
    简介:桥接模式又叫桥梁模式,属于结构型模式。目的是将抽象与实现分离,使它们都可以独立的变化,解耦。继承有很多好处,但是会增加耦合,而桥接模式偏向组合和聚合的方式来共享。......
  • 23种设计模式-抽象工厂模式介绍加实战代码
    1、描述通俗一点来讲,抽象工厂模式就是在工厂方法模式的抽象工厂类中规范多个同类产品。工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法......
  • 设计模式---代理模式
    简述对客户端隐藏目标类,创建代理类拓展目标类,并且对于客户端隐藏功能拓展的细节,使得客户端可以像使用目标类一样使用代理类,面向代理(客户端只与代理类交互)。话不多说,看......
  • 三、创建型模式——单例模式
    一、意图二、问题三、解决方案四、模式结构五、伪代码六、适用场景七、实现方式八、优缺点九、与其他模式的关系......