Singleton 模式的宗旨在于确保某个类只有一个实例,别且为之提供一个全局访问点。
为了防止其他工作人员实例化我们的类,可以为该类创建唯一一个构造器,并将构造器的可见
设置为私有。值得注意的是,如果我们创建了其他的非私有的构造器,或者根本没有为该类提
供构造器,那么其他人员还是能实例化我们的类。
如果不希望提前创建单例对象,我们可以等到第一次使用该单例对象的时候在创建它,即
滞后初始化。滞后初始化单例对象有两个理由:
1.也许在静态初始化时间,你没有关于如何初始化单例对象的足够信息。
2.选择滞后初始化单例的目的也许为了等待资源,诸如数据库连接,尤其是在某些特定会话中
不需要这个单例的应用程序中。
如果在多线程环境中对单例采用滞后初始化,那么我们必须小心防止多个线程同时初始化该
单例。Singleton 有以下形式:
1.不支持多线程:
- public class Singleton {
- //** * 单线程 开始
- private static Singleton instance;
- private Singleton(){}
- public static Singleton getInstance(){
- if(instance==null){
- instance=new Singleton();
- }
- return instance;
- }
- // ** * 单线程 结束
- }
2.支持多线程:
- public class Singleton {
- // ** * 多线程 开始
- private static Singleton instance = null;
- private static Object classlock = Singleton.class;
- private Singleton() {
- }
- public static Singleton getInstance() {
- synchronized (classlock) {
- if (instance == null) {
- instance = new Singleton();
- }
- return instance;
- }
- }
- // ** * 多线程 结束