单件模式:
简单实现:确保一个类只有一个实例,并提供一个全局访问点。
public class MyClass { private static MyClass uniqueInstance; private MyClass(){ } public static MyClass getInstance(){ if(uniqueInstance == null){ uniqueInstance = new MyClass(); } return uniqueInstance; } }
使用私有的构造方法以及私有的静态变量(uniqueInstance)来记录唯一的实例,使用静态方法getInstance来实现全局访问。
简单实现存在一个问题,如果该类涉及多线程,则会出现多个实例被创建,就失去了单例的意义,对于这个问题有3种改善模式:
1、同步getInstance方法
public class MyClass { private static MyClass uniqueInstance; private MyClass(){ } public static synchronized MyClass getInstance(){ if(uniqueInstance == null){ uniqueInstance = new MyClass(); } return uniqueInstance; } }
缺点:严重拖垮性能,每次执行该方法都要进行同步。
2、不进行延迟实例化,而使用急切创建实例
public class MyClass { private static MyClass uniqueInstance = new MyClass(); private MyClass(){ } public static MyClass getInstance(){ return uniqueInstance; } }
如果应用程序总是需要创建并使用单件实例,并且这个实例在创建和运行时负担不重,可以使用急切创建实例。每次加载这个类时JVM都会创建此唯一实例。
3、用“双重检查加锁”,在getInstance()中减少使用同步
public class MyClass { private static MyClass uniqueInstance; private MyClass() { } public static MyClass getInstance() { if (uniqueInstance == null) { synchronized (MyClass.class) { if (uniqueInstance == null) { uniqueInstance = new MyClass(); } } } return uniqueInstance; } }
优秀的方法,可保证getInstance只在第一次加载的时候进行同步。需要确定是否使用java5以上的版本。