首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 中为什么不推荐在 while 循环中使用 sleep()

前言最近逛 CSDN 看到一篇文章,文章大意是说为什么在循环中不推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...可能会导致忙等待 // 如 FLAG 变量状态未改变 那么线程可能一直循环,并不断进行线程挂起和唤醒原因是否正确主要原因和原文博主所说有很大的关系但不完全正确:我们都知道 Java 线程实际对应着操作系统中的一个线程...比如微服务体系中,客户端上报实例状态,或者服务端检测客户端状态都会使用定时轮询的机制。...比如一些用户登录场景,当用户登录状态改变时,发送登录事件进行后续处理,比如登录通知等等等待和唤醒等待和唤醒机制一般适用于等待时间较长的场景,因为等待和唤醒是一个性能消耗比较大的操作;在等待时间不是很长的场景可以使用轮询机制...在 Java AQS 等待获取锁和线程池任务为空等待新任务时,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。

1.6K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    什么在代码中要求我们使用LocalDateTime而不是Date?

    作者:何甜甜在吗 来源:http://1t.click/a7Gm 在项目开发过程中经常遇到时间处理,但是你真的用对了吗,理解阿里巴巴开发手册中禁用static修饰SimpleDateFormat...通过阅读本篇文章你将了解到: 为什么需要LocalDate、LocalTime、LocalDateTime【java8新提供的类】; java8新的时间API的使用方式,包括创建、格式化、解析、计算、...# 为什么需要LocalDate、LocalTime、LocalDateTime 1.Date如果不格式化,打印出的日期可读性差 Tue Sep 10 09:34:04 CST 2019 2.使用SimpleDateFormat...在多并发情况下使用SimpleDateFormat需格外注意 SimpleDateFormat除了format是线程不安全以外,parse方法也是线程不安全的。...calb中中属性设置cal c、返回设置好的cal对象 但是这三步不是原子操作 多线程并发如何保证线程安全 - 避免线程之间共享一个SimpleDateFormat对象,每个线程使用时都创建一次SimpleDateFormat

    1.1K20

    Leetcode No.141 环形链表

    为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。...细节 为什么我们要规定初始时慢指针在位置 head,快指针在位置 head.next,而不是两个指针都在位置 head(即与「乌龟」和「兔子」中的叙述相同)?...观察下面的代码,我们使用的是 while 循环,循环条件先于循环体。由于循环条件一定是判断快慢指针是否重合,如果我们将两个指针初始都置于 head,那么 while 循环就不会执行。...因此,我们可以假想一个在 head 之前的虚拟节点,慢指针从虚拟节点移动一步到达 head,快指针从虚拟节点移动两步到达 head.next,这样我们就可以使用 while 循环了。...当然,我们也可以使用 do-while 循环。此时,我们就可以把快慢指针的初始值都置为 head。 三、代码 /** * Definition for singly-linked list.

    37420

    线性表--顺序表--循环链表(五)

    和单链表唯一的区别就是,尾结点指向头结点,因此循环链表中没有NULL指针。...而涉及遍历操作时,其终止条件就不再是像非循环链表那样判别p或p->next是否为空,而是判别它们是否等于某一指定指针,如头指针或尾指针等,在单链表中,从一已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其它结点...} 至于循环链表的增删查改,都同单链表一样,我们就不在多赘述,只是在遍历这块有一定小猫腻。...都 是头结点惹的祸,第一种差一个结点,第二章根本就不去,解决方法是,我们可以进循环之前,把头节点数据先输出,这样显然有点麻烦,代码看着有点笨拙,这时我们就应该想到被我们丢弃的do—while循环。...=Phead); } 看,do—while天然的无条件执行一次,完美的为我们解决了这个难题。 5.如何判断是否为循环链表(重点) 首先来说说这种循环链表: ?

    50630

    【力扣3题】快乐数&有效的字母异位词&字符串中的单词数

    ); 那我又要问为什么会不是快乐数呐?...传送门:快慢指针 这个快慢指针和链表那里判断环形链表有点像,因为本题也是可以通过判断是否有循环来解决 有人称作他为隐式链表,它们之间的next在此题用fun(n),该函数用来求每一十进制位的平方和来代替...(next是连接两个结点的枢纽,其实fun(n)函数也是本身和他平方和数之间的枢纽) 如果有循环就是就是说明这个说明快指针和慢指针在某一个点会相遇 如果没有循环(平方和最后可以为1),快指针就会遇到...0; } } n = fun(n); } printf("该数是快乐数\n"); return 0; } 我想说: 快慢指针其实使用范围不局限于单链表,隐式链表同样适用。...int main() { char str[] = " can you do it?

    49940

    二十万分之一几率:if语句变do-while卡死问题分析|得物技术

    语句的代码竟变成了一个do-while语句,形成了死循环最终导致主线程卡死。...二、问题分析if和do-while两个完全不相干的语句为什么出现互相转化的情况?...2.2.3小结至此,我们已经知晓为什么if语句会变成毫不相干的do-while语句,同时也排除了R8的嫌疑,接下来就是要继续回溯transform,排查为什么class字节码中if语句指向的标签的声明会丢失...最终发现异常methodNode的指令链表中,jumpNode持有的labelNode和链表中的labelNode不是同一个对象(正常情况下是)。...这里使用我们正常运行时使用的forkjoinpool,并发死循环执行前面提到的methodNode复制过程,模拟正常构建过程的并发度,最终得出结果是大约每执行20w次可以复现一次问题,除以我们App中相关方法的量级

    6910

    Java 基础(六):数组

    循环 老生常谈的一个控制流程了,我们在是使用数组和集合的时候,遍历元素的时候经常会用到循环的结构,Java具有非常灵活的三种循环机制: ?...,而do...while循环至少会把循环体执行一次。...日常中使用的最多的for循环,由于普通for循环可以准确的控制循环的次数,所以一般当我们在需要手动控制循环次数的时候,我们会使用普通for循环 for(定义初始变量;判断条件;变量变化){ 循环体...跳出循环的两个关键字 我们在使用的过程中,如果遇到需要中断一个流程的情况,通常会使用到以下两个关键字:break和continue。...作用是让程序立刻跳转到下一次循环的迭代。在 for 循环中,continue 语句使程序立即跳转到更新语句。在 while 或者 do…while 循环中,程序立即跳转到布尔表达式的判断语句。

    39330

    【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)

    解决的办法是把链接结构“循环化”,即把表尾结点的next域存放指向哨位结点的指针,而不是存放空指针NULL,这样的单链表被称为循环链表。循环链表使用户可以从链表的任何位置开始,访问链表中的任意结点。...使用 do-while 循环遍历链表,打印当前节点的数据,然后将指针移动到下一个节点,直到回到头节点为止。 h....定义两个指针 currNode 和 nextNode currNode 指向当前节点,初始时指向头节点 nextNode指向下一个节点,初始为 NULL 使用 while 循环遍历链表,将 nextNode...通过调用 insert 函数,在循环链表中插入了四个节点,其数据分别为 10、20、30 和 40。...printf("删除节点后的循环链表: "); printList(head); // 在循环链表中查找节点 Node* searchResult = search(

    10510

    Java程序员面试之HashMap

    介绍 JAVA中的基础HashMap在工作中使用的频率极高。相信很多同学在平时面试的时候经常被问到晕,今天我们来聊一下HashMap中常见的面试题吧!...java1.7中HashMap是由数组+链表组成的。1.8之后加了红黑树。 当链表大于8并且容量超过64时。链表就会变成红黑树。 如图所示: ?...HashTabel为什么线程安全? HashMap是线程不安全的,而Hashtable是线程安全的,因为它的所有CRUD操作都被synchronized修饰,这种实现是十分缓慢的。...HashMap死循环分析 以 JDK 1.7 为例,假设 HashMap 默认大小为 2,原本 HashMap 中有一个元素 key(5),我们再使用两个线程:t1 添加元素 key(3),t2 添加元素...key(7),当元素 key(3) 和 key(7) 都添加到 HashMap 中之后,线程 t1 在执行到 Entry next = e.next; 时,交出了 CPU 的使用权,源码如下

    30620

    HashMap 底层实现原理是什么?JDK8 做了哪些优化?

    在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构,它的组成结构如下图所示...那加载因子为什么是 0.75 而不是 0.5 或者 1.0 呢?...= null); } } return null; } 从以上源码可以看出,当哈希冲突时我们需要通过判断 key 值是否相等,才能确认此元素是不是我们想要的元素。...2.HashMap 死循环分析 以 JDK 1.7 为例,假设 HashMap 默认大小为 2,原本 HashMap 中有一个元素 key(5),我们再使用两个线程:t1 添加元素 key(3),t2...添加元素 key(7),当元素 key(3) 和 key(7) 都添加到 HashMap 中之后,线程 t1 在执行到 Entry next = e.next;时,交出了 CPU 的使用权,源码如下

    41470

    【数据结构】C语言实现带头双向循环链表万字详解(附完整运行代码)

    一.了解项目功能 在本次项目中我们的目标是实现一个带头双向循环链表: 该带头双向循环链表使用动态内存分配空间,可以用来存储任意数量的同类型数据......while循环的终止条件,以及switch语句的运行条件 do //使用do...while实现 { LTMenu(); scanf...因为后续我们要使用的带头双向循环链表按位插入和按位删除都需要知道用户传入的链表元素在链表中的位置在哪,因此我们把查找链表元素位置的操作封装成一个单独的函数,后续需要查找某一链表元素的位置直接调用这个函数就行...因为我们在删除链表元素前都需要先判断一下链表当前是不是为空,如果链表为空那就不要再进行删除操作了,因为尾删,头删,指定元素删除都需要判空操作,所以我们不如封装一个函数,在调用时判断当前链表是否为空,......while循环的终止条件,以及switch语句的运行条件 do //使用do...while实现 { LTMenu(); scanf

    23110

    怎么样才算是精通 Python?

    时间复杂度 我们都知道,在Python里面list是异构元素的集合,并且能够动态增长或收缩,可以通过索引和切片访问。那么,又有多少人知道,list是一个数组而不是一个链表。...在写Python代码的时候,如果你需要一个链表,你应该使用标准库collections中的deque, deque是双向链表。标准库里面有一个queue,看起来和deque有点像,它们是什么关系?...一个在while循环或for循环中: while True: .... else: .......注意我们前面的用语,是否则,也就是说,else语句在我们固有的观念中,起到的作用是“否则”,是不满足条件的情况下才执行的。 我们来看Python中,while循环后面的else语句。...也就是说,在Python中,while循环末尾的else换做and才是更加合适的。

    2.4K91

    【数据结构】C语言实现单链表万字详解(附完整运行代码)

    ,因此选择do...while的循环语句来实现这一部分的逻辑....int swi = 0; // 创建变量swi作为do...while循环的终止条件,以及switch语句的运行条件 do // 使用do...while实现单链表可循环使用 {...因为后续我们要使用的单链表按位插入和按位删除都需要知道用户传入的链表元素在链表中的位置在哪,因此我们把查找链表元素位置的操作封装成一个单独的函数,后续需要查找某一链表元素的位置直接调用这个函数就行....注意,查找只需要遍历链表,而不需要改变链表内容,因此我们传给函数链表的一级头指针即可,函数的参数还应该接收待查找的结点的数据域,以便我们在遍历链表的过程中能够找到它.......while循环的终止条件,以及switch语句的运行条件 do //使用do...while实现 { SLTMenu(); scanf

    48510

    Python 为什么不设计 do-while 循环结构?

    在回答这个问题之前,让我们再仔细思考一下 do-while 语法可以解决什么问题,看看使用这种结构能带来什么好处? 最显而易见的好处是:do-while 语法保证了会先执行一遍循环体代码。...这种写法主要用在宏函数的定义中,可以解决宏代码块的编译问题,使代码按照我们的意图而合理分块。 另外,do {...} while (0) 结合 break 使用,还可以实现很优雅的跳转控制效果。...分析完 do-while 的好处后,让我们回到主题:Python 为什么不需要设计 do-while 循环语法呢?...expression ":" suite ["else" ":" suite] (PS.在本系列的下一篇文章,我们将解释为什么 Python 要支持 while-else 语法)...也就是说,在保持原 while 循环语法不变的情况下,PEP-315 提议支持在 while 前面使用一个可选的 do 子句。

    1.2K10

    Java高频面试之集合篇

    2个子链表 do { // 为了在while条件中用 next =...为了利用&运算计算节点在数组中的下标 HashMap 多线程死循环问题? HashMap 的 get 方法能否判断某个元素是否在 map 中?...&运算求key在数组中的下标 求索引的时候为什么是:h&(length-1),而不是 h&length,更不是 h%length h%length 效率不如位运算快 h&length hash碰撞多,会导致...0.75,并且不推荐我们修改 为什么加载因子的默认值是 0.75,并且不推荐我们修改 如果loadFactor太小,那么map中的table需要不断的扩容,扩容是个耗时的过程 如果loadFactor...太大,那么map中table放满了也不不会扩容,导致冲突越来越多,解决冲突而起的链表越来越长,效率越来越低 而 0.75 这是一个折中的值,是一个比较理想的值

    7410

    算法与数据结构(二):链表

    链表的每个节点在内存中不是连续的,所以它不能像数组那样根据下标来访问(当然可以利用C++中的运算符重载来实现使用下标访问),链表中的每一个节点都保存了下一个节点的地址,所以我们根据每个节点指向的下一个节点来依次访问每个节点...链表的每个节点都是在堆上分配的,在不再使用的时候需要手工清除每个节点。...在链表中找到比新节点值更大的节点,这种情况下,在链表中插入 但是在代码中并没有考虑到尾部插入的情况,由于在尾部插入时,r等于尾节点,r->pNext 的值为NULL, 所以 p->pNext = r-...循环链表 循环链表是建立在单向链表的基础之上的,循环链表的尾节点并不指向空,而是指向其他的节点,可以是头结点,可以是自身,也可以是链表中的其他节点,为了方便操作,一般将循环链表的尾节点的next指针指向头节点...根据这种情形我们可以考虑使用这样一种办法:定义两个指针,一个一次走两步也是就是p = p->next->next, 一个慢指针一次走一步,也就是q = q->next,如果是循环链表,那么快指针在某个时候一定会领先慢指针一周

    60220

    java多线程并发之旅-14-lock free queue 无锁队列

    = TRUE); //如果没有把结点链在尾指针上,再试 CAS(tail, p, q); //置尾结点 } 我们可以看到,程序中的那个 do- while 的 Re-Try-Loop。...你会看到,为什么我们的“置尾结点”的操作(第12行)不判断是否成功,因为: 如果有一个线程T1,它的while中的CAS如果成功的话,那么其它所有的 随后线程的CAS都会失败,然后就会再循环,...而不是整个数据结构。 无锁队列的改良版本 V1.0.0 上面的文章给出了一种链表无锁队列的实现。其中对ABA和double CAS等现象都进行了分析。...在LockFreeQueue中,所有的线程都是对资源进行申请后再使用,一个线程若申请到了资源(这里的资源主要指环形队列中的内存槽位),就会立即使用,并且在使用完后释放掉该资源。...当队列中有元素时,A总能申请到这个元素并且执行到弹出操作,而B则只能在DeQueue函数的while循环中一直循环下去。 一些优化 对LockFreeQueue可以进行一些优化。

    93210

    一文吃透hashmap的前世与今生

    :对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n) 3.二叉树:对一棵相对平衡的有序二叉树,对其进行插入..., //因为立即删掉的是it迭代器中的,第二次循环进入后重新获取长度,这也是 //为什么要使用迭代器删除的原因 System.out.println(map.toString...如果数组长度小于最小树化容量(默认数组大小为64时),则优先使用数组扩容,而不是采用转换红黑树节点 if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY...= null) hd.treeify(tab); } } 树化方法有一个很关键的点 如果数组长度小于最小树化容量(默认数组大小为64时),则优先使用数组扩容,而不是采用转换红黑树节点...将会让数组的长度扩大至当前容量的2倍,数组与链表上的节点进行重新hash计算,使用尾插法的形式,避免了在resize的过程中在JDK1.7Hashmap中会出现的环形链表情况。

    28420
    领券