单例模式:设计模式之一,单例模式,就是一个类只可创建一个对象。
实现方法:将构造方法私有化。
实现1:饿汉模式
public class Singleton{
private static Singleton instance=new Singleton();
private Singleton(){ }
public static Singleton getInstance(){
return instance;
}
}
饿汉式是典型的空间换时间,当类装载的时候就会创建类的实例,不管你用不用,先创建出来,然后每次调用的时候,就不需要再判断,节省了运行时间。
实现2:懒汉模式
public class Singleton{
private static Singleton instance=null;
private Singleton(){ }
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。当然,如果一直没有人使用的话,那就不会创建实例,则节约内存空间
3.双重检查加锁
可以既实现线程安全,又提高性能。适用于jdk1.5及以上版本。
public class Singleton{
private static Singleton instance=null;
private Singleton(){ }
public static Singleton getInstance(){
if(instance==null){
sychronized (Singleton.class){
if(instance==null){
instance=new Singleton();
}
}
}
return instance;
}
}
这种实现方式既可以实现线程安全地创建实例,而又不会对性能造成太大的影响。它只是第一次创建实例的时候同步,以后就不需要同步了,从而加快了运行速度.由于volatile关键字可能会屏蔽掉虚拟机中一些必要的代码优化,所以运行效率并不是很高。因此一般建议,没有特别的需要,不要使用。也就是说,虽然可以使用“双重检查加锁”机制来实现线程安全的单例,但并不建议大量采用,可以根据情况来选用。
4.Lazy initialization holder class模式
public class Singleton {
private Singleton(){}
private static class SingletonHolder{
private static Singleton instance = new Singleton();
}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
这个模式的优势在于,getInstance方法并没有被同步,并且只是执行一个域的访问,因此延迟初始化并没有增加任何访问成本
5.枚举。
public enum Singleton{
instance;
public void singletonOperation{
}
}
使用枚举来实现单实例控制会更加简洁,而且无偿地提供了序列化机制,并由JVM从根本上提供保障,绝对防止多次实例化,是更简洁、高效、安全的实现单例的方式.枚举的好处:1、 自由序列化; 2、 保证只有一个实例(即使使用反射机制也无法多次实例化一个枚举量); 3、 线程安全.