`
SunMicro
  • 浏览: 20993 次
社区版块
存档分类
最新评论

Lazy Loading Singletons

阅读更多
今天在论坛看见一小段代码,不得不佩服作者(blog)的创新精神。以前在使用Singleton的时候大多采用这样的方式:
java 代码
  1. public class Singleton {
  2. static Singleton instance;
  3. public static synchronized Singleton getInstance() {
  4. if (instance == null)
  5. instance = new Singleton();
  6. return instance;
  7. }
  8. }
但这里的问题是synchronization实际上只在getInstance()第一次调用的时候需要,这个方法在多线程频繁调用的应用中必然会成为效率的瓶颈。

到了
java1.5,Bob Lee提到了 Double-Checked Locking (DCL) ,并强调了是infamous DCL;这种做法强调了效率(但Bob Lee认为volatile 不比synchronized快,另外这种做法会产生更多的代码,所以仍然坚持使用plain old synchronization),并不将整个方法synchronized,而是只对创建Singleton进行同步,这样,线程进入getInstance(),发现instance 已经创建,就会直接返回instance,而不用在方法外等待。

在这种情况下,Singleton的实现代码一般是这样:
java 代码
  1. static volatile Singleton instance;
  2. public static Singleton getInstance() {
  3. if (instance == null) {
  4. synchronized (Singleton.class) {
  5. if (instance == null)
  6. instance == new Singleton();
  7. }
  8. }
  9. return instance;
  10. }

接下来是 Bob Lee的创新做法:
java 代码
  1. static class SingletonHolder {
  2. static Singleton instance = new Singleton();
  3. }
  4. public static Singleton getInstance() {
  5. return SingletonHolder.instance;
  6. }
JLS将保证Singleton instance只在第一次调用getInstance()的时候创建。优雅且快速!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics