Singleton(单例)形式
Singleton(单例)模式
Singleton 模式的宗旨在于确保某个类只有一个实例,别且为之提供一个全局访问点。
为了防止其他工作人员实例化我们的类,可以为该类创建唯一一个构造器,并将构造器的可见
设置为私有。值得注意的是,如果我们创建了其他的非私有的构造器,或者根本没有为该类提
供构造器,那么其他人员还是能实例化我们的类。
如果不希望提前创建单例对象,我们可以等到第一次使用该单例对象的时候在创建它,即
滞后初始化。滞后初始化单例对象有两个理由:
1.也许在静态初始化时间,你没有关于如何初始化单例对象的足够信息。
2.选择滞后初始化单例的目的也许为了等待资源,诸如数据库连接,尤其是在某些特定会话中
不需要这个单例的应用程序中。
单例啥时候使用:http://www.jdsyxx.net/oblog313/user1/2/archives/2010/3090.html
为什么使用:全局性的唯一性的功能才使用,如读取配置文件。
单例分两种方式实现:饿汉式、懒汉式。
饿汉式:
public class Singleton{ private static Singleton singleton = new Singleton (); private Singleton (){} public Singleton getInstance(){return singletion;} }
懒汉式:如下。。。。。
如果在多线程环境中对单例采用滞后初始化,那么我们必须小心防止多个线程同时初始化该
单例。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; } } // ** * 多线程 结束
简便方式:
public class Singleton { // ** * 多线程 开始 private static Singleton instance = null; private Singleton() { } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } // ** * 多线程 结束 }
深入研究单例:
参考:http://www.iteye.com/topic/60179 单例模式完全剖析