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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

懒汉式是不安全的,这是因为如果有两个线程同时进入到Single2类中的getInstance()方法就会返回该类的两个实例对象,这就违背了单例模式的设计初衷。
那么第二种有安全隐患的方法有没有改进方法呢,当然看如下代码:
class Single3
{
        private static Single s = null;
        private Single3(){}
        public static  Single getInstance()
        {
                if(s==null)
                {
                        synchronized(Single3.class)
                        {
                                if(s==null)
                                        s = new Single3();
                        }
                }
                return s;
        }
}
将创建对象的代码块加上锁,并且这个是一个静态方法,拥有这个锁的对象是这个类本身,即Single.class(代表该类的字节码)。并且这个getInstance方法为什么进行两次“s==null”判断呢?是因为提高效率,因为在执行到第一个“s==null”的判断语句时,不满足条件的将不会进入if语句体内,只有极少数同时执行了这个判断语句的线程才会进入,再对这一小部分进行锁的判断(判断锁很耗费资源,因为我写了个while(true)循环试了下,cpu很快就达到%90了。。),这便提高了效率。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马