1.单态设计模式(Singleton Design Pattern)
基本概念:一个类只生成一个实例。
应用:譬如对数据库只能有一个连接,或者对网站的连接数的计数器。
形式1:
- public class Singleton {
- private static Singleton instance = new Singleton();
- private Singleton(){}
- public static Singleton getInstance() {
- return instance;
- }
- }
constructor是private,所以如 Singleton s = new Singleton() 不再可行了。只能通过
Singleton s = Singleton.getInstance(); 来获得实例,而这个实例因为是static,全局共享一个,所以无论有多少个Singleton s = Singleton.getInstance(); 得到的实例都是同一个。
形式2:(lazy initialization)
nippet 2同Snippet 1的区别在于:
- public class Singleton {
- private static Singleton instance = null;
- private Singleton(){}
- public static syncronized Singleton getInstance() {
- if(instance == null)
- instance = new Singleton();
- return instance;
- }
- }
Snippet 1在load class阶段就创建对象了;
而Snippet 2只有第一次要实例化的时候才会创建对象。这就是所谓的lazy initialization。
多线程问题:
如果是单线程,没问题,如果是多线程,问题就出现了,因为两个线程可以同时进入if(instance == null) 这个判断语句,所以有可能两个线程创建两个实例。
推荐使用模式1
2.