当前位置: 首页 > 知识库问答 >
问题:

java线程Hibernate解析和等待同步块

苏承载
2023-03-14

我想更多地了解线程睡眠解析是如何工作的,以及它与睡眠()解析之外的内容有什么联系。

我知道它是由操作系统定义的,而在Windows上通常是15ms。我最近环顾四周无法确认这一点,但我依稀记得这个15ms是由操作系统循环的,并且对所有线程都是“全局的”,这意味着15ms不是线程可以Hibernate的最短时间,而是最大Hibernate时间(1)。对吗?所有操作系统都一样吗(超过持续时间)?

我想不出这很重要的情况,但是线程的虚假唤醒是否总是发生在这个睡眠周期的动作点,或者它可能随时发生?

在同步块上,等待线程是否在每个周期有效地Hibernate(1)并检查锁,或者退出块的线程是否立即唤醒等待线程?这对所有操作系统都一样吗?

当线程在 wait() 之后被 notify()-ed 时,在等待锁定时,它会以与上面相同的方式处理,还是以不同的方式处理?

从性能角度来看,15ms循环是否还有其他时间是相关的?

共有2个答案

班承恩
2023-03-14

< code>Thread.sleep()的实现取决于操作系统。

睡眠的粒度通常受到线程调度器的中断周期的限制。在Linux中,这个中断周期在最近的内核(2.6.8以后)中通常是1ms。在Windows中,调度程序的中断周期通常在10或15毫秒左右(我相信这是由处理器决定的),但是在软件中可以请求更长的周期,Hotspot JVM会在它认为必要时这样做。

洪楷
2023-03-14

您需要对多线程内核进行一些研究。

线程的虚假唤醒会一直发生在这个睡眠周期的动作点,还是会随时发生?

没有虚假的sleep()唤醒或者任何内核同步对象在Windows上等待——根本没有。任何这样的趋势都已经在内核中设计好了,不会传播到用户线程。

如果线程正在Hibernate或等待某个同步对象(如互斥锁或信号量锁),则它根本不会运行 - 它只是内核中队列上的死“线程描述符对象”,因此所有与线程相关的东西,堆栈的数据空间等。在睡眠的情况下,TDO 位于所有超时线程的“增量队列”上,按唤醒时间排序,操作系统每 15 毫秒检查一次此队列开头的项目。在定时锁定等待的情况下,TDO 位于两个队列上 - 超时队列和锁拥有的队列。TDO 将到达计时器队列的头部并在其间隔结束时准备就绪,或者另一个线程将释放锁并使线程准备就绪。无论哪个先到达那里,都会获胜,并且TDO将从另一个队列中删除。然后,新就绪的线程将加入就绪线程集,如果内核可用或可以抢占优先级较低的线程,则将新就绪的线程调度到内核上。

因此,Windows上的“15毫秒”是由所有线程共享的。Windows是一个桌面操作系统,15毫秒超出了人类的直接感知,因此99.9%的家庭线程都不在乎,因为它们只需要很长的超时,正在等待I/O,正在等待一些线程间通信锁或它们的某种组合。

“从性能的角度来看,15ms循环还有其他时间吗?”

不多。计时器重新安排的副作用是,如果最高优先级的可运行线程集大于可用于运行它们的内核数,则该集以循环方式运行,因为这些线程的列表是轮换的。这仅与定期过载的机器相关,并且大多数线程仅使用计时器间隔来超时其他阻塞系统调用

 类似资料:
  • 我最近阅读了有关async/await的文章,我感到困惑的是,我阅读的许多文章/帖子都指出,在使用async await(示例)时不会创建新线程。 我创建了一个简单的控制台应用程序来测试它 以下代码的输出是: 我想知道,如果没有创建其他线程,部分在哪里运行?如果它运行在同一个线程上,难道它不应该因为长的I/O请求而阻塞它吗?或者编译器足够聪明,如果它需要太长的时间,就可以将该操作移到另一个线程上,

  • 如果该线程在选择器中被阻塞,那么该线程的中断状态将被设置,并且它将立即从选择操作中返回,可能使用一个非零值,就像调用了选择器的wakeup方法一样。 如果前面的条件都不成立,那么该线程的中断状态将被设置。 中断不活动的线程不需要有任何影响。 我在Windows10 x64上用JDK10运行我的代码。

  • 我试图更好地理解Java多线程。所以,我知道这句话说只有一个线程可以访问一个对象实例,从而调用该实例的方法(例如,在这种情况下,类 中的减方法。 但是,当你仍然有相同的 会发生什么,但两个线程与不同的 相关联,完全试图调用 的方法?我以为不的消息永远不会被打印出来,但它确实打印出来了。毕竟,仍然只有一个对象实例 ,这是否意味着同步不适用于此示例?

  • 问题内容: 我有以下情况: 为了运行算法,我必须运行多个线程,并且每个线程都会在死之前设置一个实例变量x。问题是这些线程不会立即返回: 我应该使用等待通知吗?还是我应该嵌入一个while循环并检查是否终止? 感谢大家! 问题答案: 创建一些共享存储来保存每个线程的值,或者如果足够的话,只存储总和。使用a 等待线程终止。每个线程完成后都会调用,您的方法将使用该方法来等待它们。 编辑: 这是我建议的方

  • 本文向大家介绍Java 线程同步详解,包括了Java 线程同步详解的使用技巧和注意事项,需要的朋友参考一下 Java 线程同步根本上是要符合一个逻辑:加锁------>修改------>释放锁 1、同步代码块 示例如下: 示例中希望按照顺序依次输出整数。 通常同步代码块是需要锁定的对象,一般是需要并发访问的共享资源,任何线程在修改指定资源之前都首先对该资源加锁,在加锁期间其它线程无法修改该资源。从

  • 问题内容: 如果一个块上有多个线程在等待,并且锁变为可用,谁先走?是按线程优先级(然后是先到先得)进行吗? 并且是否适用相同的规则(带有多个ing线程)? 问题答案: 根据这个家伙的说法:http : //tutorials.jenkov.com/java-concurrency/starvation-and- fairness.html Java对顺序不做任何保证。所以我想这不是基于线程优先级的