Singleton - 单例模式

概述:

创建一个实例,
如何创建一个线程安全的实例? -DCL,
为什么要有volatile 关键字? 避免指令重排序, 1.分配内存空间,2.类初始化 3.结束
Singleton_sample


说明:

1.本文仅仅是对 图解设计模式 的简单总结(个人笔记).
2.文章中的图片均来自本书,添加水印只是为了防止盗链行为,并无侵权的想法.
综上,若侵权, 请联系删除!
转载请标注出处!


案例:

  • 案例说明:

    只生成一个实例

  • Singleton_uml_case
  • 主要代码:
  • 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_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:欢迎大家来到我的小站,鸣谢!