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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余海龙 黑马帝   /  2012-2-9 17:32  /  2008 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余海龙 于 2012-2-9 22:43 编辑

单例设计模式:
1,        懒汉式:(单例延迟加载)
class Single
{
        private static Single s = null; // 将成员变量私有化静态化,将其共享在静态区中并禁止外界访问。
        private Single() // 将构造函数私有化,禁止外界创建对象
        {
        }
        public static Single getInstance()  // 提供公开的得到对象的方法。
        {
                if(s==null)
                {
                        s = new Single();
                }
                return s;
        }
       
}
2,饿汉式
class Single
{
        // 将其私有并共享。
        private static final Single s = new Single();
        // 私有化构造函数,防止外界创建构造函数。
        private Single()
        {
               
        }
        // 提供公开的得到对象的构造方法。
        public static Single getInstance()
        {
                return s;
        }
       
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

8 个回复

倒序浏览
学习了。。
回复 使用道具 举报
lz懒汉式的getInstance()方法还得加上同步锁啊,否则的话几个线程并发调用,就可能创建多个对象,还造成内存泄漏,就不是单例模式了 修改代码如下:
class Single
{
        private static Single s = null; // 将成员变量私有化静态化,将其共享在静态区中并禁止外界访问。
        private Single() // 将构造函数私有化,禁止外界创建对象
        {
        }
        public synchronized static Single getInstance()  // 提供公开的得到对象的方法。
        {
                if(s==null)
                {
                        s = new Single();
                }
                return s;
        }
        
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
楼上代码还可优化,给锁再加一个if,通过双层判断提高效率
class Single
{
        private static Single s = null;
        private Single()
        {
        }
        public static Single getInstance()//提供getInstance方法获取对象
        {
                if(s==null)
                {
                        synchronized(Single.class)
                        {                               
                                if(s==null)
                                        s = new Single();
                        }
                }
                return s;
        }
}
回复 使用道具 举报
许涛 发表于 2012-2-9 20:19
楼上代码还可优化,给锁再加一个if,通过双层判断提高效率
class Single
{

你加上这句有必要么?
回复 使用道具 举报
最初的理想 发表于 2012-2-9 21:04
你加上这句有必要么?

这貌似毕老师课上讲的。
回复 使用道具 举报
许涛 黑马帝 2012-2-9 22:05:31
7#
public static synchronized Single getInstance()
{
        if(s==null)
        {
                s = new Single();
        }
        return s;
}
代码如果这样写,是不是每次都要对锁进行判断,代码执行效率自然比较低

if(s==null)
{
        synchronized(Single.class)
        {                                
                if(s==null)
                        s = new Single();
        }
}
而给锁加一个if判断,当第一个对象被创建后,s!=null,外层if为false,不再对锁判断,锁的判断次数减少 不是提高了效率吗

你要是不考虑执行效率问题 自然是没必要

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
许涛 发表于 2012-2-9 22:05
public static synchronized Single getInstance()
{
        if(s==null)

受教了,{:3_47:}
回复 使用道具 举报
许涛 黑马帝 2012-2-10 19:39:45
9#
最初的理想 发表于 2012-2-10 18:47
受教了,

: ) 互相学习~看到你考试通过了,恭喜~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马