单例(一)
从最简单的单例开始:
package com.garinzhang.designpattern; public class SimpleSingleton { private static SimpleSingleton instance = null; private SimpleSingleton() {} public static SimpleSingleton getInstance() { if(instance == null) { instance = new SimpleSingleton(); } return instance; } public void printOut() { System.out.println("instance created!"); } }
以上例子有两个问题:
1. 通过JAVA里的反射可以产生构造函数为private的类的实例,看如下代码(这种方式可以让所有单例失效):
package com.garinzhang.designpattern; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; public class GetSimpleSingletonInstanceByReflection { static List<SimpleSingleton> list = new ArrayList<SimpleSingleton>(); @SuppressWarnings("unchecked") public static SimpleSingleton getInstance() { Constructor<SimpleSingleton>[] constructors = null; try { constructors = (Constructor<SimpleSingleton>[]) Class.forName("com.garinzhang.designpattern.SimpleSingleton").getDeclaredConstructors(); } catch(ClassNotFoundException e) { e.printStackTrace(); } Constructor<SimpleSingleton> con = constructors[0]; con.setAccessible(true); SimpleSingleton ss = null; try { ss = con.newInstance(); } catch(IllegalArgumentException e) { e.printStackTrace(); } catch(InvocationTargetException e) { e.printStackTrace(); } catch(IllegalAccessException e) { e.printStackTrace(); } catch(InstantiationException e) { e.printStackTrace(); } return ss; } public static void main(String[] args) { SimpleSingleton ss = getInstance(); System.out.println(ss instanceof SimpleSingleton); ss.printOut(); } }
2. 不是线程安全的。线程安全的定义:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的;
package com.garinzhang.designpattern; public class ThreadSafeSimpleSingleton { private static ThreadSafeSimpleSingleton instance = null; private ThreadSafeSimpleSingleton() {} public synchronized static ThreadSafeSimpleSingleton getInstance() { if(instance == null) { instance = new ThreadSafeSimpleSingleton(); } return instance; } }
GOF里的单例:
饿汉式单例类、懒汉式单例类、登记式单例类(http://www.cnblogs.com/whgw/archive/2011/10/05/2199535.html)
路慢慢其休远羲,吾将上下而求所