单例模式(懒汉)和双重锁定的示例

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

代码片段(1)[全屏查看所有代码]

1. [代码]注意其中双重锁定的使用     

01 package 设计模式练习.单例模式;
02  
03 public class SingleObject
04 {
05     private static SingleObject obj;
06     private static Object lock=new Object();
07      
08     private SingleObject(){}
09      
10     public static SingleObject getInstance()
11     {
12         if(obj==null)
13         {
14             synchronized (lock)
15             {
16                 if(obj==null)
17                 {
18                     obj=new SingleObject();
19                 }
20             }
21         }
22         return obj;
23     }
24      
25     public static void main(String[] args)
26     {
27         SingleObject obj1=SingleObject.getInstance();
28         SingleObject obj2=SingleObject.getInstance();
29         if(obj1==obj2)
30         {
31             System.out.println("obj1和obj2引用同一对象!");
32         }
33     }
34 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值