A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王文辉 中级黑马   /  2015-7-23 10:01  /  847 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王文辉 于 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;
        }
}

10 个回复

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

单例没啥说的,必须得会
回复 使用道具 举报
是滴呀,明天就要面试,今天赶紧再复习下
回复 使用道具 举报
Leaos 发表于 2015-7-23 12:32
是滴呀,明天就要面试,今天赶紧再复习下

你这技术分还差的多,得赶紧弄分啊,你要报那期?
回复 使用道具 举报
Leaos 初级黑马 2015-7-23 14:37:47
7#
我选择先付费的了,JavaEE18期
回复 使用道具 举报
不错, 学习了~~~~~~~~~
回复 使用道具 举报
Leaos 发表于 2015-7-23 14:37
我选择先付费的了,JavaEE18期

恩,加油兄弟
回复 使用道具 举报
刚刚学完,可以可以~~
回复 使用道具 举报
学习了,刚好看到这里很有帮助
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马