饿汉模式:
public class Singleton{
private static Singleton singleton = new Singleton();
private Singleton(){};
public static Singleton getsingleton(){
return singleton;
}
}
优点:线程安全,类加载时实例化调用速度快。
缺点:无论是否用到都会存在内存中 如果单例实例化资源消耗大 则占用内存
懒汉模式:
public class Singleton{
private static Singleton singleton = null;
private Singleton(){};
public static Singleton getsingleton(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}
优点:延迟加载,在没有用到时不占用内存,第一次调用慢,以后会正常
缺点:线程不安全
解决线程不安全的方法:
修改getsingleton方法
1:给整个方法上锁
public static synchronized Singleton getsingleton(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
每次调用都会上锁 效率低
2:双重检测模型
public static Singleton getsingleton(){
if(singleton==null){
synchronized(Singleton.Class){
if(singleton==null){
singleton = new Singleton();
}
}
}
return singleton;
}
减少了上锁的次数 提高性能
3:静态内部类方式
public class Singleton{
private static class SingletonHold{
private static final Singleton singleton = new Singleton();
}
private Singleton(){};
public static Singleton getsingleton(){
return SingletonHold.singleton;
}
}
利用了classload的加载机制,不需要上锁性能高 推荐这种实现
synchronized的使用参考:http://blog.csdn.net/u014041033/article/details/48528209