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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© e咕噜 中级黑马   /  2015-7-28 22:27  /  236 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求单例设计模式,懒汉式和饿汉式的详解

2 个回复

倒序浏览
本帖最后由 相濡、彼岸 于 2015-7-28 23:01 编辑

饿汉式:线程安全,三步:一、创建一个静态并且私有的本类对象, 二、将构造函数私有化, 三、对外提供一个方法,可以访问到本类中创建的对象。无论有多少类要使用这个类中的对象,对象是唯一的,就是之前创建的本类对象,是固定的。
懒汉式:是线程不安全的, 一、 因为 我们是在类中创建了一个静态并私有的类的成员变量,用来接收我们创建的对象, 二、将构造函数私有化  
  三、我们对外提供的方法中创建本类对象,有之前创建的变量接收。   这样就存在线程安全问题了,加入我多个线程同时进入到了这个方法中,每个线程都会创建一个对象,达不到对象唯一的目的。  如果用懒汉式,就需要使用到同步函数 或者是同步代码块 ,建议使用同步代码块, 因为使用同步函数每次都需要判断锁,影响了效率。在方法中增加同步代码块,当第一条线程进来的时候,给同步代码块上锁,并判断变量为null, 但是还没有创建对象就等待了,也就是执行权被别的线程抢走了,那么比如说第二条线程进来了,变量为null,再判断锁,发现锁上了,那么第二条线程进不到同步代码块里面,那么此时第一条线程抢到了执行权,继续往下走,创建本类对象,用变量接收。当第三条线程进入方法的时候,判断变量不为null了,就不会再去判断锁了。达到了线程的安全,并且也保证了对象的唯一。




好长时间没有看基础了,个人理解,老师的视频里面都有讲到,自己多练习,多思考。
回复 使用道具 举报
class Single
{
        private Single(){}
        private Single s = new Single();
        public static Single getInstance()
{
return s;
}
}//饿汉式,即先初始化对象(Single类一进内存,就已经创建好对象)


class Single
{  //三部曲
        private Single s=null;       
private Single (){}

        public static Single getInstance()
{
   if(s==null)
            s = new Single();
return s;
}
}//懒汉式(对象的延时加载),即对象是方法被调用时才初始化(Single类进内存,对象还未存在,只有调用了getInstance()方法时,才建立对象)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马