首页 > 其他 > 详细

设计模式复习--单例模式

时间:2014-04-23 23:29:35      阅读:374      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
public class Singleton {
        //利用静态变量来记录Singleton的唯一实例
        private static Singleton uniqueInstance;
        
        /*
         * 构造器私有化,只有Singleton类内才可以调用构造器
         */
        private Singleton(){
                
        }
        
        public static Singleton getInstance(){
                if(uniqueInstance == null){
                        uniqueInstance = new Singleton();
                }
                
                return uniqueInstance;
        }  
}
bubuko.com,布布扣

 

如果有两个线程都要执行这段代码,很有可能会产生两个实例对象

第一、  使用synchronized来处理。也就是说将getInstance()方法变成同步方法即可。
bubuko.com,布布扣
public class Singleton {
        //利用静态变量来记录Singleton的唯一实例
        private static Singleton uniqueInstance;
        
        /*
         * 构造器私有化,只有Singleton类内才可以调用构造器
         */
        private Singleton(){
                
        }
        
        public static synchronized Singleton getInstance(){
                if(uniqueInstance == null){
                        uniqueInstance = new Singleton();
                }
                
                return uniqueInstance;
        } 
}
bubuko.com,布布扣

 

 

          第二、  直接初始化静态变量。这样就保证了线程安全。
bubuko.com,布布扣
public class Singleton {
        /*
         * 利用静态变量来记录Singleton的唯一实例
         * 直接初始化静态变量,这样就可以确保线程安全了
         */
        private static Singleton uniqueInstance = new Singleton();
        
        /*
         * 构造器私有化,只有Singleton类内才可以调用构造器
         */
        private Singleton(){
                
        }
        
        public static Singleton getInstance(){
                return uniqueInstance;
        }
}
bubuko.com,布布扣

 

 

           第三、  用“双重检查加锁”,在getInstance()中减少使用同步。
bubuko.com,布布扣
public class Singleton {
        /*
         * 利用静态变量来记录Singleton的唯一实例
         * volatile 关键字确保:当uniqueInstance变量被初始化成Singleton实例时,
         * 多个线程正确地处理uniqueInstance变量
         * 
         */
        private volatile static Singleton uniqueInstance;
        
        /*
         * 构造器私有化,只有Singleton类内才可以调用构造器
         */
        private Singleton(){
                
        }
        
        /*
         * 
         * 检查实例,如果不存在,就进入同步区域
         */
        public static Singleton getInstance(){
                if(uniqueInstance == null){
                        synchronized(Singleton.class){    //进入同步区域
                                if(uniqueInstance == null){     //在检查一次,如果为null,则创建
                                        uniqueInstance  = new Singleton();
                                }
                        }
                }
                
                return uniqueInstance;
        }  
}
bubuko.com,布布扣

 

 
            在这里是首先检查是否实例已经创建了,如果尚未创建,才会进行同步。这样一来。只有第一次会同步。

设计模式复习--单例模式,布布扣,bubuko.com

设计模式复习--单例模式

原文:http://www.cnblogs.com/androidsuperman/p/3679251.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!