JDP-[单例模式]-思路梳理

单例模式是属于比较常用的一例,一个类(class)在内存中只有一个实例。
常用方式如下:
第一种(饿汉式):

public class Singleton 
{
  private Singleton(){}
  private static Singleton instance = new Singleton();
  public static Singleton getInstance() 
    {
    return instance;   
   }
}

 

第二种方式:(懒汉式)

public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率!
 if (instance==null)
    instance=new Singleton();
  return instance;   }
}

比较安全的使用方式是第一种private static Singleton instance = new Singleton();
单例的陷井:
多个虚拟机
当单例类被运行在多个虚拟机下的时候,在每个虚拟机都可以创建一个实例对歇脚。像使用了EJB,JINI,RMI技术的分布式系统的时候,
因为中间件屏蔽了分布式系统在物理上的差异,这个时候想知道在哪个虚拟机下运行着哪个单例对象很困难。因此在使用分布式技术时,应
该避免使用
多个类加载器
当存在多个类加载器,即使它们加载的相同包名,相同类名甚至每个字节都完全相同的类,也会被区别对待的。因为不同的类加载器会使用
不同的命名空间来区分同一个类,因此,单例类在多加载器的环境下会产生多个单例对象。也许你认为出现多个类加载器的情况不多,其实
多个类加载器存在的情况不少,在很多J2EE服务器上允许存在多个SERVLET引擎,而每个引擎是采用不同的类加载器的,浏览器的APPLET
小程序通过网络加载类的时候,由于安全因素,采用的是特殊类加载器,等等。
在这种情况,由状态的单例模式也会给系统带来隐患。因此除非系统由协调机制,在一般情况下不要使用存在状态的单例模式。
错误的同步处理
在使用上面介绍的懒汉式单模式的时候,同步得理恰当与否也是很,不然要能达不到想要的单例效果,还可能
引发死锁等。因此在使用懒汉式单例模式时一定要对同步有所了解,不过使用饿汉式单例模式就可以避免这个
问题。
子类破坏了对象控制
如果构造器变得不再私有,就有可能失去对对象的控制
串行化(可序列化)
为了使一个单例类变成可串行化的,仅仅在声明中添加“implements Serializable"是不够的,因为一个串行化
的对象在每次反串行化的时候,都会创建一个新的对象,而不仅仅是一个对原有对象的引用,为了防止这种情
况,可以在单例类中加入readResolve方法

public final class Singleton implements Serializable{
private Singleton () { }
private static final Singleton INSTANCE = new Singleton ();
public static Singleton getInstance() { return INSTANCE; }
private Object readResolve() throws ObjectStreamException {
return INSTANCE;
}
}

 对象的反串行化并不仅局限于上述方式,还存在基于 XML模式的对象串行化方式,这种方式也存在上述的问
题,所以在使用的时候还要格外小心。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值