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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*单例模式*/
//饿汉式
class Single{
        private static final Single s=new Single();
        private Single(){}
        public static Single getInstance(){
                return s;
        }
}


分析:之所以s加了final,这样更严谨,由于初始化成员变量时就new了实例化对象,所以称为饿汉式。


//懒汉式
class Single
{
        private static Single s=null;
        private Single(){}
        public static Single getInstance(){
                if(s==null){
                        synchronized(Single.class){
                                if(s==null){
                                        s=new Single();
                                }
                        }
                }
        }
}

分析:由于一开始s为空,所以称为懒汉式。第一次s为空进入if,后进入同步代码块。如果发现此时再进来一个线程,那么由于有Single.class作为锁,那么此时第一次进来的线程不结束,第二次的是进不来同步代码块的。
那么第一次的结束同步代码块后释放执行权,第二次进来卡到同步的那个线程则进入里面。结果此时s已经有了实例化对象,所以s!=null,所以不会往里走实例化了。
然后如果此时又来了新的线程,那么外面的s==null就可以阻止了,因为s已经被实例化了。

0 个回复

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