黑马程序员技术交流社区

标题: 单例设计模式——安全问题 [打印本页]

作者: 王文辉    时间: 2015-7-23 10:01
标题: 单例设计模式——安全问题
本帖最后由 王文辉 于 2015-7-23 10:27 编辑

相信大家对单例设计模式已经很熟悉
两种方式的区别:
在第二步时,饿汉式:private static Single s = new Single();
懒汉式:private static Single s = null;//在定义返回对象的方法时,判断没有对象才创建
上面是大家可能都了解的,还有一点是懒汉式存在的安全问题:
在使用多线程,两个线程同时执行到   if(s == null),这时如果s为null,会创建两个对象,这样就违背了对象在内存中的唯一性。
注意:因为计算机的执行效率很高,出现这种问题的几率很小,但是确实存在这个安全问题

单例设计模式:
1,私有化构造函数
2,创建私有并静态的本类对象
3,定义公有并静态的方法,返回该对象

饿汉式:
class Single{
        //私有化构造函数
        private Single(){
        
        }
        //私有并静态本类对象
        private static Single s = new Single();
        //定义公有并静态的方法,返回该对象
        public static Single getInstance(){
                return s;
        }
}

//懒汉式(延迟加载方式)
class Single{
        //私有化构造函数
        private Single{
        
        }
        //创建私有并静态的本类对象
        private static Single s = null;
        //定义公有并静态的方法,返回该对象
        public static Single getInstance(){
                if(s==null){
                        s=new Single();
                }
                return s;
        }
}


作者: 章浩    时间: 2015-7-23 10:51
可以用synchronized关键字来解决:
public static Single getInstace(){  
        if(s==null){        //解决效率  
        /*当两个并发线程访问同一个对象object中的这个synchronized(this)
        同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须
        等待当前线程执行完这个代码块以后才能执行该代码块。*/
            synchronized(Single.class){      
                if(s == null)   //解决安全问题  
                    s = new Single();  
            }  
        }  
              
        return s;  
    }  
作者: Leaos    时间: 2015-7-23 11:42
正在复习单例,刚好用上。
作者: 王文辉    时间: 2015-7-23 11:56
Leaos 发表于 2015-7-23 11:42
正在复习单例,刚好用上。

单例没啥说的,必须得会
作者: Leaos    时间: 2015-7-23 12:32
是滴呀,明天就要面试,今天赶紧再复习下
作者: 王文辉    时间: 2015-7-23 14:00
Leaos 发表于 2015-7-23 12:32
是滴呀,明天就要面试,今天赶紧再复习下

你这技术分还差的多,得赶紧弄分啊,你要报那期?
作者: Leaos    时间: 2015-7-23 14:37
我选择先付费的了,JavaEE18期
作者: wudigod12    时间: 2015-7-23 14:52
不错, 学习了~~~~~~~~~
作者: 王文辉    时间: 2015-7-23 17:35
Leaos 发表于 2015-7-23 14:37
我选择先付费的了,JavaEE18期

恩,加油兄弟
作者: Happe_Sun    时间: 2015-7-23 18:07
刚刚学完,可以可以~~
作者: 曾云鹏    时间: 2015-7-23 21:43
学习了,刚好看到这里很有帮助




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2