博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——单例模式
阅读量:3912 次
发布时间:2019-05-23

本文共 2174 字,大约阅读时间需要 7 分钟。

不考虑线程安全的单例模式

第一步:定义一个private的构造函数,保证这个类不能让其他类new出来。

第二部:定义一个getInstance()里面就是单利模式的核心代码

if(objectDemo==null){	objectDemo = new ObjectDemo();}

这样一来因为它是静态的属性且其他类不能new,所以每次new 出来的对象是一样的。

以下是一个Demo,来自设计模式之禅:

package com.hyh.pattern;public class Emperor {    private static Emperor emperor = null; //定义一个皇帝放在那里,然后给这个皇帝名字    private Emperor(){        //世俗和道德约束你,目的就是不让你产生第二个皇帝    }    public static Emperor getInstance(){        if(emperor == null){ //如果皇帝还没有定义,那就定一个            emperor = new Emperor();        }        return emperor;    }    //皇帝叫什么名字呀    public static void emperorInfo(){        System.out.println("我就是皇帝:"+emperor);    }}
package com.hyh.pattern;/** * @author cbf4Life cbf4life@126.com * I'm glad to share my knowledge with you all. * 大臣是天天要面见皇帝,今天见的皇帝和昨天的,前天不一样那就出问题了! */@SuppressWarnings("all")public class Minister {    /**     * @param args     */    public static void main(String[] args) {        //第一天        Emperor emperor1=Emperor.getInstance();        emperor1.emperorInfo(); //第一天见的皇帝叫什么名字呢?        //第二天        Emperor emperor2=Emperor.getInstance();        Emperor.emperorInfo();        //第三天        Emperor emperor3=Emperor.getInstance();        emperor2.emperorInfo();        //三天见的皇帝都是同一个人,荣幸吧!    }}

结果:

在这里插入图片描述

考虑并发的单例模式

我们再来熟悉下,不考虑线程安全的单例模式。

public class SingletonPattern { private static SingletonPattern singletonPattern= null; //限制住不能直接产生一个实例private SingletonPattern(){   }  public SingletonPattern getInstance(){  if(this.singletonPattern == null){ //核心 this.singletonPattern = new SingletonPattern(); //核心 } //核心 return this.singletonPattern;  }  }

我们来看核心的那一部分,假如现在有两个线程 A 和线程 B,线程 A 执行到 this.singletonPattern = new SingletonPattern(),正在申请内存分配,可能需要 0.001 微秒,就在这 0.001 微秒之内,线程 B 执行到 if(this.singletonPattern == null),你说这个时候这个判断条件是 true 还是 false?是 true,那然后呢?线程 B 也往下走,于是乎就在内存中就有两个 SingletonPattern 的实例了,看看是不是出问题了?

这时后其中一种方案是:

public class SingletonPattern { private static final SingletonPattern singletonPattern= newSingletonPattern();  //限制住不能直接产生一个实例private SingletonPattern(){  }  public synchronized static SingletonPattern getInstance(){  return singletonPattern;  } }

直接 new 一个对象传递给类的成员变量 singletonpattern,你要的时候 getInstance()直接返回给

你,解决问题!

转载地址:http://kyfrn.baihongyu.com/

你可能感兴趣的文章
对精致码农大佬的 [理解 volatile 关键字] 文章结论的思考和寻找真相
查看>>
.NET for Apache Spark 1.0 版本发布
查看>>
吐槽一下Abp的用户和租户管理模块
查看>>
. NET5正式版本月来袭,为什么说gRPC大有可为?
查看>>
初识ABP vNext(12):模块的独立运行与托管
查看>>
新版本 Swashbuckle swagger 组件中的 "坑"
查看>>
.NET架构小技巧(5)——反射,架构人员法宝III
查看>>
C# 中的 in 参数和性能分析
查看>>
.NET架构小技巧(6)——什么是好的架构
查看>>
C#中形态各异的class
查看>>
.Net 5性能改进
查看>>
InfluxDB 2.0 之Flux语法篇
查看>>
TensorFlow 2学习和工业CV领域应用 心得分享
查看>>
程序员过关斩将--真的可以用版本号的方式来保证MQ消费消息的幂等性?
查看>>
Java面试必问JVM调优,那.NET5呢?
查看>>
把 Console 部署成 Windows 服务,四种方式总有一款适合你!
查看>>
缓存一致性和跨服务器查询的数据异构解决方案canal
查看>>
BeetleX之Websocket服务使用
查看>>
【源码】常用的人脸识别数据库以及上篇性别识别源码
查看>>
深入探究ASP.NET Core Startup的初始化
查看>>