1 基本概念
单态模式是设计模式中最为人熟知的也是形式最简单的。它的基本概念是一个类只生成一个实例。
2 应用
ingleton的应用有很多,譬如对数据库只能有一个连接,或者对网站的连接数的计数器。
3 几种形式
基本形式是使用private constructor和一个public的static方法来获得类的实例。
- public class Singleton {
- private static Singleton instance = new Singleton();
- private Singleton(){}
- public static Singleton getInstance() {
- return instance;
- }
- }
Snippet 1
constructor是private,所以如 Singleton s = new Singleton() 不再可行了。只能通过
Singleton s = Singleton.getInstance(); 来获得实例,而这个实例因为是static,全局共享一个,所以无论有多少个Singleton s = Singleton.getInstance(); 得到的实例都是同一个。
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' class="size-full wp-image-25673 aligncenter" title="Singleton Design Pattern" alt="Singleton Design Pattern" width="518" height="320" src="/uploadfile/201301/12/4B12308745.jpg" />
constructor是private,所以如 Singleton s = new Singleton() 不再可行了。只能通过Singleton s = Singleton.getInstance();来获得实例,而这个实例因为是static,全局共享一个,所以无论有多少个Singleton s = Singleton.getInstance(); 得到的实例都是同一个。
而Singleton 还有另外一种形式,采用lazy initialization:
- public class Singleton {
- private static Singleton instance = null;
- private Singleton(){}
- public static Singleton getInstance() {
- if(instance == null)
- instance = new Singleton();
- return instance;
- }
- }
Snippet 2
Snippet 2同Snippet 1的区别在于:
Snippet 1在load class阶段就创建对象了;
而Snippet 2只有第一次要实例化的时候才会创建对象。这就是所谓的lazy initialization。
多线程问题
我们来看snippet 2,如果是单线程,没问题,如果是多线程,问题就出现了,因为两个线程可以同时进入if(instance == null) 这个判断语句,所以有可能两个线程创建两个实例。
- public class Singleton {
- private static Singleton instance = null;
- private Singleton(){}
- public static syncronized Singleton getInstance() {
- if(instance == null)
- instance = new Singleton();
- return instance;
- }
- }
S