精华内容
下载资源
问答
  • 以下会出现死循环的是
    2020-10-14 21:09:01

    while中使用continue出现死循环的情况

    下面就是continue在while中使用出现死循环的情况:

    	//求100以内的含7的数字
    	int i = 1;
    	while(i < 100) {
    		if(i /10 == 7||i %10 == 7 || i % 7 ==0) {
    			continue;
    		}
    		i++;
    		System.out.println(i);
    		
    	}
    

    解决方法:

    将 i++ 添加到 if 之前

    		//求100以内的含7的数字
    		int i = 0;
    		while(i < 100) {
    			i++;
    			if(i /10 == 7||i %10 == 7 || i % 7 ==0) {
    				continue;
    			}
    			System.out.println(i);
    			
    		}
    
    更多相关内容
  • 作者:磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 面试合集:https://gitee.com/mydb/interview HashMap 死循环是一个比较常见、比较经典的问题,在日常的面试中出现的...

    7ea10c9444a7efee5a09d4264391a122.png

    作者:磊哥

    来源 | Java面试真题解析(ID:aimianshi666)

    转载请联系授权(微信ID:GG_Stone)

    面试合集:https://gitee.com/mydb/interview

    HashMap 死循环是一个比较常见、比较经典的问题,在日常的面试中出现的频率比较高,所以接下来咱们通过图解的方式,带大家彻底理解死循环的原因。

    前置知识

    死循环问题发生在 JDK 1.7 版本中,造成这个问题主要是由于 HashMap 自身的运行机制,加上并发操作,从而导致了死循环。在 JDK 1.7 中 HashMap 的底层数据实现是数组 + 链表的方式,如下图所示:05f7b8cc3289acc8a297baac6e6ef4c2.png而 HashMap 在数据添加时使用的是头插入,如下图所示:d4176b4c4435d5f02a29c8b5bdc01af2.pngHashMap 正常情况下的扩容实现如下图所示:59e2a37bef019a920ed03e10a1b80c2a.png旧 HashMap 的节点会依次转移到新 HashMap 中,旧 HashMap 转移的顺序是 A、B、C,而新 HashMap 使用的是头插法,所以最终在新 HashMap 中的顺序是 C、B、A,也就是上图展示的那样。有了这些前置知识之后,咱们来看死循环是如何诞生的?

    死循环执行步骤1

    死循环是因为并发 HashMap 扩容导致的,并发扩容的第一步,线程 T1 和线程 T2 要对 HashMap 进行扩容操作,此时 T1 和 T2 指向的是链表的头结点元素 A,而 T1 和 T2 的下一个节点,也就是 T1.next 和 T2.next 指向的是 B 节点,如下图所示:2d74b282d530c3d2eeb2ccdf5e26ad7c.png

    死循环执行步骤2

    死循环的第二步操作是,线程 T2 时间片用完进入休眠状态,而线程 T1 开始执行扩容操作,一直到线程 T1 扩容完成后,线程 T2 才被唤醒,扩容之后的场景如下图所示:307b2f659636ca3222a419c02df59389.png从上图可知线程 T1 执行之后,因为是头插法,所以 HashMap 的顺序已经发生了改变,但线程 T2 对于发生的一切是不可知的,所以它的指向元素依然没变,如上图展示的那样,T2 指向的是 A 元素,T2.next 指向的节点是 B 元素。

    死循环执行步骤3

    当线程 T1 执行完,而线程 T2 恢复执行时,死循环就建立了,如下图所示:466f2eaf1f738dd0c3afacba1b5f239c.png因为 T1 执行完扩容之后 B 节点的下一个节点是 A,而 T2 线程指向的首节点是 A,第二个节点是 B,这个顺序刚好和 T1 扩完容完之后的节点顺序是相反的。T1 执行完之后的顺序是 B 到 A,而 T2 的顺序是 A 到 B,这样 A 节点和 B 节点就形成死循环了,这就是 HashMap 死循环导致的原因。

    解决方案

    HashMap 死循环的常用解决方案有以下 3 个:

    • 使用线程安全容器 ConcurrentHashMap 替代(推荐使用此方案)。

    • 使用线程安全容器 Hashtable 替代(性能低,不建议使用)。

    • 使用 synchronized 或 Lock 加锁 HashMap 之后,再进行操作,相当于多线程排队执行(比较麻烦,也不建议使用)。

    总结

    HashMap 死循环发生在 JDK 1.7 版本中,形成死循环的原因是 HashMap 在 JDK 1.7 使用的是头插法,头插法 + 链表 + 多线程并发 + HashMap 扩容,这几个点加在一起就形成了 HashMap 的死循环,解决死锁可以采用线程安全容器 ConcurrentHashMap 替代。

    是非审之于己,毁誉听之于人,得失安之于数。

    公众号:Java面试真题解析

    42312ef596f34e645966015524884e94.gif

    往期推荐

    00ce7c80f80ca29a58aed260c774dde0.png

    面试突击15:说一下HashMap底层实现?及元素添加流程?


    8cd8f11d8eeb586b957307df8294be32.png

    面试突击14:方法重写和方法重载有什么区别?


    32e3ebd9c7367621ecacf6b39b6aa48a.png

    面试突击13:方法优先调用可选参数还是固定参数?


    53f6388fc481d5ebb933cd0337ccc735.png

    面试系列12:为什么不同返回类型不算方法重载?


    展开全文
  • ) //第一次for循环i=1。第二次循环i=2 { switch(i%3) { case 0:k++; case 1:k++;break; //case2跳出switch循环 case 2:k++;continue; //case2继续switch循环 } i+=1; //i自增为2 } printf("%d\...
    #include<stdio.h>
    main()
    {
    	int i=1,k=0;
    	for(;i<6;)		//第一次for循环i=1。第二次循环i=2
    	{
    		switch(i%3)
    		{
    		case 0:k++;
    		case 1:k++;break;		//case2跳出switch循环
    		case 2:k++;continue;		//case2继续switch循环
    		}
    		i+=1;		//i自增为2
    	}
    	printf("%d\n",k);
    }
    

    如果我们通过修改程序可以显而易见找到进入死循环位于case2

    #include<stdio.h>
    main()
    {
    	int i=1,k=0;
    	for(;i<6;)			//第一次for循环i=1。第二次循环i=2
    	{
    		switch(i%3)		
    		{
    		case 0:k++;printf("k=%d\n",k);
    		case 1:k++;printf("k=%d\n",k);break;		//case2跳出switch循环
    		case 2:k++;printf("k=%d\n",k);if(k<10)continue;		//case2继续switch循环
    		}
    		i+=1;	//i自增为2
    		printf("i=%d\n",i);
    	}
    }
    

    运行结果:
    在这里插入图片描述

    展开全文
  • 死循环的使用:死循环并非一无是处,C语言中死循环while true或 while 1 是单片机编程的普遍用法,死循环一直运行等待中断程序发生,然后去处理中断程序。在Python中,我们也可以利用死循环完成特定功能。下面这段...

    何为死循环:在编程中,一个无法靠自身的控制终止的循环被称为死循环。

    死循环的使用:死循环并非一无是处,C语言中死循环while true或 while 1 是单片机编程的普遍用法,死循环一直运行等待中断程序发生,然后去处理中断程序。

    在Python中,我们也可以利用死循环完成特定功能。

    下面这段死循环程序可以用来一直捕捉输入异常。

    whileTrue:try:

    x=int(input("Please enter a number:"))break

    exceptValueError:print("Oops,that was no valid number. Try again ...")

    后测循环:

    假设程序需要用户输入一个非负数

    如果输入错误,重新提示用户输入直到得到一个有效值。

    伪代码如下:

    重复执行以下语句

    接受外部输入数据

    直到外部输入为负值为止

    循环不断接收输入,直到接受到合法的值为止

    条件判断在循环体后面,称之为后测循环(即前面提到过的“直到型循环”)

    后测循环至少执行一次循环体

    后测循环实现:

    Python没有后测循环语句,但可以通过while间接实现。

    思想是设计一个循环条件,直接进入循环体,循环至少执行一次,相当于后测循环。

    number=-1

    while number<0:

    number=eval(input("Enter a positive number:"))

    break语句也可以用来实现后测循环:

    whileTrue:

    number=eval(input("Enter a positive number:"))if x>=0:break#如果数字有效则跳出循环

    #while语句体永远执行,if条件决定循环退出

    另外:if语句体只包含一个语句时,break可以跟在if同一行。这种结构被称为循环出口。

    #后测循环代码1:

    在前面的while版本的后测循环代码中添加一个if语句,使得在有效输入时不显示警告。

    修改代码如下:

    number=-1

    while number<0:

    number=eval(input("Enter a positive number:"))if number<0:print("The number you entered was not positive")

    在上面这段代码中,合法性检验重复了两次。

    #后测循环代码2:

    限定合法性检验只判断一次,需为if添加匹配的else语句来实现

    修改后的代码如下:

    whileTrue:

    number=eval(input("Enter a positive number:"))if x>=0:break ##如果数字有效则跳出循环

    else:print("The number you entered was not positive")

    半路循环:运用break中途退出循环,循环出口在循环体中部,被称为半路循环

    whileTrue:

    number=eval(input("Enter a positive number:"))if x>=0:break #跳出循环

    print("The number you entered was not positive")

    半路循环-哨兵:半路循环退出实现哨兵循环的一般模式:

    While True:

    Get next data itemif the item is the sentinel :breakprocess the item

    我们注意:break语句是一种很方便的设计,但是,任何算法都可以使用不包含break语句的其他语句来实现

    在程序中是否使用break语句,跟个人编程风格有关。

    应避免在一个循环体内使用过多的break语句。因为当循环有多个出口的时候,程序逻辑就显得不够清晰了。

    展开全文
  • JDK1.7中HashMap的多线程并发出现死循环问题 没错!又是HashMap这个鬼东西,今天与同事讨论到了:多线程下HashMap在jdk1.7中形成环形链表死循环问题。借此机会我们这次再看一遍原因,加深印象。以下讨论基于jdk1.7的...
  • python中死循环

    千次阅读 2020-11-24 00:16:58
    死循环当一个循环可以执行无限次,也就是没有终止条件,我们称这个循环是死循环。 编写死循环程序实际上是不对的,一旦写出来一个程序运行后发现是死循环,一定要立即终止程序的运行! 用python实现一个...
  • HashMap进行put操作引起死循环

    千次阅读 多人点赞 2020-07-03 13:22:33
    HashMap进行put操作引起死循环? 最近在磕《java并发编程艺术》,在看到第六章的时候出现了下面这段我不是很理解的东西,如下 《java并发编程艺术》截取 为什么要使用ConcurrentHashMap 在并发编程中使用HashMap...
  • HashMap并发导致死循环

    千次阅读 2019-03-14 09:39:40
    为何出现死循环简要说明  HashMap是非线程安全的,在并发场景中如果不保持足够的同步,就有可能在执行HashMap.get时进入死循环,将CPU的消耗到100%。  HashMap采用链表解决Hash冲突。因为是链表结构,那么就很...
  • 死循环经典案列
  • 多线程下的HashMap死循环问题详解

    千次阅读 2020-10-21 18:03:29
    小伙伴们大家好呀,今天看技术博文的时候看到一个很有意思的问题,就如标题所示------》在多线程的情况下关于HashMap的死循环问题,还记我在刚学JavaSE时候,看到过这个问题,当时的知识储备不够,没有深究,今天来...
  • 相关问题(2分)两个卡诺循环如图4所示,它们的循环面积相等,则:: 卡诺循环 循环 面积 循环 功可视分析的运行过程可看做是( )的循环过程: 可视分析 运行 过程 循环 过程 数据 知识 数据东方舞最早是也作为一种宗教仪式...
  • 需求最近在做一个工具(具体是什么工具,稍后再透露)的时候,我有一个需要探测代码中是否包含死循环的需求,而不管它有没有,我都想要我自己的代码能够继续执行下去。停机问题首先需要说明的是,理论上,没有通用的...
  • java while (true) 死循环

    千次阅读 2021-02-12 19:31:24
    为了跳出循环循环体内部要用break语句来跳出。例如,可以在循环体内部用if来判断,if(x==5)break;用exit也可以跳出,此时表示了函数直接返回​1、在java网络通讯的程序里原本有一段是这样的:while(in.readLine()!=...
  • 目录 一、初步诊断: 1、死循环: 2、死锁: 二、进一步定位分析: ...如果主线程出现死循环,那么windows将不能从消息队列中取出消息,并进行处理,所以出现卡死现象。为了验证是这个原因导致
  • 但要防止程序算法中可能导致死循环的情况,而且有的死循环还不好察觉。比如下面这个例子,算法极容易认为是50,实际上是无穷大的一个死循环。public class cyctest {/*** @param args the command line arguments*/...
  • HashMap 是非线程安全的,在多线程处理场景下,严禁使用。...因为在高并发情况下,HashMap在一些操作上存在问题,如死循环问题,导致CPU使用率较高。 下面来看下怎么复现这个问题。如下代码所示,我们创建10...
  • Java中 终止线程通常意味着在线程处理任务完成之前停掉正在做...原因是:stop()是立即终止,导致一些数据被到处理一部分就被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据,...
  • HashMap在jdk1.8中也会死循环

    万次阅读 2019-03-03 18:43:19
    jdk1.7版本中多线程同时对HashMap扩容时,引起链表死循环,尽管jdk1.8修复了该问题,但是同样在jdk1.8版本中多线程操作hashMap时仍然引起死循环,只是原因不一样。 示例代码 package com.gsonkeno.interview; ...
  • Win10开机死循环重启解决方法

    万次阅读 2021-07-28 06:22:25
    当遇到Win10系统无法启动,开机后又自动重启这样往复的重启另人崩溃,这就是win10开机死循环重启了,那么这时用户该如何解决呢?下面我们就来看看当我们遇上这样的问题时该如何解决。以下小编使用手动修复和重置...
  • 死循环无法退出,没有任何作用。

    千次阅读 2020-12-17 11:31:45
    【判断题】使用 Python 列表的方法insert( )为列表插入元素时改变列表中插入 位置之后元素的索引。【多选题】在分支结构的条件表达式中,常用的运算符为( )【判断题】已知 x 为非空列表,那么执行语句 x[0] = 3之后,...
  • 子线程死循环里加休眠,跳出死循环,执行while后面的语句? 子线程死循环里加打印,跳出死循环,执行while后面的语句? 问题代码: package com.demo; import java.util.concurrent.TimeUnit; /**...
  • 这边使用arthas去排查由于死循环引起的cpu升高问题。 问题: 例如在报错的时候打印日志时日志不全或者是没有给出错误状态码,那正常想到的就是改代码加日志重新部署?但如果是线程池的问题或者是一些不易复现,重启...
  • 在编程中,各种各样的数据需要处理,避免不了使用各种循环,在使用循环时如果使用不恰当就变成死循环,就比如while循环 循环就是把所选数据中的每一条数据遍历一次 如以下例子中, 我先是声明了一个变量i ,并...
  • JDK8以前的HashMap,多线程扩容的时候可能会出现死循环,这个问题在JDK8得到了修复。本翔看了大半天JDK7HashMap扩容源码找这个问题,所以写篇博客记录记录。 源码 先来看看JDK7的HashMap扩容相关源码。 //扩容 ...
  • PostgreSQL运维案例--递归查询死循环

    千次阅读 2020-05-03 16:46:24
    一、问题背景 某日,开发同事上报一sql性能问题,一条查询好似一直跑不出结果,查询了n小时,还未返回结果。比较诡异的是同样的sql,相同的数据量,相同的表大小,且在...最终发现是递归查询出现死循环以下内...
  • vue路由守卫死循环及next原理解释

    千次阅读 2022-04-22 20:21:14
    ​ 在使用vue路由守卫的beforeEach方法时可能会出现无限递归,也就是死循环的问题,根本原因在于next()方法在不合适的地方错误调用所致,先来看一下官方对next()方法的解释: beforeEach方法体: router.beforeEach...
  • 关于fscanf乱码和死循环的解决方法

    千次阅读 2019-07-18 11:51:07
    2.出现死循环的情况。 以下为解决方法: 首先,数据乱码的问题,目前发现2种情况: 1.fscanf函数参数2的格式与文本不符,主要出现在中英文符号的问题上。 2.代码编码和txt文本的编码不符。 代码我用的是ANSI,但是不...
  • 什么是jstack jstack的主要作用是查看或者导出...死循环 当线程停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道线程的执行过程中在后台做了哪些事,在等待哪些资源造成的卡顿。 使用方法 命令格式 jstack

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,965
精华内容 45,586
关键字:

以下会出现死循环的是