首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

《狂言设计模式》读书笔记:单例模式与Java同步锁synchronized

2012-10-05 
《大话设计模式》读书笔记:单例模式与Java同步锁synchronized单例模式,保证一个类仅有一个实例,并提供一个访

《大话设计模式》读书笔记:单例模式与Java同步锁synchronized

单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。在单例模式下,类本身负责保存它的唯一实例,这个类必须保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。单例模式的类中,构造方法(函数/体)被设为private,从而堵死了外部实例化该类的可能。同时,在类中提供一个静态方法负责提供该类的唯一实例,并在实例不存在的情况下试图初始化它。

 

下面的示例展示了单例模式的典型实现:

public class Singleton {    private static Singleton instance;    private final static Object syncLock = new Object();       private Singleton() {           }       public static Singleton getInstance(){        if (instance == null) {            synchronized (syncLock) {                if (instance == null) {                    instance = new Singleton();                }            }        }               return instance;    }}

 

需要注意的是,synchronized同步块处括号中的锁定对象采用的是一个无关的Object类实例。将它作为锁而不是通常synchronized所用的this,其原因是getInstance方法是一个静态方法,在它的内部不能使用未静态的或者未实例化的类对象(避免空指针异常)。同时也没有直接使用instance作为锁定的对象,是因为加锁之时,instance可能还没实例化(同样是为了避免空指针异常)。

此外,单例类中不建议将getInstance方法修饰为synchronized方法,其原因是一旦这样做了,其效果就跟《大话设计模式》书中21.5小节的示例是一样的了。这种做法会在每次调用getInstance方法时,都需要加锁,与上例相比效率更低。

热点排行