SingletonPattern(单例模式)-----Java/.Net
1.简介
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,
可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。
使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
2.实现方式
懒汉式—线程不安全:最基础的实现方式,线程上下文单例,不需要共享给所有线程,也不需要加synchronize或lock之类的锁,以提高性能。
懒汉式—线程安全:加上synchronize或lock之类保证线程安全的基础上的懒汉模式,相对性能很低,大部分时间并不需要同步
饿汉方式:指全局的单例实例在类装载时构建。
双检锁式:在懒汉式基础上利用synchronize或lock关键字和volatile关键字确保第一次创建时没有线程间竞争而产生多个实例,仅第一次创建时同步,性能相对较高
登记式:作为创建类的全局属性存在,创建类被装载时创建
枚举:java中枚举类本身也是一种单例模式
3.示例
/// <summary>
/// 单例类:一个构造对象很耗时耗资源类型
///
/// 懒汉式单例模式
/// </summary>
public class Singleton//<T> //泛型类型里面的静态字段,是随着不同的类型参数唯一的 泛型单例不可能的
{
/// <summary>
/// 构造函数耗时耗资源
/// </summary>
private Singleton()//1 private 避免外部创建
{
long lResult = 0;
for (int i = 0; i < 10000000; i++)
{
lResult += i;
}
Thread.Sleep(1000);
Console.WriteLine("{0}被构造一次", this.GetType().Name);
} /// <summary>
/// 3 全局唯一静态 重用这个变量
/// </summary>
private static volatile Singleton _Singleton = null;//volatile 促进线程安全 让线程按顺序操作
private static object Singleton_Lock = new object(); /// <summary>
/// 2 公开的静态方法提供对象实例
/// </summary>
/// <returns></returns>
public static Singleton CreateInstance()
{
//假如现在 5个线程过来初始化 第1个线程进去把_Singleton实例化;5分钟之后,又有100个线程同时来创建,
//排队--判断不为空--然后返回 其实不该排队了,应该直接判断
if (_Singleton == null)
{
lock (Singleton_Lock)//保证只有一个线程进去判断+初始化
{
if (_Singleton == null)//这个也不能去掉,第一次5个线程进来的时候 如果没有这个判断,还是重复创建的
{
_Singleton = new Singleton();
}
}
}
return _Singleton;
}//懒汉式 调用了方法才去构造 //既然是单例,大家用的是同一个对象,用的是同一个方法,那还会并发吗 还有线程安全问题吗?
//当然有,,单例不能解决线程冲突的 解决:加锁 public int iTotal = 0;
public void Show()
{
//lock
this.iTotal++;
} public static void Test()
{ } }
/// <summary>
/// 单例类:一个构造对象很耗时耗资源类型
///
/// 饿汉式
/// </summary>
public class SingletonSecond
{
/// <summary>
/// 1 构造函数耗时耗资源
/// </summary>
private SingletonSecond()
{
long lResult = 0;
for (int i = 0; i < 10000000; i++)
{
lResult += i;
}
Thread.Sleep(1000);
Console.WriteLine("{0}被构造一次", this.GetType().Name);
} /// <summary>
/// 静态构造函数:由CLR保证,程序第一次使用这个类型前被调用,且只调用一次
///
/// 写日志功能的文件夹检测
/// XML配置文件
/// </summary>
static SingletonSecond()
{
_SingletonSecond = new SingletonSecond();
Console.WriteLine("SingletonSecond 被启动");
} private static SingletonSecond _SingletonSecond = null; public static SingletonSecond CreateInstance()
{
return _SingletonSecond;
}//饿汉式 只要使用类就会被构造 public static void Test()
{ } public int iTotal = 0;
public void Show()
{
this.iTotal++;
} }
/// <summary>
/// 单例类:一个构造对象很耗时耗资源类型
/// 饿汉式
/// </summary>
public class SingletonThird
{
/// <summary>
/// 构造函数耗时耗资源
/// </summary>
private SingletonThird()
{
long lResult = 0;
for (int i = 0; i < 10000000; i++)
{
lResult += i;
}
Thread.Sleep(1000);
Console.WriteLine("{0}被构造一次", this.GetType().Name);
} /// <summary>
/// 静态字段:在第一次使用这个类之前,由CLR保证,初始化且只初始化一次
/// 这个比今天构造函数还早
/// </summary>
private static SingletonThird _SingletonThird = new SingletonThird();//打印个日志
public static SingletonThird CreateInstance()
{
return _SingletonThird;
}//饿汉式 只要使用类就会被构造 public void Show()
{
Console.WriteLine("这里是{0}.Show", this.GetType().Name);
} }
SingletonPattern(单例模式)-----Java/.Net的更多相关文章
- 单例模式——Java EE设计模式解析与应用
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
- 单例模式——java设计模式
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
- 设计模式 -- 单例模式(Java&&PHP)
所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 能够 ...
- 枚举类型的单例模式(java)
Inspired by Effective Java. Singleton模式是在编程实践中应用最广泛的几种设计模式之一.以前知道的,实现单例的方法有两种(下面的A.B).刚刚在读<Effect ...
- 单例模式--java代码实现
单例模式 单例模式,顾名思义,在程序运行中,实例化某个类时只实例化一次,即只有一个实例对象存在.例如在古代,一个国家只能有一个皇帝,在现代则是主席或总统等. 在Java语言中单例模式有以下实现方式 1 ...
- 软件设计模式之单例模式(JAVA)
什么是单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系 ...
- 单例模式/ java实现附代码 /
注: 场景和例子出自github的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/singleton 意图: ...
- 深入单例模式 - Java实现
单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好.用对单例模式,还真得费一番脑筋.本文对Java中常见的单例模式写法做了一个总结,如有错漏之处,恳请读者指正. 饿汉法 顾名思义,饿汉法 ...
- 设计模式之第0章-单例模式(Java实现)
设计模式之第0章-单例模式(Java实现) 当当当当~首先有请最简单的单例模式登场,先来个自我介绍吧 单例模式之自我介绍 我,单例模式(Singleton Pattern)是一个比较简单的模式,我的定 ...
随机推荐
- hihocoder1994 树与落叶 DFS+前缀和+二分
DFS找到节点删除的时间,删除的时间其实就是子树的最长链,然后给每个点打一个时间戳,然后求每个时间点对应删除的节点的个数,对于1-max_time时间戳求一个前缀和,然后二分找到和m距离最近的那一天 ...
- tp3.2.3 解决http://lx.com/后必须加index.php才能访问的问题,配置文件中忘了加index index.php index.html 等默认文件
server { listen 80; server_name lx.com; root "D:\phpstudy\PHPTutorial\WWW\liuxue"; locatio ...
- Python type hints 之 Optional,Union
1,前言 type hint 在pep484加入,我个人觉得这种类似于类型约束的(机制)有点违背了python简单.简洁的初衷,在慢慢向c# java 这种强类型语言看齐的节奏. 不过好在不强制使用, ...
- Linux环境下第一次提交项目
Linux环境下第一次提交项目: vi 日记 新增一个文件名为“日记”的文件 git status 工作区的状态 git add 日记 建立跟踪 git commit 提交变更 ----------- ...
- 移动端Chrome Inspect调试 (Android通过Chrome Inspect调试WebView的H5)(ios手机safari,chrome调试 windows)(如果inspect的时候,是空白)
ios +chrome调试 引用https://segmentfault.com/a/1190000015428430 iTunes ios-webkit-debug-proxy-1.8-win64- ...
- 原生js设置audio在谷歌浏览器自动播放
https://www.cnblogs.com/sandraryan/ 谷歌浏览器更新后禁止了autoplay功能,但是有时候可能会需要自动播放. 研究了一段代码. <!DOCTYPE html ...
- 2003年NOIP普及组复赛题解
题目涉及算法: 乒乓球:简单字符串模拟: 数字游戏:区间DP: 栈:卡特兰数 麦森数:高精度.快速幂.数学. 乒乓球 题目链接:https://www.luogu.org/problem/P1042 ...
- Python--day47--mysql分页性能相关方案
提高分页性能: 分页的时候,如果是正常的数据全局扫描,分页越大的时候花费的时间越长. 这时候要提高效率的话就不能全局扫描,如下面的例子,扫描索引且从最大或最小页开始扫描.
- mysql 第一课 win7艰难的配置与删除注册表重新安装
mysql 这个安装一定要慎重!慎重!慎重! 重要的事情说三遍.. 不会的一定要按步骤来~出错了真的很难受. 详细教程 --> https://jingyan.baidu.com/album/ ...
- 利用SpEL 表达式实现简单的动态分表查询
这里的动态分表查询并不是动态构造sql语句,而是利用SpEL操作同一结构的不同张表. 也可以参考Spring Data Jpa中的章节http://docs.spring.io/spring-data ...