@chenxuxiong
2016-05-23T03:43:41.000000Z
字数 1593
阅读 436
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();
}
}