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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黎阳05 中级黑马   /  2013-5-2 15:49  /  2125 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黎阳05 于 2013-5-2 20:01 编辑

谁能告诉我懒汉式和饿汉式的区别。。。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

10 个回复

倒序浏览
懒汉式是延时加载,他是在需要的时候才创建对象,如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
         

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
懒汉式:对象是方法被调用时,才初始化,
叫对象的延时加载。线程不安全。

饿汉式:先初始化对象。 线程安全。
回复 使用道具 举报
懒汉式:对象是方法被调用时,才初始化
饿汉式:类一进内存,就已经创建好了对象
回复 使用道具 举报
饿汉式:
        public class Singleton{
            private static Singleton singleton = new Singleton ();
            private Singleton (){}
            public Singleton getInstance(){return singletion;}
       }
懒汉式:
       public class Singleton{
            private static Singleton singleton = null;
            public static synchronized synchronized getInstance(){
                 if(singleton==null){
                     singleton = new Singleton();
                 }
                return singleton;
            }
       }

比较:
      饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
    懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
    推荐使用第一种
回复 使用道具 举报
补充:懒汉式没有加私有的构造函数
从实现方式来讲他们最大的区别就是懒汉式是延时加载,
他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,
使用的场合根据具体环境和个人习惯吧.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
  饿汉式 是刚开始 就建立了对象  懒汉式 就是等到你用的时候才建立了对象  楼上正解 建议饿汉式
回复 使用道具 举报
饿汉式:类一进内存,就已经创建好了对象。线程是安全的
懒汉式:类进内存,对象还没有存在,只有方法被调用时,才建立对象,也叫对象的延时加载。如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的,效率没饿汉式高
      

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
噢噢、原来是这样的!!
回复 使用道具 举报
/*饿汉式
类一进内存,就已经创建好了对象。线程是安全的 */
class Single
{
        private  static final Single s = new Single();
        private Single()
        public static Single getInstance()
        {
                return s;
        }
}

/*懒汉式
在访问多线程时会产生安全隐患
懒汉式加同步会比较低效
用双重判断的形式能解决效率问题,加同步使用的锁是哪一个,该类所属的字节码对象。
*/
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();
                    return s;
       
               
                }

               
                }
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马