`
java-mans
  • 浏览: 11435904 次
文章分类
社区版块
存档分类
最新评论

单例(Singleton)设计模式

 
阅读更多
单例(Singleton)设计模式保证每个类只有一个实例,并为这个实例提供一个全局的访问点。

与工具类中静态成员不同,单例类一般用来保存应用程序的状态数据,这些数据在应用程序的各个部分都可能被访问或修改。

单例模式的几种实现方式。

  1. publicclassSingleton{
  2. privatestaticSingletoninstance=newSingleton();
  3. publicstaticSingletongetInstance(){
  4. returninstance;
  5. }
  6. /**Don'tletanyoneelseinstantiatethisclass*/
  7. privateSingleton(){
  8. }
  9. }

这种方式实现简单,并且保证实例的唯一性,缺点是必须先加载后使用,而且不管单例类是否真正使用到,实例总是会先被加载,这看起来相当的不妥,因而有了懒加载(Lazy Initialization)的模式。

  1. publicclassSingleton{
  2. privatestaticSingletoninstance=null;
  3. privateSingleton(){
  4. }
  5. publicstaticSingletongetInstance(){
  6. if(instance==null){
  7. instance=newSingleton();
  8. }
  9. returninstance;
  10. }
  11. }

这种方式可以实现懒加载,但当多个线程同时进入getInstance方法时,可能会产生多份实例,这显然违背单例模式的初衷。为了避免这种情况,考虑加上同步(synchronized)机制。

  1. publicclassSingleton{
  2. privatestaticSingletoninstance=null;
  3. privateSingleton(){
  4. }
  5. synchronizedstaticpublicSingletongetInstance(){
  6. if(instance==null){
  7. instance=newSingleton();
  8. }
  9. returninstance;
  10. }
  11. }

这种方式可以在懒加载的同时保证只有一份实例,但对整个getInstance方法作同步处理会带来线程同步上的性能消耗。

  1. publicclassSingleton{
  2. privatestaticSingletoninstance;
  3. privateSingleton(){
  4. }
  5. publicstaticSingletongetInstance(){
  6. if(instance==null){
  7. synchronized(Singleton.class){
  8. if(instance==null){
  9. instance=newSingleton();
  10. }
  11. }
  12. }
  13. returninstance;
  14. }
  15. }

上面的方式就是所谓的Double-check Locking即双重检查和锁定模式,目前看来很完美。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics