`
skychongrichie
  • 浏览: 3359 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

设计模式之单例模式

阅读更多

 

刚学习了大话设计模式中的单例模式,因此想跟大家分享一些我对单例模式的一些认识。本文给出了设计模式中单例模式的简单示例,及在应用中的一点注意事项,首次在ITeye上发博客,不当之处还望指正。示例代码如下:

 

 

package 设计模式练习.单例模式;

 

public class SingleObject

{

private static SingleObject obj;

private static Object lock=new Object();

private SingleObject(){}

public static SingleObject getInstance()

{

if(obj==null)

{

synchronized (lock)

{

if(obj==null)

{

obj=new SingleObject();

}

}

}

return obj;

}

public static void main(String[] args)

{

SingleObject obj1=SingleObject.getInstance();

SingleObject obj2=SingleObject.getInstance();

if(obj1==obj2)

{

System.out.println("obj1和obj2引用同一对象!");

}

}

}

 

******************运行结果******************

obj1和obj2引用同一对象!

需要注意的是在多线程环境下使用一般的懒汉单例模式时,如果多个线程同时进入判断对象是否为空的代码段时,若此时对象为空,那么多个线程就可能同时创建多个实例了。为解决这个问题,我们对getInstance方法中的一段加锁,这样就能防止创建多个实例现象的发生。代码如下,值得注意的是,在getInstance方法中我们需要两次判断对象是否为空,这两个判断分别在临街区外和临界区内,前者是为了不至于每次调用getInstance方法都要加锁,减小了系统开销;另外当有一个线程进入临界区时,其它线程也通过了对象为空的条件判断,导致最后创建了多个对象情况的发生,后者则是为了防止这种情况的发生,即所谓“双重锁定”。
0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics