Java Singleton Design Pattern (单例模式 SE7 Gold)
singleton design pattern offer 2 things:
one and only one instance of the class, and a global single point of access to that object
下面的例子用一个private的构造函数阻止了instance的生成,所以不能用new生成一个新的instance,只能用getInstance()来得到instance,可以看到生成instance后把它赋给static成员myInstance,所以可以always return the same object:
public class Logger{//declare the constructor private to prevent clients from instantiating..private Logger(){}private static Logger myInstance;//the static method to get instance..public static Logger getInstance() {if (myInstance == null) {myInstance = new Logger();}return myInstance;}
}
但是上面的实现有什么不妥之处?上面的实现对于单线程是有效的,但是对于多线程,仍然可以得到很多的object,违背了singleton的理念
对于多线程的singleton,看下面的例子
getInstance()方法中用到了synchronized修饰,每次只能一个线程访问,确保每次只能生成一个instance
public class Logger{//declare the constructor private to prevent clients from instantiating..private Logger(){}private static Logger myInstance;//the static method to get instance..public static synchronized Logger getInstance() { //added..if (myInstance == null) {myInstance = new Logger();}return myInstance;}
}
上面的实现有什么问题?poor performance。
其实本意是在第一次生成instance的时候用synchronized进行限制,但是整个method都变成了synchronized,导致多线程每次调用getInstance(), 这个地方会变成performance bottleneck
那么考虑把synchronized移到第一次生成instance的地方,是否就完美解决上述问题
public class Logger{//declare the constructor private to prevent clients from instantiating..private Logger(){}private static Logger myInstance;//the static method to get instance..public static Logger getInstance() {if (myInstance == null) {synchronized (Logger.class) { //added..myInstance = new Logger();}}return myInstance;}
}
仍然会有问题,如果两个线程同时第一次生成instance,同时判断到了myInstance== null
synchronized无法保护上面的判断,所以仍然会生成两个object
因此解决方法是实行双重检查myInstance== null, 但是这种方法不被推荐,因为erroneous out of order writes allowed by java memory model problem的关系, 虽然memory model已经修复了这个问题
public class Logger{//declare the constructor private to prevent clients from instantiating..private Logger(){}private static Logger myInstance;//the static method to get instance..public static Logger getInstance() {if (myInstance == null) {synchronized (Logger.class) {if (myInstance == null) { //added..myInstance = new Logger();}}}return myInstance;}
}
下面用另一种内部类的方法实现singleton
因为内部类are not loaded until they are referenced
仍然用private限制了构造函数
public class Logger{//declare the constructor private to prevent clients from instantiating..private Logger(){}private static Logger myInstance;public static class LoggerHolder {public static Logger logger = new Logger();}public static Logger getInstance() {return LoggerHolder.logger;}
}
Java Singleton Design Pattern (单例模式 SE7 Gold)相关推荐
- JAVA设计模式Design Pattern→单例模式Singleton Pattern、工厂模式Factory Pattern、代理模式Proxy Pattern
私有化构造函数的类可以提供相应的 "接口"(一般就是静态方法)来返回自己的唯一实例供外部调用,像这样的确保只生成一个实例的模式被称作单例模式. 工厂模式,一个模型,用来大规模的生产 ...
- python singleton design pattern super() 多继承
python singleton design pattern decorate baseclass metaclass import module super() 一.A decorator de ...
- Java设计模式 Design Pattern:包装模式 Decorator Pattern
意图 Attach additional responsibilities to an object dynamically. 为一个对象动态的添加职责. Decorators provide a f ...
- Design Pattern - Singleton(C#)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Defi ...
- 源于Design Pattern Explanation with C++ Implementation的 设计模式 C++
1.创建型模式 (Creational Pattern) 1.1 工厂模式(Factory Pattern ) 1.2 抽象工厂模式(Abstract Factory Pattern ) 1.3 ...
- Java Singleton类中的线程安全
Singleton is one of the most widely used creational design pattern to restrict the object created by ...
- Design Pattern in Java[Challenge 2.1]
尝试用简单的语言,讲述复杂的事情. 如发现文中的错误,或内容需要补充,忘不吝指教! CHALLENGE 2.1 Write down three differences between abstrac ...
- Java EE Design Patter
设计模式代表了经验丰富的面向对象软件开发人员使用的最佳实践.设计模式是软件开发人员在软件开发过程中遇到的一般问题的解决方案,这些解决方案是在相当长的一段时间内由众多软件开发人员通过反复试验获得的. 什 ...
- 说说设计模式~大话目录(Design Pattern)
回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...
最新文章
- 增大减小LV大小和文件系统
- webpack 的基本使用——配置打包的入口与出口||配置 webpack 的自动打包功能
- 【直播预告 | 今天10:30】多媒体技术PI第三期:网络传输
- leetcode 357. Count Numbers with Unique Digits | 357. 计算各个位数不同的数字个数(Java)
- python 一次输入10个数_python 如何一次输入3个整数
- Web Hacking 101 中文版 十七、服务端请求伪造
- AduSkin - UI 追求极致,永臻完美
- UVA495 Fibonacci Freeze【大数+万进制】
- 【知识图谱系列】基于生成式的知识图谱预训练模型GPT-GNN
- Magnification API-Windows放大镜
- lpush rpush 区别_php-redis中文参考手册_list容器相关_lPush_rPush_lPushx_rPu...
- 如何停止线程?stop方法过时弊端
- android 闪屏动态界面,Android实现闪屏欢迎界面
- 公众号里面套页面_怎么套用别人的公众号模板?公众号模板在哪找? | 微信公众号指南...
- CnOpenData中国各行业工商注册企业分年份数量统计(含新增,注销企业数量)
- 湖北武汉安全员C证报考条件考试流程一览 秋禾火
- 百融金服获2亿B轮融资 打造融合线上线下基因的第三方金融大数据公司
- Java学习--排序算法之插入法排序
- 微服务架构,springcloud核心组件和实战,docker容器
- c语言编写音乐播放器完整代码(mciSendString函数的使用方法,第一次使用Visual Studio 2019的详细步骤)