学习这条首先要了解什么是Singleton,Singleton就是仅仅被实例化一次的类,我们先来看一个常见的单例:
public class Singleton { public final static Singleton INSTANCE = new Singleton(); private Singleton(){ } }
这样的单例其实并不能完全保证该类只被实例化一次,攻击者可以通过反射获得私有的构造器,并执行setAccessible(true)方法使其能够被访问,这就破坏了单例只能被实例化一次的特性。解决这个问题就是在私有的构造器中判断被执行的次数,不是第一次执行时候就抛出异常。
还有一种情况是有的单例需要被序列化,即实现java.io.Serializable接口。单例的对象被反序列化时就会创建新的实例。
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("singleton.txt")); oos.writeObject(Singleton.INSTANCE); ObjectInputStream ois = new ObjectInputStream(new FileInputStream("singleton.txt")); Singleton sin = (Singleton)ois.readObject();
这里的sin就是一个新的实例,解决这个问题需要将单例中所有非基本类型的域都加transient修饰符,表明这些域都不需要被序列化,同时要在类中加入readResolve方法返回唯一的实例:
private Object readResolve(){ return INSTANCE; }
这样就能保证反序列化得到的对象也是那个唯一的实例,至于为什么会在后面序列化的章节专门有一条做阐释。
通过上面的分析过程,大家会发现实现一个完美的单例太复杂了,幸运的是,JDK1.5之后,我们有了更好的方式来实现单例,那就是枚举类型:
public enum EnumSingleton{ INSTANCE; }
这种方法再简单不过了,不需要考虑反射攻击的情况,而且无偿地提供了序列化机制,绝对防止多次实例化,所以在以后实现单例的时候优先地考虑枚举吧!
相关推荐
Laravel开发-singleton-pattern 帮助程序包来实现单例类。
Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变量中...
懒汉式优化-加锁同步3.DCL双检锁/双重校验锁重排序问题多线程执行时序表volatile 作用优化-基于volatile 的双重检查锁4.IODH按需初始化持有者反射问题私有构造函数异常处理5.枚举实现单例使用推荐 什么是单例? 单例...
设计模式-Singleton与Factory
3、有构造函数,构造函数有没有参数版本(DEFINE_SINGLETON_CONSTRUCT_WITH_DEFAULT); 4、有构造函数,构造函数都有参数(DEFINE_SINGLETON_CONSTRUCT); 通过宏定义巧妙实现,使用也很方便!
C++完美实现Singleton模式
简单的单例模式举例Singleton 分为恶汉式 懒汉式
perl-Class-Singleton-1.4-6.el6.noarch.rpm perl-Class-Singleton-1.4-6.el6.noarch.rpm
python库。 资源全名:django-singleton-admin-0.0.2.macosx-10.7-intel.exe
DataSource的单态模式(SingleTon)程序---马克-to-win java视频 数据源 单态模式 dataSource Singleton
单例模式(Singleton)
单例模式 Singleton 单例模式线程安全问题和拓展
用VC实现的singleton 模式 在VS03,VC6.0下编译通过
单例模式,Singleton两种代码实现。一般实现方法,泛型实现方法(推荐)
Singleton pattern单例模式应用
资源来自pypi官网。 资源全名:dask-actor-singleton-1.1.0.tar.gz
PHP7-Singleton模式 composer require darkfriend/php7-singleton
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装