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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 想做开发 中级黑马   /  2014-8-27 19:34  /  1629 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 想做开发 于 2014-8-28 10:05 编辑

编写一个延迟加载的单例设计模式时出现这个异常Exception in thread "main" java.lang.StackOverflowError。查了一下说是栈溢出问题。有懂的可以解释一下么。
  1. package com.itheima;

  2. /**
  3. * 7、 编写一个延迟加载的单例设计模式。
  4. * @author
  5. *
  6. */
  7. class single{
  8.         
  9.         private single(){}
  10.         private static single s=null;
  11.         public static single getInstance(){
  12.              if(s==null){
  13.                  synchronized(single.class)//同步锁
  14.                    {
  15.                         if (s==null){
  16.                                 s=single.getInstance();
  17.                         }
  18.                     }
  19.               }
  20.                  return s;
  21.         }
  22. }


  23. public class Test7 {
  24.         

  25.         public static void main(String[] args) {
  26.                
  27.            single ss=single.getInstance();
  28.         }

  29. }
复制代码


评分

参与人数 1黑马币 +5 收起 理由
天黑偷牛 + 5 多学,多问

查看全部评分

17 个回复

倒序浏览
最好把代码发出来,一般出现这个问题是代码里有死循环,或是递归数太大了~
回复 使用道具 举报
是不是方法内部调用自己了
回复 使用道具 举报
看看代码
回复 使用道具 举报

求指教  
回复 使用道具 举报
笑脸迷人 发表于 2014-8-27 21:30
最好把代码发出来,一般出现这个问题是代码里有死循环,或是递归数太大了~ ...

刚学不就  有些地方不是很懂
回复 使用道具 举报
  1. /**
  2. * 7、 编写一个延迟加载的单例设计模式。
  3. *
  4. * @author
  5. *
  6. */
  7. class single
  8. {

  9.         private single(){}
  10.         private static single s = null;
  11.         public static single getInstance()
  12.         {
  13.                 if (s == null)
  14.                 {
  15.                         synchronized (single.class)// 同步锁
  16.                         {
  17.                                 if (s == null)
  18.                                 {
  19.                                         //问题出在这句,你这样是循环调用了,直到内存耗完为止
  20.                                         //应该写出:s=new Single();
  21.                                         s = single.getInstance();
  22.                                 }
  23.                         }
  24.                 }
  25.                 return s;
  26.         }
  27. }
  28. public class Test7
  29. {
  30.         public static void main(String[] args)
  31.         {
  32.                 single ss = single.getInstance();
  33.         }
  34. }
复制代码
回复 使用道具 举报
HKing 中级黑马 2014-8-28 09:56:03
8#
楼上说的对,顶下!
回复 使用道具 举报
回复 使用道具 举报
   7楼正解,你不断调用自己的getInstance方法却没有跳出条件,最后就是栈溢出了。。
回复 使用道具 举报
ximi 中级黑马 2014-8-28 12:07:50
11#
回复 使用道具 举报
学习了。
回复 使用道具 举报
打酱油路过,,学习学习
回复 使用道具 举报
17行, s=single.getInstance();
这个是在调用类里面的静态方法,然后进去又调进去又调,
然后栈里面存了N个方法。
然后就内存满了,也就是死循环导致的内存溢出,
而且你的类名要注意规范,单词的首字母都要大写,跟成员变量区别开来以示区分。
回复 使用道具 举报
本帖最后由 【灰太狼】 于 2014-8-30 20:32 编辑

17行有问题,既然你是单例模式,创建对象为什么还要用递归呢,直接new就ok了嘛,这里是无限递归了,所以一直创建对象,一直创建到占内存都满了,死递归~
回复 使用道具 举报
【灰太狼】 发表于 2014-8-30 20:30
17行有问题,既然你是单例模式,创建对象为什么还要用递归呢,直接new就ok了嘛,这里是无限递归了,所以一 ...

恩恩  谢谢了
回复 使用道具 举报

7# 的说得太好了,学习了
回复 使用道具 举报
恩,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马