设计模式之单件模式(单例模式)

声明:设计模式相关文章收集整理于互联网,并且参考《Head First设计模式》,并非本人原创内容,本人旨在学习交流,并非有意冒犯,本人尽可能的注明来源出处。

所谓单件模式(单例模式),是指是某个类最多只能有一个实例对象。我们在编程中,实际上会经遇到这种情况,比如线程池、缓存、注册表对象、驱动对象等,上述这些情况,实际只能有一个实例,否则就会产生很多问题,如程序的行为异常、资源使用过量等。

典型的单件模式如下:

我们可以从上述代码中看出,构造方法被声明为私有,外部首先就不能直接创建该类的实例。只有当调用getInstance()方法时,如果uniqueInstance为空才会去创建,这就是所谓的“延迟创建”,只在使用的时候创建。而之后在调用getInstance()方法时,如果uniqueInstance不为空,则返回它自己,这就保证了这个类的实例只有一个。
单件模式高级技巧
在多线程中使用单件模式时,可能会遇到一些新的问题:假如有两个线程同时调用getInstance()方法,则会出现如下的现象。

假如入上述两个线程中的代码按上述顺序跑下来,我们就得到了两个实例对象。那么怎样去避免这种情况发生呢?如下提供了三种方案:
1.同步getInstance()方法:

优点:既简单又有效
缺点:每次调用getInstance()都会执行同步,影响程序执行效率,getInstance()不适合用在频繁运行的地方。
2.立即创建实例,不延迟实例化:

优点:同样简单有效
缺点:使用这种方法,需要使用者不在意这个类的对象所占用的资源。并且它依赖于JVM。在加载这个类的时候马上创建一个唯一的单件实例,同时保证任何线程在访问uniqueInstance静态变量前,一定先创建该实例。
3.双重检查加锁:

优点:利用双重检查加锁,只有第一次才会执行同步
缺点:在1.4及更早版本的java中,volatile关键字的实现可能会导致双重检查加锁失效。

参考:

《Head First 设计模式》

0 条评论
发表一条评论

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。