设计模式—singleton(单例模式)
单例模式
单例设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。
这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
应用实例
Windows是多进程多线程的,通过唯一的实例来操作一个文件,避免地出现多个进程或线程同时操作一个文件的现象。
一些设备管理器常常设计为单例模式(如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件)。
使用场景
要求生产唯一序列号。
WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。
创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。
单例实现
- 方式一

方式二
改进了方式一的缺点,但同时带来了线程安全问题
假设有两个线程,线程1到第9行判断完实例是否为空时(还没到new一个实例),线程2也到了判断实例是否为空的位置,
因为线程1还没创建实例,INSTANCE仍为空,线程2创建完一个实例后,线程1继续执行也创建了一个实例。

方式三
通过synchronized加锁,解决方式二的线程安全问题,但也带来了效率下降。
通过加锁,锁定了Mgr03.class对象,因此输出的hashcode是相同的。

方式四
双重校验锁,完美的单例模式写法之一。
如果只有外层判断,就会出现线程安全问题(如同方式二)。

方式五
- 静态内部类方式,解决了方式一的问题,达到了按需初始化的目的,是完美的单例模式之一。

方式六
- 通过枚举实现单例

public class Mgr05 {
private Mgr05() {};
//类Mgr05加载时,内部类不会加载
private static class Mgr05Holder{
private final static Mgr05 INSTANCE=new Mgr05();
}
//调用getInstance(),类Mgr05Holder加载
public static Mgr05 getInstance() {return Mgr05Holder.INSTANCE;};
public static void main(String[] args) {
for(int i=0;i<200;i++) {
new Thread(()->{
System.out.println(Mgr05.getInstance().hashCode());
}).start();
}
}
}
public class Mgr04 {
private static volatile Mgr04 INSTANCE;
private Mgr04() {};
public static synchronized Mgr04 getInstance() {
if(INSTANCE==null) {//双重校验锁
synchronized (Mgr04.class) {
if(INSTANCE==null) {
try {
Thread.sleep(10);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
INSTANCE=new Mgr04();
}
return INSTANCE;
}
public void c() {System.out.println("c");}
public static void main(String[] args) {
for(int i=0;i<200;i++) {
new Thread(()->{
System.out.println(Mgr04.getInstance().hashCode());
}).start();
}
}
}
设计模式—singleton(单例模式)的更多相关文章
- [C++设计模式] singleton 单例模式
这个设计模式主要目的是想在整个系统中仅仅能出现一个类的实例.这样做当然是有必定的.比方你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等. 你希望这个类在整个系统中仅仅能出现一个实 ...
- 一天一个设计模式——(Singleton)单例模式(线程安全性)
一.模式说明 有时候,我们希望在应用程序中,仅生成某个类的一个实例,这时候需要用到单例模式. 二.模式类图 三.模式中的角色 Singleton角色,该模式中仅有的一个角色,该角色有一个返回唯一实例的 ...
- C++设计模式-singleton单例模式_new
class nocopyable { protected: nocopyable(){}; virtual ~nocopyable(){}; nocopyable(const nocopyable ...
- C++设计模式-Singleton单例模式
template <typename T> class Singleton { public: template <typename... Args> static T* In ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- 每天一个设计模式-4 单例模式(Singleton)
每天一个设计模式-4 单例模式(Singleton) 1.实际生活的例子 有一天,你的自行车的某个螺丝钉松了,修车铺离你家比较远,而附近的五金店有卖扳手:因此,你决定去五金店买一个扳手,自己把螺丝钉固 ...
- 设计模式之单例模式——Singleton
设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...
- 设计模式(4) -- 单例模式(Singleton)
设计模式(4) -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...
- 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)
原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...
随机推荐
- React 17 All In One
React 17 All In One v17.0.1 https://reactjs.org/blog/2020/10/20/react-v17.html https://reactjs.org/b ...
- js console.log all in one
js console.log all in one this & arguments "use strict"; /** * * @author xgqfrms * @li ...
- UML online tools
UML online tools UML https://www.diagrams.net/assets/svg/home-dia1.svg refs https://www.diagrams.net ...
- HTML spaces types: &   &  
HTML spaces types: & & What is the difference between and https://stackoverflow.co ...
- 前端 & 技术团队 TL & 如何面试 & 如何带人
前端 & 技术团队 TL & 如何面试 & 如何带人 面试 带人 作为 TL,深度了解你的团队非常重要,要去了解每个人的想法是什么,他的诉求是什么,他目前的状态怎么样,以及对他 ...
- css grid layout in practice
css grid layout in practice https://caniuse.com/#search=grid subgrid https://caniuse.com/#search=cal ...
- flutter 插件调用callback函数
dart plugin class TestLib { static MethodChannel _channel = const MethodChannel('test_lib') ..setMet ...
- c++ string split function
#include <string> #include <vector> #include <regex> struct SplitListItem { std::s ...
- oracle 查锁
reference:https://www.cnblogs.com/XQiu/p/5212787.html--以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$ ...
- 【随便写写】印象笔记,WordPress,CSDN 等 写博客的不同
之前有的文章,写在了印象笔记里面,有的文章,写在了自己的WordPress博客里面,但是,感觉还是需要在主流平台分享一下文章的.就再次写写文章吧.(PS:公众号最重要的不是写作,而是排版) 说说几个这 ...