顿搜
飞过闲红千叶,夕岸在哪
类目归类
单例指类只需要一个实例,单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。以下是七种单例模式的书写方式。
//优点:可以lazy加载,缺点:线程不安全
public Class Singleton{
public static Singleton instance =null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}//优点:线程安全,缺点:耗资源
public Class Singleton{
public static Singleton instance =null;
private Singleton(){}
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}//优点:避免了多线程同步问题,缺点:没有Lazy加载
public Class Singleton{
public static Singleton instance =new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}//和第三种差不多
public Class Singleton{
public static Singleton instance =null;
static{
instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}//避免了多线程同步问题,也实现了Lazy加载
public Class Singleton{
private static Class SingletonHolder{
private static final Singleton INSTANCE = new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolder.INSTANCE;
}
/* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */
public Object readResolve{
return getInstance();
}
}//这是Effective Java作者Josh Bloch 提倡的方式,
//不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
public enum Singleton{
INSTANCE;
public void whateverMethod(){}
}//对第二种方式的升级,优点:线程安全,不耗资源
public Class Singleton{
public static volatile Singleton instance =null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized(Singleton.class){
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}采用类的静态方法,也可以实现单例模式的效果。但是存在以下问题
1、静态类不能实现接口。因为接口中不允许有static修饰的方法,所以即使实现了也是非静态的。
2、单例可以实现延迟初始化,静态类一般第一次加载时就初始化了。
3、单例类可以被继承,方法可以被覆写。但是静态类的内部方法都是static,无法被覆写。