设计模式之单例模式

 

刚学习了大话设计模式中的单例模式,因此想跟大家分享一些我对单例模式的一些认识。本文给出了设计模式中单例模式的简单示例,及在应用中的一点注意事项,首次在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方法都要加锁,减小了系统开销;另外当有一个线程进入临界区时,其它线程也通过了对象为空的条件判断,导致最后创建了多个对象情况的发生,后者则是为了防止这种情况的发生,即所谓“双重锁定”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值