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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 汗血黑马 于 2014-3-22 16:51 编辑

请问这是死锁问题吗?请详细讲解一下为什么?
class Jsuan
{
        public static void main(String[] args)//程序主函数
        {
                save();//定义方法
                System.out.println("Hello World");//打印字符串
        }
        public static void save()//定义方法
        {
                int sum =0 , count =0, day =2;//定义三个变量
                while(sum<1)//循环语句
                {
                        count ++;//count变量自增一次。
                        if(day ==7)//判断语句,如果变量为7,则执行下面代码
                        {
                                //sum = sum >>1;//变量左移一位。
                                //day = 1;//day变量赋值为1.
                        }
                        else//不满足day== 7,则执行下面代码、
                        //sum = sum+10;//变量和10做加法运算。
                        day++;//变量自增一次
                }
                System.out.print(count);//在控制台打印conut.
                System.out.print(count);
        }
}

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

11 个回复

倒序浏览
我只知道线程同步中会出现锁。这种怎么看都是一个死循环。
回复 使用道具 举报
追逐 发表于 2014-3-22 08:17
我只知道线程同步中会出现锁。这种怎么看都是一个死循环。

呵呵,你的说法对,能否解释为什么会死循环了?{:2_37:}
回复 使用道具 举报
貌似多线程的时候回发生死锁吧,你这是while{}循环的条件sum<1一直满足,造成的死循环
回复 使用道具 举报
汗血黑马 发表于 2014-3-22 09:39
呵呵,你的说法对,能否解释为什么会死循环了?

呵呵。能对你有所帮助就行。大家共同学习。共同进步。
回复 使用道具 举报
同意LS的,这是个死循环,缺少了结束循环的语句(break)与让循环满足判断条件的语句(就是那些被//的代码)。
死锁: 至少要是多线程,同时通常要有synchronized或Lock等。
回复 使用道具 举报
死循环出现的问题就2种。
1.递归:方法调用自己的方法,不停调用不停运行导致内存卡死,最后导致死机,这个是死循环。
2.循环语句,不停的循环,没有结束循环的条件而导致的死循环,同样会占用内存,最后导致死机。
回复 使用道具 举报
追逐 高级黑马 2014-3-22 15:44:53
8#
汗血黑马 发表于 2014-3-22 09:39
呵呵,你的说法对,能否解释为什么会死循环了?

因为sum变量的值永远是小于1的,因为你把对他的操作注释了。而day变量无论是大于7还是小于7都是可以输出的。而因为sum的值永远小于1.所以循环的条件永远存在。然后这个你就可以把他当成死循环了。因为它是永远满足循环条件的
回复 使用道具 举报
追逐 发表于 2014-3-22 15:44
因为sum变量的值永远是小于1的,因为你把对他的操作注释了。而day变量无论是大于7还是小于7都是可以输出 ...

可是程序一次都没有打印数据,而且光标停在那里,可否解释下
回复 使用道具 举报
本帖最后由 追逐 于 2014-3-22 17:04 编辑
  1. class Jsuan
  2. {
  3.         public static void main(String[] args)//程序主函数
  4.         {
  5.                 save();//定义方法
  6.                 System.out.println("Hello World");//打印字符串
  7.         }
  8.         public static void save()//定义方法
  9.         {
  10.                 int sum =0, count = 0, day = 2;//定义三个变量
  11.                 while(sum < 1)//循环语句
  12.                 {
  13.                         count++;//count变量自增一次。
  14.                         if(day == 7)//判断语句,如果变量为7,则执行下面代码
  15.                         {
  16.                                 //sum = sum >>1;//变量左移一位。
  17.                                 day = 1;//day变量赋值为1.
  18.                         }
  19.                         else//不满足day== 7,则执行下面代码、
  20.                         //sum = sum+10;//变量和10做加法运算。
  21.                         day++;//变量自增一次
  22.                                                 System.out.println(count);//在控制台打印conut.
  23.                 }
  24.                
  25.                 System.out.print(count);
  26.         }
  27. }
复制代码
因为你没有在循环里面写输出语句。而循环又是一个死循环。它只是在里面不停的转。直到你的循环条件不满足了跳出循环才会执行while循环外的语句。你可以再循环里面加上循环语句,就会无限的打印下去了。你也可以加个限制语句。让循环条件不满足,跳出循环打印循环以外的输出语句
汗血黑马 发表于 2014-3-22 16:50
可是程序一次都没有打印数据,而且光标停在那里,可否解释下

这样就可以了
回复 使用道具 举报
没有Thread类怎么可能产生死锁呢  死锁是同步嵌套同步 锁不同产生的
回复 使用道具 举报
while的判断条件一直没有变,要么就进不去while,要么一进去就出不来了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马