Singleton - 单例模式
概述:
创建一个实例,
如何创建一个线程安全的实例? -DCL,
为什么要有volatile 关键字? 避免指令重排序, 1.分配内存空间,2.类初始化 3.结束![]()
说明:
1.本文仅仅是对 图解设计模式 的简单总结(个人笔记).
2.文章中的图片均来自本书,添加水印只是为了防止盗链行为,并无侵权的想法.
综上,若侵权, 请联系我删除!
转载请标注出处!
案例:
- 案例说明:
只生成一个实例
- 主要代码:
- Singleton.java
package Gof.Singleton; public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { System.out.println("生成了一个实例。"); } public static Singleton getInstance() { return singleton; } }
- 代码链接:传送门
uml综述
- Singleton : 只返回这一个实例
收获:
- singleton 的构造函数事private的,禁止从singleton类外部调用构造函数, singleton 可以保证在任何情况下只有一个实例
(这种说法是不对的,通过代理,可以忽略关键字private的存在,也就是说,完全公开, –尽在此处提一下,不过应该没有人这么写程序吧)
相关设计模式:
- AbstractFactory
- Builder
- Facade
- Prototype
Question :
下列代码并非严格singleton模式,为什么?
public class Singleton {
private static Singleton singleton = null;
private Singleton() {
System.out.println("生成了一个实例。");
}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
```
- answer: 多线程时会生成多个对象,需要加锁,
```java
public class Main extends Thread {
// 多线程实例 Main.java 这样就会生成多个实例,导致出错
public static void main(String[] args) {
System.out.println("Start.");
new Main("A").start();
new Main("B").start();
new Main("C").start();
System.out.println("End.");
}
public void run() {
Singleton obj = Singleton.getInstance();
System.out.println(getName() + ": obj = " + obj);
}
public Main(String name) {
super(name);
}
}
// 解决办法是在Singleton.java生成实例的过程加锁,类似于:
public static synchronized Singleton getInstance(){
....
}
注意:
此部分内容属于对GOF Design Pattern知识的初步认知阶段,参考书籍是结城浩的《图解设计模式》,简单易懂,十分推荐!
以上内容,作者一字一句码出来的,纯属不易,欢迎大家转载,转载是还请您表明出处。另外如果我有侵权行为,请在下方留言,确认后我会及时撤销相应内容,谢谢大家!
PS:欢迎大家来到我的小站,鸣谢!
猜你喜欢