@chenxuxiong
2016-05-23T03:43:41.000000Z
字数 1593
阅读 455
JAVA基础 设计模式
1.饿汉式
天生线程安全
但在类创建的同时就已经创建好一个静态的对象供系统使用,所以比较浪费
public class Singleton{private Singleton(){}private static Singleton single=new Singleton();public static getInstance(){return single;}}
2.懒汉式
线程不安全,多线程情况下可能会创建多个实例
public class Singleton{private static Singleton single=null;private Singleton(){}public static Singleton getInstance(){if(single==null)single=new Singleton();return single;}}
3.加同步
性能差
public class Singleton{private static Singleton single=null;private Singleton(){}public static synchronized Singleton getInstance(){if(single==null)single=new Singleton();return single;}}
4.双重检验锁
线程安全
这种实现方式既可以实现线程安全地创建实例,而又不会对性能造成太大的影响。它只是第一次创建实例的时候同步,以后就不需要同步了,从而加快了运行速度。
public class Singleton{private volatile Singleton single=null;private Singleton(){}public static Singleton getInstance(){if(single==null)synchronized(Singleton.class){if(single==null)single=new Singleton();}return single;}}
5.内部类式
当getInstance方法第一次被调用的时候,它第一次读取SingletonHolder.instance,导致SingletonHolder类得到初始化;而这个类在装载并被初始化的时候,会初始化它的静态域,从而创建Singleton的实例,由于是静态的域,因此只会在虚拟机装载类的时候初始化一次,并由虚拟机来保证它的线程安全性。
这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本。
public class Singleton{private Singleton(){}private static class InnerHoder{private static Singleton instance=new Singleton();}public static Singleton getInstance(){return InnerHoder.instance;}}
6.枚举式
1、 自由序列化;
2、 保证只有一个实例(即使使用反射机制也无法多次实例化一个枚举量)
3、 线程安全;
public enum HelperSingleton {INSTANCE;private HelperSingleton(){}public Object[] buildObject(){final Object[] obj=new Object[2];obj[0]=new String("xxx");obj[1]=new Integer(555);return obj;}/*** 使用*/public static void main(String[] args) {Object[] obj=HelperSingleton.INSTANCE.buildObject();}}