黑马程序员技术交流社区

标题: 栈溢出 谁懂??? [打印本页]

作者: 想做开发    时间: 2014-8-27 19:34
标题: 栈溢出 谁懂???
本帖最后由 想做开发 于 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. }
复制代码



作者: 笑脸迷人    时间: 2014-8-27 21:30
最好把代码发出来,一般出现这个问题是代码里有死循环,或是递归数太大了~
作者: ソi苆僞lè袮    时间: 2014-8-27 22:09
是不是方法内部调用自己了
作者: Franklin    时间: 2014-8-27 22:30
看看代码
作者: 想做开发    时间: 2014-8-28 09:26
Franklin 发表于 2014-8-27 22:30
看看代码

求指教  
作者: 想做开发    时间: 2014-8-28 09:28
笑脸迷人 发表于 2014-8-27 21:30
最好把代码发出来,一般出现这个问题是代码里有死循环,或是递归数太大了~ ...

刚学不就  有些地方不是很懂
作者: happymouse    时间: 2014-8-28 09:42
  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
楼上说的对,顶下!
作者: 想做开发    时间: 2014-8-28 10:05
happymouse 发表于 2014-8-28 09:42

多谢了哈
作者: 怀念黑海岸    时间: 2014-8-28 11:30
   7楼正解,你不断调用自己的getInstance方法却没有跳出条件,最后就是栈溢出了。。
作者: ximi    时间: 2014-8-28 12:07
happymouse 发表于 2014-8-28 09:42

回答的不错哦
作者: Franklin    时间: 2014-8-29 22:24
学习了。
作者: 不服™け你咬我    时间: 2014-8-29 22:49
打酱油路过,,学习学习
作者: EDDY_Liang    时间: 2014-8-30 17:50
17行, s=single.getInstance();
这个是在调用类里面的静态方法,然后进去又调进去又调,
然后栈里面存了N个方法。
然后就内存满了,也就是死循环导致的内存溢出,
而且你的类名要注意规范,单词的首字母都要大写,跟成员变量区别开来以示区分。

作者: 【灰太狼】    时间: 2014-8-30 20:30
本帖最后由 【灰太狼】 于 2014-8-30 20:32 编辑

17行有问题,既然你是单例模式,创建对象为什么还要用递归呢,直接new就ok了嘛,这里是无限递归了,所以一直创建对象,一直创建到占内存都满了,死递归~
作者: 想做开发    时间: 2014-9-1 08:40
【灰太狼】 发表于 2014-8-30 20:30
17行有问题,既然你是单例模式,创建对象为什么还要用递归呢,直接new就ok了嘛,这里是无限递归了,所以一 ...

恩恩  谢谢了
作者: 菜鸟一号    时间: 2014-9-1 09:38
happymouse 发表于 2014-8-28 09:42

7# 的说得太好了,学习了
作者: 彭卫红    时间: 2014-9-1 10:13
恩,学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2