单例模式:保证一个类只有一个实例,并提供一个访问该类的全局访问点
类型:创建类模式
单例模式的特点:
1)构造方法私有;
2)指向自己实例的私有静态引用;
3)以自己实例为返回值的静态公有方法;
/*饿汉式:一开始就加载,以空间换时间**/
public class Singleton{
/*指向自己的私有静态引用*/
private static Singleton singleton = new Singleton();
/*构造方法私有*/
private Singleton(){};
/*公有的静态方法,返回值为自己的实例*/
public static Singleton getInstance(){
return singleton;
}
}
/*懒汉式:延迟加载,用到的时候才加载*/
public class Singleton{
private static Singleton singleton;
private Singleton(){};
public static Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}/*该懒汉模式非线程安全*/
public class Singleton{
private static Singleton singleton;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton = new Singleton();
}
return singleton;
}
}/*该懒汉模式线程安全,但效率低*/
public class Singleton{
private volatile static Singleton singleton;
private Singleton(){};
public static synchronized Singleton getInstance(){
if(singleton==null){
synchronized(Singleton.class){
singleton = new Singleton();
}
}
return singleton;
}/*该模式线程安全且效率较高:称作双重检查锁定*/
单例模式中存在的两个问题:
1)、如果单例类由不同的类加载器载入,那么可能存在多个单例类的实例。一些servlet容器对每个servlet使用不同的类装载器,这样的servtlet访问一个单例类,他们就会有各自的实例;
2)如果Singleton实现了Serializable接口,那么这个类就可能被序列化和还原;(序列化是将对象转化为字节序列的过程,反序列化是将字节序列还原成java对象的过程)