设计模式-单例模式
时间:2021-07-31
本文章向大家介绍设计模式-单例模式,主要包括设计模式-单例模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
单例模式是什么?
保证一个类仅有一个实例,并提供一个访问它的全局访问点,当某些类创建对象内存开销消耗大时可以考虑使用该模式
应用场景:
1)资源的共享
2)数据库连接池的设计
单例模式分为饿汉式和懒汉式
1.饿汉式单例类 -自己被加载时就将自己实例化
1 /// <summary> 2 /// 饿汉模式 3 /// </summary> 4 public class SingletonTest 5 { 6 private static SingletonTest instance=new SingletonTest(); 7 8 private SingletonTest() { } 9 10 public static SingletonTest GetInstance() 11 { 12 return instance; 13 } 14 }
C# 静态初始化
1 public sealed class SingletonTest 2 { 3 private static readonly SingletonTest instance = new SingletonTest(); 4 5 private SingletonTest() { } 6 7 public static SingletonTest GetInstance() 8 { 9 return instance; 10 } 11 }
其中关键词sealed,阻止发生派生
2.懒汉式单例类-第一次引用时,才会将自己实例化
1 //懒汉模式 2 public class SingletonTest 3 { 4 private static SingletonTest instance; 5 6 private SingletonTest() { } 7 8 public static SingletonTest GetInstance() 9 { 10 if (instance == null) 11 { 12 instance = new SingletonTest(); 13 } 14 return instance; 15 } 16 }
产生问题:多线程下不安全,解决方式:双重锁定
1 public class SingletonTest 2 { 3 private static SingletonTest instance; 4 private static readonly object syncRoot = new object(); 5 private SingletonTest() { } 6 7 public static SingletonTest GetInstance() 8 { 9 10 if (instance == null) 11 { 12 lock (syncRoot) 13 { 14 if (instance == null) 15 { 16 instance = new SingletonTest(); 17 } 18 } 19 } 20 return instance; 21 } 22 }
饿汉和懒汉的区别:
饿汉式是类一加载就实例化的对象,要提前占用资源,懒汉会有多线程访问的问题。通常情况下,饿汉式已满足需求。
以上,仅用于学习和总结!
原文地址:https://www.cnblogs.com/ywkcode/p/15085223.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 01 . 分布式存储之FastDFS简介及部署
- LoRa节点开发——加入打印调试LoRaWAN
- 03 . Redis集群
- 02 . Redis哨兵
- 01 . RabbitMQ简介及部署
- 01 . Memcached原理,主从复制,代理,管理后台
- JsonPath验证类既Groovy重载操作符实践
- Selenium等待:sleep、隐式、显式和Fluent
- 敏捷中的端到端测试
- java编程思想第四版第十章习题
- java编程思想第四版第十一章总结
- java编程思想第四版第十一章习题
- java编程思想第四版第十三章字符串 习题
- java编程思想第四版第十三章字符串 总结
- LoRa节点开发——代码详解修改LoRaWAN相关参数